Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 788fa6d8

Přidáno uživatelem horkym před asi 7 roky(ů)

#6351: Ulozeni dat do databaze

Pridan hlavni skript pro spusteni zpracovani dat z minuleho dne (cron.php). Pridana funkce pro pripravu dat o lokacich a o doprave pro ulozeni do databaze (process_traffic_matrix.php). Pridany funkce pro ulozeni dat do databaze (dao.php).

Zobrazit rozdíly:

cron/cron.php
1
<?php
2

  
3
require_once "dao/dao.php";
4
require_once "db/db-web.php";
5
require_once "parser.php";
6
require_once "process_traffic_matrix.php";
7

  
8
function cron() {
9
    $dbh = new DB_WEB();
10
    $DAO = new DAO();
11
    $DAO->setDB($dbh);
12
    
13
    $date = new DateTime();
14
    $date->modify("-1 day");
15
    
16
    if ($DAO->controlTrafficData($date->format("Y-m-d"))) {
17
        $parser = new Parser();
18
        $parser->doWork($date->format("Ymd"));
19
        
20
        $traffic = $parser->getTraffic();
21
        $locations = $parser->getLocations();
22
        
23
        $DAO->insertVehicles(); // Pokud nejsou typy vozidel v tabulce - pridat.
24
        
25
        // Pridat udaje o novych zarizenich.
26
        foreach ($locations as $l) {
27
            $DAO->insertLocationData($l);
28
        }
29
        
30
        // Pridat zaznamy z vybraneho dne.
31
        $insertRTT = array();
32
        $insertRT = array();
33
        process_traffic_matrix($parser, $traffic, $DAO->findFirstId("zaznam_cas"), $DAO->findFirstId("zaznam"), $insertRTT, $insertRT, $date->format("Y-m-d"));
34
        $DAO->insertTrafficData($insertRTT, $insertRT);
35
    }
36
}
37

  
38
?>
cron/dao/dao.php
1 1
<?php
2 2

  
3 3
require_once "db/db-web.php";
4
require_once "location.php";
4 5

  
5 6
class DAO {
6 7
  
7 8
    protected $dbh;
8
    
9
  
9 10
    public function setDB($dbh) {
10 11
        $this->dbh = $dbh;
11 12
    }
12 13
    
14
    public function insertVehicles() {
15
        $query = "SELECT COUNT(*) AS total FROM vozidla";
16
        $stmt = $this->dbh->executeQuery($query);
17
        
18
        if ($stmt->fetchAssoc()["total"] < 1) {
19
            // Pokud v tabulce s vozidlama neni zadny zaznam, pridat vsechny moznosti.
20
            $query = "INSERT INTO vozidla (id, nazev) VALUES ";
21
            $query .= "('0', 'Neznámé vozidlo'), ";
22
            $query .= "('1', 'Motocykl'), ";
23
            $query .= "('2', 'Auto'), ";
24
            $query .= "('3', 'Auto s přívěsem'), ";
25
            $query .= "('4', 'Dodávka'), ";
26
            $query .= "('5', 'Dodávka s přívěsem'), ";
27
            $query .= "('6', 'Lehký nákladní automobil'), ";
28
            $query .= "('7', 'Lehký nákladní automobil s přívěsem'), ";
29
            $query .= "('8', 'Nákladní automobil'), ";
30
            $query .= "('9', 'Nákladní automobil s přívěsem'), ";
31
            $query .= "('10', 'Autobus');";
32
            $stmt = $this->dbh->executeQuery($query);
33
        }
34
    }
35
    
36
    public function controlTrafficData($dateStr) {
37
        $dateTo = new DateTime($dateStr);
38
        $dateTo->modify("+1 day");
39
        $query = "SELECT COUNT(*) AS total FROM zaznam_cas WHERE datetime_od >= '$dateStr' AND datetime_od < '".$dateTo->format('Y-m-d')."';";
40
        $stmt = $this->dbh->executeQuery($query);
41
        return $stmt->fetchAssoc()["total"] < 1;
42
    }
43
    
44
    public function insertTrafficData($insertRTT, $insertRT) {
45
        for ($i = 0; $i < 2; $i++) {
46
            $query = "";
47
            $values = "";
48
            $counter = 0;
49
            $array = NULL;
50
            
51
            if ($i == 0) {
52
                $query = "INSERT INTO zaznam_cas VALUES ";
53
                $array = &$insertRTT;
54
            } else {
55
                $query = "INSERT INTO zaznam VALUES ";
56
                $array = &$insertRT;
57
            }
58
            
59
            for ($j = 0; $j < count($array); $j++) {
60
                $values .= $array[$j].", ";
61
                $counter++;
62
                if ($counter == 500 || $j == (count($array) - 1)) {
63
                    $query_ = $query.substr($values, 0, strlen($values) - 2).";";
64
                    $stmt = $this->dbh->executeQuery($query_);
65
                    
66
                    $values = "";
67
                    $counter = 0;
68
                }
69
            }
70
        }
71
    }
72
    
73
    public function insertLocationData($location) {
74
        
75
        // --- Kontrola, zda je mesto v tabulce, pripadne jeho pridani. ---
76
        
77
        $townId = $this->conditionalInsertion($location, "mesto", -1);
78
        
79
        // --- Kontrola, zda je ulice v tabulce, pripadne jeji pridani. ---
80
        
81
        $streetId = $this->conditionalInsertion($location, "ulice", $townId);
82
        
83
        // --- Kontrola, zda je zarizeni v tabulce, pripadne jeho pridani. ---
84
        
85
        $query = "SELECT * FROM zarizeni WHERE id='".$location->device."';";
86
        $stmt = $this->dbh->executeQuery($query);
87
        
88
        if (!($stmt->fetchAssoc())) {
89
            // Zarizeni se v tabulce jeste nenachazi.
90
            $query = "INSERT INTO zarizeni VALUES ('".$location->device."', '".$location->name."', '0', '$streetId');";
91
            $stmt = $this->dbh->executeQuery($query);
92
        }
93
        
94
    }
95
    
96
    // Pro mesta a ulice.
97
    private function conditionalInsertion($location, $table, $townId) {
98
        $query = "SELECT id FROM $table WHERE nazev=";
99
        if ($townId < 0) {
100
            // Hledame mesto.
101
            $query .= "'".$location->town."';";
102
        } else {
103
            // Hledame ulici (s odkazem na konkretni mesto - ruzna mesta mohou mit shodny nazev nejake ulice).
104
            $query .= "'".$location->street."' AND mesto_id='$townId';";
105
        }
106
        $stmt = $this->dbh->executeQuery($query);
107
        
108
        $id = -1;
109
        if ($row = $stmt->fetchAssoc()) {
110
            // Zaznam uz je v tabulce.
111
            $id = $row["id"];
112
        } else {
113
            // Zaznam se v tabulce jeste nenachazi - nalezeni id pro novy zaznam.
114
            $id = $this->findFirstId($table);
115
            
116
            $query = "INSERT INTO $table VALUES ";
117
            if ($townId < 0) {
118
                $query .= "('$id', '".$location->town."');";
119
            } else {
120
                $query .= "('$id', '".$location->street."', '$townId');";
121
            }
122
            
123
            // Vlozeni zaznamu do tabulky.
124
            $stmt = $this->dbh->executeQuery($query);
125
        }
126
        
127
        return $id;
128
    }
129
    
130
    public function findFirstId($table) {
131
        $query = "SELECT id FROM $table ORDER BY id DESC LIMIT 1;";
132
        $stmt = $this->dbh->executeQuery($query);
133
        
134
        $id = -1;
135
        if ($row = $stmt->fetchAssoc()) {
136
            // V tabulce je vice zaznamu.
137
            $id = $row["id"] + 1;
138
        } else {
139
            // Tabulka je prazdna.
140
            $id = 1;
141
        }
142
        
143
        return $id;
144
    }
145
    
13 146
}
14 147

  
15 148
?>
cron/parser.php
6 6
class Parser {
7 7
    
8 8
    // Pro data o doprave - na kolik intervalu se ma rozdelit den (96 = 4 * 24 => intervaly po ctvrt hodine).
9
    private $HOW_MANY_INTERVALS = 96;
9
    public $HOW_MANY_INTERVALS = 96;
10 10
    
11 11
    // Pro data o doprave - jak dlouho v milisekundach trva jeden interval.
12
    private $intervalMilli;
12
    public $intervalMilli;
13 13
    
14 14
    private $name;
15 15
    private $path;
cron/process_traffic_matrix.php
1
<?php
2

  
3
function process_traffic_matrix($parser, $traffic, $idRecordTimeTable, $idRecordTable, &$insertRTT, &$insertRT, $date) {
4
    $times = array();
5
    
6
    for ($i = 0; $i < $parser->HOW_MANY_INTERVALS; $i++) {
7
        $times[$i] = array();
8
        $times[$i][0] = new DateTime($date);
9
        $times[$i][1] = new DateTime($date);
10
        
11
        $fromSec = (int) (($i * $parser->intervalMilli) / 1000);
12
        $toSec = (int) (($i + 1) * $parser->intervalMilli / 1000);
13
        
14
        $fromHours = (int) ($fromSec / 3600);
15
        $fromMinutes = (int) (($fromSec - $fromHours * 3600) / 60);
16
        $fromSeconds = (int) ($fromSec - $fromHours * 3600 - $fromMinutes * 60);
17
        
18
        $toHours = (int) ($toSec / 3600);
19
        $toMinutes = (int) (($toSec - $toHours * 3600) / 60);
20
        $toSeconds = (int) ($toSec - $toHours * 3600 - $toMinutes * 60);
21
        
22
        $times[$i][0]->setTime($fromHours, $fromMinutes, $fromSeconds);
23
        $times[$i][1]->setTime($toHours, $toMinutes, $toSeconds);
24
    }
25
    
26
    foreach ($traffic as $device => $timeIntervals) {
27
        for ($t = 0; $t < $parser->HOW_MANY_INTERVALS; $t++) {
28
            if ($timeIntervals[$t] != NULL) {
29
                for ($d = 0; $d < 2; $d++) {
30
                    $dataExists = FALSE;
31
                    
32
                    for ($v = 0; $v < 11; $v++) {
33
                        if ($timeIntervals[$t][$d][$v][0] > 0) {
34
                            $dataExists = TRUE;
35
                            $insertRT[] = "('".$idRecordTable++."', '".$timeIntervals[$t][$d][$v][0]."', '".($timeIntervals[$t][$d][$v][1] / $timeIntervals[$t][$d][$v][0])."', '$v', '$idRecordTimeTable')";
36
                        }
37
                    }
38
                    
39
                    if ($dataExists) {
40
                        $insertRTT[] = "('".$idRecordTimeTable++."', '".$times[$t][0]->format("Y-m-d H:i:s.u")."', '".$times[$t][1]->format("Y-m-d H:i:s.u")."', '".($d + 1)."', '$device')";
41
                    }
42
                }
43
            }
44
        }
45
    }
46
}
47

  
48
?>

Také k dispozici: Unified diff