[ broker @ 06.11.2003. 21:42 ] @
| Nigde nisam mogao da nadjem gotovo kod koji izvrsava niz SQL komandi datih u jednom stringu, onako kako to radi mysql.exe pa sam na przinu napisao funkciju.
Pretpostavljam da ce jos nekome trebati.
Code:
//
// Izvrsi SQL skritu (niz SQL komandi datih u jednom stringu gde je
// znak ; na kraju svake komande). Vraca true (1) ako je skripta izvrsena
// uspesno a false ako je doslo do greske. Podaci o gresci se mogu dobiti
// pozivom funkcija mysql_errno() i mysql_error()
//
function mysql_exec_batch ($p_query) {
$query_split = preg_split ("/[;]+/", $p_query);
foreach ($query_split as $command_line) {
$command_line = trim($command_line);
if ($command_line != '') {
$query_result = mysql_query($command_line);
if ($query_result == 0) {
break;
};
};
};
return $query_result;
}
|
[ NetworkAdmin @ 10.11.2003. 09:21 ] @
zar to ne radi:
mysql_query($query);
[ Goran Rakić @ 10.11.2003. 16:06 ] @
probaj da uradiš:
mysql_query('SELECT * FROM test;SHOW TABLES;');
ne radi, zar ne ;)
E ovaj kod gore ti daje mogućnost da izvršiš ceo .sql fajl, znači više query-a odjednom i vrlo je korisno.
[ -zombie- @ 10.11.2003. 17:58 ] @
da, ideja je korisna, ali nije baš do kraja razrađena.
1) zaglupiće se ako neki red sadrži ;
2) takođe, neće se snaći sa komentarima (kakve obično dobijamo kada izvozimo baze)
3) ...
[ Goran Rakić @ 10.11.2003. 21:20 ] @
Ja sam pisao ranije nešto tako, a onda sam olakšao sebi posao sa system() funkcijom i which mysql i mysql -h aaa.com -u user -p pass < backup/backup.sql što sasvim lepo šljaka, doduše u većini slučajeva na Unix sistemima zbog which alata, kao i preusmeravanje ulaza što je mogućnost sh, bash i još po nekih ljuski.
Može da se i ovakav kod lepo razradi, ali uvek postoji problem sa "nije_pokrivena_još_ovakva_kombinacija".
[ _owl_ @ 10.11.2003. 22:42 ] @
PhpMyAdmin -- pravo cudo, pored toga sto bach SQL mozete da uradite preko web-a, mozete i da uzmete kod koji radi taj isti batch. Opaki su ti open source projekti, svasta moze da se nauci/preuzme/prepravi.
[ broker @ 11.11.2003. 09:47 ] @
Citat: -zombie-:
1) zaglupiće se ako neki red sadrži ;
2) takođe, neće se snaći sa komentarima (kakve obično dobijamo kada izvozimo baze)
1. Nece se zaglupeti. Kod trimuje string koji je izdvojio kao komandu i ako dobije prazan string ne izvrsava ga.
2. Komentari ne smetaju osim u slucaju da neko zvekne ; u sam komentar.. mada, ovo nije namenjeno za all purpose and dumb users koriscenje nego da olaksa pisanje koda.
Ja vise volim da sto vise stvari resim SQL-om i ovo mi je zgodno resenje. Kad napravim komplikovan SQL skript koji radi posao (a to ume da bude poduzi niz komandi) samo ga iskopiram u PHP kod i izvrsim gornjom funkcijom. Ne samo sto je prakticno nego je i mnogo citljivije. Dodje skoro kao stored procedures :)
[ -zombie- @ 11.11.2003. 17:51 ] @
Citat: broker:
1. Nece se zaglupeti. Kod trimuje string koji je izdvojio kao komandu i ako dobije prazan string ne izvrsava ga.
INSERT INTO articles SET keywords='html ; css ; javascript';
[ broker @ 12.11.2003. 08:13 ] @
ebiga... :) najde mi slabu tacku :)
Pa... siguran sam da se to moze resiti nekim prilicno jednsotavnim reg_exp, samo sto sam ja slab sa regexp. Ak se ne varam, ; se regularno moze pojaviti samo u stringovima pa bi moglo da se izvededa se pre podele na komande takvi slucajevi oznace a posle vrate.
Ako je neko rad da napise reg_exp koji nalazi ; u nizu znakova koji pocinju i zavrsavaju se sa ' odnosno " i zamenjuje ga sa ## neka posalje.
[ -zombie- @ 12.11.2003. 12:50 ] @
nije tako jednostavno, i sumnjam da se nekim normalnim regexom mogu pokriti svi slučajevi.
znak navoda ' se može naći i u stringu, ali je onda eskejpovan sa \', pa onda, mogu se koristiti i dupli navodi ", pa onda kombinacije jednih i drugih do u besvest...
znači, ma koliko ja voleo umetnost regexa, mislim da je za ovo neophodan neki liniski parser sa stanjem (statefull). videću da li mogu da skuvam jedan uskoro...
[ broker @ 13.11.2003. 11:55 ] @
Javi ako sta postignes, mada mislim da se ti problemi u dobroj meri mogu izbeci u samm sorsu. Najcesce se takvi stringovi moraju u stvari napraviti van SQL-a i proslediti kao parametri a niz SQL komandi je uglavnom baratanje s gotovim podacima u tabelama.
[ NetworkAdmin @ 14.11.2003. 23:13 ] @
onda je lijek dodavane "meta" komanti u sql file recimo
#explodemarker#
INSERT INTO articles SET keywords='html ; css ; javascript';
#explodemarker#
INSERT INTO articles SET keywords=lolita ; youngporn; underage';
#explodemarker#
[ _owl_ @ 15.11.2003. 22:22 ] @
Ne treba komplikovati nesto sto je po svoj prilici jednostavno
(sto u celu pricu dodavati neke eksplozije, dinamite i ostalo).
Ako neko hoce da pravi svoje resenje od nule onda mora malo
da se udubi u problem i eventualno prouci slicna resenja koja
postoje (gorepomenuti PhpMyAdmin).
Regex-ima se takvi problemi ne resavaju (resavaju se konstruisanjem
parsera, potisnog automata ili cega vec).
[ _owl_ @ 15.11.2003. 22:25 ] @
Zaboravih primer:
INSERT INTO articles
VALUES ('#explodemarker#', 'SELECT *;'bilo koji drugi marker');
Nije da hocu da miniram ideju ali ne ide to tako.
[ NetworkAdmin @ 18.11.2003. 08:58 ] @
Code: function QueryUpload ($mysql_host, $mysql_user, $mysql_db, $mysql_password, $filename)
{
mysql_connect($mysql_host, $mysql_user, $mysql_password) || FatalError("Could not connect to SQL db");
mysql_select_db($mysql_db) || FatalError("mysql_select_db :: failure");
$fp = fopen($filename, "rb");
$command = "";
echo "Please wait...<br>\n";
while (!feof($fp)) {
$c = fgets($fp, 1500000);
$c = chop($c);
$c = ereg_replace("^[ \t]*#.*", "", $c);
$command.=$c;
if (ereg(";$",$command)) {
$command=ereg_replace(";$","",$command);
if (ereg("CREATE TABLE ", $command)) {
$table_name = ereg_replace(" .*$", "", eregi_replace("^.*CREATE TABLE ", "", $command));
echo "Creating table: [$table_name] ...<br>\n";
flush();
}
mysql_query($command);
$myerr = mysql_error ();
if (!empty($myerr))
{
echo $myerr;
break;
}
$command="";
flush();
}
}
mysql_close ();
fclose($fp);
if (!empty($myerr))
return false;
return true;
}
Evo na svjetlo javnosti ova funkcija pa da vidimo ima li bugs :)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|