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.
Diskuse
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ů.
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);
?>
?
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.