Autor Zpráva
Fastman
Profil
Zdravím,

Mám menší problém. Vše funguje jak má, ale pokud nahraji soubor, který obsahuje v názvu závorku, tak to zasáhne do kódu a celý kód shodí, ale soubor nahraje.
$dotaz2="SELECT * FROM `maps` WHERE `filename` = '". basename( $_FILES["fileToUpload"]["name"]). "'";

A jsem obdařený errorem
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Fortress (Allies).jpg')' at line 1 - 1064

Proto bych se chtěl zeptat, jestli lze dát do mysql podmínku, nebo už při uploadu souboru smazat závorky. Popřípadě nějak upravit kód, aby závorky vzal aniž by ovlivnil dotaz na databázi.

Děkuji za odpovědi.
juriad
Profil
Vždy! musíš parametry ukládané do dotazu escapovat. Nejspíš tě zajímá funkce mysql_real_escape_string. Každá databázová knihovna takovou funkci obsahuje.
A ten problém není kvůli závorce, ale kvůli apostrofu - ten ukončí řetězec.
Fastman
Profil
juriad:
Vždy! musíš parametry ukládané do dotazu escapovat. Nejspíš tě zajímá funkce mysql_real_escape_string. Každá databázová knihovna takovou funkci obsahuje.
A ten problém není kvůli závorce, ale kvůli apostrofu - ten ukončí řetězec.

Děkuji za odpověď.

Jak ale zabráním tomu apostrofu, aby nepřekazil dotaz? Real escape jsem nějak nepobral, spíš, jak bych to měl dát do kódu.
juriad
Profil
Co používáš k dotazování? Funkci mysql_query?
$dotaz2="SELECT * FROM `maps` WHERE `filename` = '". mysql_real_escape_string(basename( $_FILES["fileToUpload"]["name"])). "'";
Fastman
Profil
juriad:
$dotaz2="SELECT * FROM `maps` WHERE `filename` = '". mysql_real_escape_string(basename( $_FILES["fileToUpload"]["name"])). "'";

Díky moc, pomohlo. Jinak pokud jsem to pochopil správně, tak funkce mysql_real_escape_string se dívá do databáze, zda tam skutečně taková hodnota je nebo jestli neobsahuje daná hodnota nějaké prvky (viz mysql_real_escape_string) "' OR ''='". On by tím POSTem mohl odeslat nějaký dotaz na mysql a ta by ho vyplnila, takže by se mi takhle "naboural" do databáze.

Jinak tuhle metodu můžu používat u všech dotazů co se týká databáze (kde se ptám na informace popřípadě vkládám informace do databáze)?
mimochodec
Profil
Fastman:
pokud jsem to pochopil správně, tak funkce mysql_real_escape_string se dívá do databáze

Ne. Ta funkce tzv. escapuje určité znaky. Tzn. dá před ně backslash. Takže z dotazu.

SELECT FROM tbl WHERE neco = 'The Landlord's Walk'

který by skončil syntaktickou chybou kvůli apostrofu, který jsme ti tam vyznačil, udělá

SELECT FROM tbl WHERE neco = 'The Landlord\'s Walk'
juriad
Profil
Ano, měl bys tuto funkci použít vždy, když sestavuješ dotaz a vkládáš do něj řetězce. A netýká se to jen vstupů od uživatele.

V případě čísel stačí explicitně přetypovat na číslo funckí intval. Například:
; ... WHERE id=' . intval($_POST['id']) . ' AND ... ' 

Jak mimochodec zmínil, ošetří všechny problematické znaky (výčet je v dokumentaci).

Existují i způsoby, jak toto escapování provádět automaticky (prepared statements v mysqli_*). A když už mluvím o mysqli_*, měl bys vědět, že rozhraní, které používáš (mysql_*) je zastaralé. Viz http://www.fisir.tk/itblog/mysql_

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: