Wat voor optimalisatie voert zo'n class dan uitquote:Op dinsdag 2 december 2008 20:02 schreef Chandler het volgende:
GlowMouse melde mij dat het in mijn geval voor het optimaliseren van een database zeer handig is om te werken met database classes!
Caching?quote:Op dinsdag 2 december 2008 21:40 schreef Roy_T het volgende:
[..]
Wat voor optimalisatie voert zo'n class dan uit
Een databaseklasse maakt het bijvoorbeeld makkelijk om dmv transacties een aantal queries te verzamelen en gezamelijk uit te voeren, waardoor je je database efficiënter kunt gebruiken. Dat is althans wat er in de documentatie van PDO staat:quote:Op dinsdag 2 december 2008 21:40 schreef Roy_T het volgende:
[..]
Wat voor optimalisatie voert zo'n class dan uit
quote:Transactions are typically implemented by "saving-up" your batch of changes to be applied all at once; this has the nice side effect of drastically improving the efficiency of those updates. In other words, transactions can make your scripts faster and potentially more robust (you still need to use them correctly to reap that benefit).
Dat kan ja. En transacties zou ook kunnen (indien i.c.m. MySQL: niet op MyISAM tabellen). Maar er is geen gouden regel die zegt dat database classes dat "dus" kunnen en voor enige optimalisatie zorgen. Dat was eigenlijk ook het punt van mijn retorische vraag: het is maar net wat je erin bakt.quote:
Zelfs als ik niet in cakephp bezig ben gebruik ik classes om me databases aan te roepenquote:Op dinsdag 2 december 2008 22:58 schreef Roy_T het volgende:
Chandler, dan moet je dus wel specifiek zoeken naar een class die goede benchmarking info biedt. Niet iedere class is hier even sterk in. "Wie kent een database class?" komt neer op het zoeken naar een rode auto die binnen 8 seconden aan de 100 km/uur zit, en vervolgens bij een autohandelaar vragen of 'ie "een auto" te koop heeft staan
mysql_query() direct aanroepen, zijn er nog mensen die dat doen? Gebruikt nog niet iedereen (MVC-)frameworks en (ActiveRecord-achtige) database classes?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | error_reporting(E_ALL); class MySQL { // variables var $db; var $query; var $queryres; var $data; // statistics var $query_cnt; var $fetch_cnt; var $insert_cnt; var $result_cnt; var $num_rows_cnt; var $affected_rows_cnt; function connect($user, $pass, $database, $host = 'localhost', $error = 'Site kan geen verbinding maken met MySQL database in functie :: connect()') { // Connectie leggen $this->db = mysql_connect($host, $user, $pass ); // Kijken of de connectie gelukt is, en of de database geselecteerd kon worden if(!$this->db || !mysql_select_db($database, $this->db)) { $this->m_error("DB Connect", mysql_error()); die($error); } } function disconnect() { // $res legen if(!@mysql_free_result($this->queryres)) { unset($this->queryres); } // Verbinding sluiten mysql_close($this->db); } function run_query($sql, $noCache = false) { if ($noCache == true) { mysql_query($sql, $this->db); $this->query_cnt++; } else { $this->query = $sql; $this->queryres = mysql_query($sql, $this->db); $this->query_cnt++; } if (!$this->queryres && $noCache != true) { $this->m_error($this->query, mysql_error()); die('Error in query: <br /><strong>Query:</strong> <hr>' . $this->query . '<hr><strong>MySQL error:</strong> ' . mysql_error() . '<hr>'); } } function num_rows($sql = NULL) { if ($sql != NULL) { $this->query = $sql; $this->run_query($sql); $this->num_rows_cnt++; return mysql_num_rows($this->queryres); } elseif ($this->queryres && $this->query == $sql) { $this->num_rows_cnt++; return mysql_num_rows($this->queryres); } elseif ($this->query != $sql) { $this->query = $sql; $this->run_query($sql); $this->num_rows_cnt++; return mysql_num_rows($this->queryres); } else { $this->m_error($this->query, mysql_error()); die('Geen query uitgevoerd voor functie :: num_rows()'); } } function fetch_object($sql = NULL) { if ($this->queryres && $sql == NULL) { $this->fetch_cnt++; return mysql_fetch_object($this->queryres); } elseif($sql != NULL) { $this->query = $sql; $this->run_query($sql); $this->fetch_cnt++; return mysql_fetch_object($this->queryres); } else { $this->m_error($this->query, mysql_error()); die('geen query uitgevoerd voor functie :: fetch_object()'); } } function insert_id($sql = NULL) { // Kijken of er een query meegegeven is, zo ja uitvoeren if ($sql != NULL) { $this->run_query($sql); } elseif ($sql == NULL && !$this->queryres) { $this->m_error($sql, mysql_error()); die('Geen query uitgevoerd voor functie :: insert_id()'); } $this->insert_cnt++; // Mysql_insert_id uitspugen return mysql_insert_id($this->db); } function affected_rows($sql = NULL) { // Kijken of er een query meegegeven is, zo ja uitvoeren if ($sql != NULL) { $this->run_query($sql); } elseif ($sql == NULL && !$this->queryres) { die('Geen query uitgevoerd voor functie :: affected_rows()'); } $this->affected_rows_cnt++; // Mysql_insert_id uitspugen return mysql_affected_rows($this->db); } function result($row = 0, $sql = NULL, $noCache = false) { // Kijken of er een query meegegeven is, zo ja uitvoeren if ($sql != NULL) { if ($noCache != false) { $tmpres = mysql_query($sql, $this->db); $this->query_cnt++; } else { $this->run_query($sql); } } elseif ($sql == NULL && !$this->queryres) { $this->m_error($sql, mysql_error()); die('Geen query uitgevoerd voor functie :: result()'); } $this->result_cnt++; // Mysql_insert_id uitspugen if ($noCache != false) { $res = @mysql_result($tmpres, $row); } else { $res = @mysql_result($this->queryres, $row); } if ($res == null) { return "0"; } else { return $res; } } function m_error($string, $error) { $buf = "Error in MySQL\r\n -----------------------\r\n Query: -----------------------\r\n" . $string . "\r\n -----------------------\r\n Error: -----------------------\r\n" . $error . "\r\n -----------------------\r\n"; $fd = fopen("mysql_error.txt", "w+"); fputs($fd, $buf); fclose($fd); } function stats() { return array("queries" => (($this->query_cnt == 0) ? "0" : $this->query_cnt), "fetch" => (($this->fetch_cnt == 0) ? "0" : $this->fetch_cnt), "insert" => (($this->insert_cnt == 0) ? "0" : $this->insert_cnt), "result" => (($this->result_cnt == 0) ? "0" : $this->result_cnt), "num_rows" => (($this->num_rows_cnt == 0) ? "0" : $this->num_rows_cnt), "affected_rows" => (($this->affected_rows_cnt == 0) ? "0" : $this->affected_rows_cnt)); } } ?> |
Zelfde geld voor de functiesquote:Op woensdag 3 december 2008 11:52 schreef Spike1506 het volgende:
@Chandler Gebruik ipv var $var eens, private/proteced/public $var's enz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function customexplode($invoer) { $uitnr=0; $startpos=0; do { preg_match('/[^\',][^,\']*|\'([^\'\\\\]|\\\\.)*\'/', substr($invoer, $startpos), $matches, PREG_OFFSET_CAPTURE); if (count($matches)>0) { $t = $matches[0][0]; if (substr($t,0,1)=="'") $t=substr($t,1,strlen($t)-2); $uitvoer[$uitnr]=$t; $startpos += $matches[0][1] + strlen($matches[0][0]); $uitnr++; } } while (count($matches)>0); return $uitvoer; } ?> |
Mag ik vragen waarom? scheelt dit in preformance?quote:Op woensdag 3 december 2008 11:52 schreef Spike1506 het volgende:
@Chandler Gebruik ipv var $var eens, private/proteced/public $var's enz.
Zelfde vraag ;)quote:
1 2 3 4 5 6 7 8 | `stat_id` int(10) unsigned NOT NULL, `ip_id` int(10) unsigned NOT NULL, `referer_id` int(10) unsigned NOT NULL, `hits` int(10) unsigned NOT NULL, `lastdate` timestamp NULL default NULL, UNIQUE KEY `stat_id_2` (`stat_id`,`ip_id`,`referer_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; |
Het heeft o.a te maken met de toegankelijkheid van deze variablen/functies. Zie ook: Visibility @ PHP.net.quote:Op woensdag 3 december 2008 14:37 schreef Chandler het volgende:
[..]
Mag ik vragen waarom? scheelt dit in preformance?
[..]
Zelfde vraag
dit zou ik niet met regex doenquote:Op woensdag 3 december 2008 14:08 schreef Igen het volgende:
Stel, ik heb een aantal waarden die met komma's gescheiden zijn. Er kunnen ook strings bij zitten, die hebben dan aanhalingstekens eromheen. Bijvoorbeeld:
1,87932,'hoi, dit is een test','It\'s backslash (\\)',328,0
Nu wil ik die waarden van elkaar scheiden. Daarvoor heb ik de volgende functie gemaakt:
[ code verwijderd ]
Maar als ik die nu loslaat op een regel waarin een van de stukjes tekst tientallen kb's groot is, dan crasht PHP. Ik heb inmiddels begrepen dat dat met recursie in PCRE te maken heeft. Ik zit dus met de volgende vragen:
- Kan ik de maximale recursiediepte nu beperken naar een veilige waarde, of werkt de reguliere expressie dan niet meer goed?
- Kan je de reguliere expressie ook beter formuleren?
1 2 3 4 5 6 7 8 | function customexplode($invoer) { $return = array(); eval('$return = array(' . $invoer . ');'); return $return; } ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function customexplode($invoer) { $currentstring=''; $result = array(); foreach( explode(',', $invoer) as $token) { if ($token{0} == '\'' || $currentstring != '') { $currentstring .= ',' . $token; if (substr($currentstring, -1) == '\'' && substr($currentstring,-2) !='\\\'' ) { $result[] = substr($currentstring, 2, -1); $currentstring=''; } } else $result[]=$token; } if ($currentstring !='') $result[]=substr($currentstring,2,-1); return $result; } ?> |
Waarom gebruik je niet de native CSV parse functies in PHP? fgetcsv() bijvoorbeeld.quote:Op woensdag 3 december 2008 14:08 schreef Igen het volgende:
Stel, ik heb een aantal waarden die met komma's gescheiden zijn. Er kunnen ook strings bij zitten, die hebben dan aanhalingstekens eromheen. Bijvoorbeeld:
1,87932,'hoi, dit is een test','It\'s backslash (\\)',328,0
Nu wil ik die waarden van elkaar scheiden.
Ik gok dat die functie zich verslikt in iets als 123,'hoi\\',456.quote:Op woensdag 3 december 2008 17:38 schreef ralfie het volgende:
[..]
Mooiere oplossing (ook zonder regex)
[ code verwijderd ]
(niet getest overigens, maar zou zo volgens mij wel moeten werken)
Omdat fgetcsv() alleen op bestanden werkt, en str_getcsv() nog niet in een stabiele versie van PHP beschikbaar is.quote:Op woensdag 3 december 2008 21:42 schreef Roy_T het volgende:
[..]
Waarom gebruik je niet de native CSV parse functies in PHP? fgetcsv() bijvoorbeeld.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |