Autor | Zpráva | ||
---|---|---|---|
Fastman Profil |
#1 · Zasláno: 1. 2. 2015, 20:11:23
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 |
#3 · Zasláno: 1. 2. 2015, 20:29:31
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 |
#6 · Zasláno: 1. 2. 2015, 21:01:06
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 |
#7 · Zasláno: 1. 2. 2015, 21:05:38
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_ |
||
Časová prodleva: 10 let
|
0