Středník v mysql_query

Školení, která pořádám

Funkce mysql_query dovoluje na rozdíl třeba od pg_query spustit jen jeden SQL příkaz, který by neměl být ukončen středníkem. Pokud příkaz středníkem končí, je spolu s bílými znaky na konci příkazu oříznut, pokud za ním ale následuje cokoliv dalšího, skončí volání funkce syntaktickou chybou.

Pokud bychom v rámci volání jedné funkce potřebovali spustit víc SQL příkazů, dá se použít mysqli_multi_query, obvykle nic takového ale není potřeba.

Jakub Vrána, Výuka, 11.12.2006, diskuse: 8 (nové: 0)

Diskuse

ikona dgx :

Něco jako

<?php
foreach (explode(';', $query) as $sql)
    mysql_query($sql);
?>

je kupodivu mnohem rychlejší. Samozřejmě to není dokonalé řešení, ještě je třeba ošetřit středníky uprostřed řetězců.

ikona Jakub Vrána OpenID:

... a komentářů.

Satai:

Možná rychlejší, ale nebezpečnější. Téměř ukázka do knihy Zranitelný kód. Viz třebas ty komentáře. A vsadím se, že v normě SQL najdeme alespoň jeden další příklad na situaci, kdy je to špatně (z hlavy nevytáhnu třebas všechna pravidla o escapování, v praxi nepoužívám SQL ale HQL). A když ne v této versi SQL tak v té příští se určitě něco najde...

error414:

a za jak nebezpecny by si povazoval kod

<?php
mysql_query
($sql);
?>

?

ikona dgx :

Ale o "bezpečnost" tady vůbec nejde, jen jsem se snažil poukázat na to, že mysqli_multi_query je překvapivě mnohem pomalejší než řada volání mysqli_query.

V praxi něco podobného (explode podle "\n") používám na načítání SQL dump databáze. Protože si dump vytvářím vlastním skriptem, vím s jistotou, že každý příkaz je na samostatném řádku.

Je to mimochodem i drasticky rychlejší než importovat pomocí phpMyAdmin.

Satai:

Neni mozna prave proto pomalejsi, protoze dela spoustu nudne prace navic? Ale to tezko rozhodneme bez profileru..

finc:

Já jsem multi_query používal např. při volání stored procedure v PHP.

Honza Hučín:

Díky. V praxi je to ale takto imho použitelné jen při mnohonásobném vkládání z dumpu apod.; jinak by samozřejmě po volání každého dotazu mělo následovat ošetření případného chybového stavu.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.