Php függvény többször fut le, mint kellene
Sziasztok!
Van egy táblám, amiben azt tárolom, melyik tábla melyik sora változott, így nem kell annyit kiolvasnom, csak ami változott. Amikor változás van, akár egy update, akár egy delete, vagy insert, az érintett táblák nevét és sorait átadom egy függvénynek, ami beirja az említett táblába a változást.
Erre a következőt használom:(Az emptyempty az persze csak empty!)
Vagyis átadom a query-t, amit végrehajt az adott függvény, majd megnézi, adtam-e át táblát és sort, amit ez a változás érintett.
Ha igen, akkor végigmegy a $tables és $rows tömbön (arra figyelek, hogy mindkettő ugyanannyi soros legyen), és létrehozza az insert query-t, az pedig átadott query-ként azt végrehajtja. Ott már nincs átadva $tables és $rows tömb, tehát a foreach nem fut le.
Egy próba query-t írtam, egy update-et, hogy lássam, működik-e.
A query a következő:A probléma az, hogy ez most egy lefrissítéskor 18szor fut le. Ennyi sort ad hozzá a táblámhoz. Fogalmam sincs, hogy hol lehet a hiba, de az a legfurcsább, hogy amikor kiiratom a $db_insert_cnt változót, azt írja, egyetlen insert futott le. Az oldal nem fut le 18szor, csak az insert, és azt sem számolja. Nem tudok mire gondolni.
■ Van egy táblám, amiben azt tárolom, melyik tábla melyik sora változott, így nem kell annyit kiolvasnom, csak ami változott. Amikor változás van, akár egy update, akár egy delete, vagy insert, az érintett táblák nevét és sorait átadom egy függvénynek, ami beirja az említett táblába a változást.
Erre a következőt használom:
class DataBase {
public $db_insert_cnt = 0;
public $db_update_cnt = 0;
public $db_delete_cnt = 0;
function mysql_update($query, $tables = '', $rows = '') {
mysql_query($query);
$GLOBALS['db_update_cnt']++;
if(!empty($tables)) {
foreach($tables as $tblsKEY=>$tblsVALUE) {
$insert_query = 'INSERT
INTO change_table
(CHL_TABLE, CHL_ROW, CHL_TIME)
VALUES
("'.$tblsVALUE.'","'.$rows[$tblsKEY].'","'.date('U').'")';
$this->mysql_insert($insert_query);
}
}
}
function mysql_insert($query, $tables = '', $rows = '') {
mysql_query($query);
$GLOBALS['db_insert_cnt']++;
if(!empty($tables)) {
foreach($tables as $tblsKEY=>$tblsVALUE) {
$insert_query = 'INSERT
INTO change_table
(CHL_TABLE, CHL_ROW, CHL_TIME)
VALUES
("'.$tblsVALUE.'","'.$rows[$tblsKEY].'","'.date('U').'")';
$this->mysql_insert($insert_query);
}
}
}
function mysql_delete($query, $tables = '', $rows = '') {
mysql_query($query);
$GLOBALS['db_delete_cnt']++;
if(!empty($tables)) {
foreach($tables as $tblsKEY=>$tblsVALUE) {
$insert_query = 'INSERT
INTO change_table
(CHL_TABLE, CHL_ROW, CHL_TIME)
VALUES
("'.$tblsVALUE.'","'.$rows[$tblsKEY].'","'.date('U').'")';
$this->mysql_insert($insert_query);
}
}
}
}
Vagyis átadom a query-t, amit végrehajt az adott függvény, majd megnézi, adtam-e át táblát és sort, amit ez a változás érintett.
Ha igen, akkor végigmegy a $tables és $rows tömbön (arra figyelek, hogy mindkettő ugyanannyi soros legyen), és létrehozza az insert query-t, az pedig átadott query-ként azt végrehajtja. Ott már nincs átadva $tables és $rows tömb, tehát a foreach nem fut le.
Egy próba query-t írtam, egy update-et, hogy lássam, működik-e.
A query a következő:
// PROBA UPDATE
$cs = new DataBase;
$tmp['update_tables'] = array('password');
$tmp['update_rows'] = array('1');
$cs->mysql_update('UPDATE password
SET PASS="password"
WHERE ADMIN_ID="1"',
$tmp['update_tables'],
$tmp['update_rows']);
Biztos?
Arról most inkább nem is írok, hogy nincsen semmilyen ellenőrzés berakva az oszlopok típusára nézve, illetve nincsennek escape-elve az adatbázisnak átadott adatok.
igen
A számlálókhoz nem tudtam mit használjak.
Nem az egész tábla utolsó frissítése érdekel, hanem az, hogy egy adott sora (egy adott emberhez vagy tartalomhoz tartozó mező) változott-e. Így nem kell az adott sort kiolvasnom ha nem muszáj.
Escapelni még bőven az adatbázisba irás előtt szoktam, pont a query-k összerakása előtt.
Igazából ezzel épp a lekérdezéseket akartam meggyorsitani, vagyis azt, hogy ne kelljen, ha nem muszáj.
Kicsit átírtam, hogy ne
UDPATE
és egyINSERT
futott le.Van, hogy nekem is csak
Pontosabban igyekeztem kiiktatni minden zavaró tényezőt, include-olt fájlokat, és amikor 2 fájlt kiszedtem, akkor nekem se futott le 18-szor, csak 1-szer. De ezek az include-olt fájlok nem tartalmaznak szinte semmit. Mindkét fájlban van 1-1 select, de semmi olyat nem találtam, ami ehhez kapcsolódna. Ezért gondoltam, hogy rosszul írtam meg a függvényeket.
Ráadásul, ha nincs változás az ellenőrző táblában azokhoz a táblákhoz kapcsolódóan, akkor azok a selectek sem futnak le.
Optimalizálás
DataBase::mysql_update
,DataBase::mysql_delete
illetveDataBase::mysql_insert
függvényeket, így nehéz bármit is mondani. Mindenesetre a fenti kóddal nem tudom reprodukálni a 18 beszúrást.local
Localban minden oké, egyszer fut csak le, még akkor is, ha az említett 2 fájl is hozzá van csapva.
A tárhelyen viszont jelen pillanatban frissítésenként 12szer fut le az insert.
Amúgy azért tettem globalba a számlálókat, mert máshogy nem tudom kiolvasni az értéküket. Most ahogy az optimalizálásod alapján átalakítottam a függvényeket, nem tudom kiolvasni a számlálók értékét.
Nem tudod kiolvasni?
oké
Egyelőre írtam a tárhelynek, hogy náluk van-e a probléma. Mert még az is lehet. Localban minden rendben zajlik le.
Szerintem rossz az elv