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..

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL: Reakce na: Satai

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.
avatar © 2005-2020 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.