Forum » Programiranje » Težave s prepared statement [PHP]
Težave s prepared statement [PHP]
urli ::
Imam na primer spodnjo kodo v kateri updatem vrednost "bar"
Za obe spremenljivki ($bar in $foo) zahtevam, da sta integer (v bazi sta stolpca bar in foo tipa INT(10)). Če na primer za $bar izberem vrednost -10, se UPDATE ne izvede (ok), če pa za vrednost $bar izberem na primer string "blah", pa se mi UPDATE izvede kljub temu, da sem pri bind_param izrecno zahteval, da mora biti vrednost integer. V bazi se za vrednost bar zapiše 0 (namesto, da bi ostala predhodna vrednost).
* Recim, če "ročno" izvedem query
Mi bo mysql pravilno izpisal napako "#1366 - Incorrect integer value: 'blah' for column 'bar' at row 1".
Če to izvedem preko prepared statement, mi pa za bar kar dodeli vrednost 0
# POPRAVEK - PODČRTANO JE NAPAČNO/NI REŠITEV, KER MI NE GLEDE NA TO, KAJ VPIŠEM ZA $blah VRAČA TRUE... Verjetno bi moral preveriti, če $stmt->bind_param("ii", $bar, $foo) vrne TRUE in šele potem izvesti execute()? Če je v tem težava, s katero metodo to preverim? If ($stmt->bind_param("ii", $bar, $foo)) {}.. ne bo šlo čez, ker delam class in v bistvu bindam parametre malo drugače tko da nujno potrebujem metodo (če je sploh tu težava).
Prosim za pomoč.
... $stmt = $mysqli->prepare ( "UPDATE neki SET bar=? WHERE foo=? LIMIT 1" ); $stmt->bind_param("ii", $bar, $foo); $stmt->execute (); ...
Za obe spremenljivki ($bar in $foo) zahtevam, da sta integer (v bazi sta stolpca bar in foo tipa INT(10)). Če na primer za $bar izberem vrednost -10, se UPDATE ne izvede (ok), če pa za vrednost $bar izberem na primer string "blah", pa se mi UPDATE izvede kljub temu, da sem pri bind_param izrecno zahteval, da mora biti vrednost integer. V bazi se za vrednost bar zapiše 0 (namesto, da bi ostala predhodna vrednost).
* Recim, če "ročno" izvedem query
UPDATE neki SET bar="blah" WHERE foo=1 LIMIT 1
Mi bo mysql pravilno izpisal napako "#1366 - Incorrect integer value: 'blah' for column 'bar' at row 1".
Če to izvedem preko prepared statement, mi pa za bar kar dodeli vrednost 0
# POPRAVEK - PODČRTANO JE NAPAČNO/NI REŠITEV, KER MI NE GLEDE NA TO, KAJ VPIŠEM ZA $blah VRAČA TRUE... Verjetno bi moral preveriti, če $stmt->bind_param("ii", $bar, $foo) vrne TRUE in šele potem izvesti execute()? Če je v tem težava, s katero metodo to preverim? If ($stmt->bind_param("ii", $bar, $foo)) {}.. ne bo šlo čez, ker delam class in v bistvu bindam parametre malo drugače tko da nujno potrebujem metodo (če je sploh tu težava).
Prosim za pomoč.
- spremenil: urli ()
Miha 333 ::
Si nastavil, da je mysql stolpec tipa signed integer? Če ne, negativne vrednosti ne bodo sprejete.
Zgodovina sprememb…
- spremenilo: Miha 333 ()
urli ::
Oba stolpca imam UNSIGNED INT(10) (ne želim negativne vrednosti) ampak težava je drugje. Ne vem, če sva se razumela zato bom še enkrat pojasnil.
Brez prepared statement deluje tako kot pričujem
1. UPDATE neki SET bar=4 WHERE foo=1 LIMIT 1 -> se izvede, ok
2. UPDATE neki SET bar=-45 WHERE foo=1 LIMIT 1 -> se ne izvede (predhodna vrednost za bar se ohrani), ok
3. UPDATE neki SET bar="blah" WHERE foo=1 LIMIT 1 -> se ne izvede (predhodna vrednost za bar se ohrani), ok
Enako kot zgoraj le s prepared statement pa se mi pri enakih podatkih v 3. primeru vrednost za bar update-a v 0 namesto, da bi se ohranila predhodna vrednost.
Torej za 3. primer bi zapisal...
In bi pričakoval, da se UPDATE ne bi izvedel ampak očitno se in mi vrednost bar v bazi ponastavi na 0.
Upam, da sem razumljivo napisal.
Brez prepared statement deluje tako kot pričujem
1. UPDATE neki SET bar=4 WHERE foo=1 LIMIT 1 -> se izvede, ok
2. UPDATE neki SET bar=-45 WHERE foo=1 LIMIT 1 -> se ne izvede (predhodna vrednost za bar se ohrani), ok
3. UPDATE neki SET bar="blah" WHERE foo=1 LIMIT 1 -> se ne izvede (predhodna vrednost za bar se ohrani), ok
Enako kot zgoraj le s prepared statement pa se mi pri enakih podatkih v 3. primeru vrednost za bar update-a v 0 namesto, da bi se ohranila predhodna vrednost.
Torej za 3. primer bi zapisal...
$stmt = $mysqli->prepare ( "UPDATE neki SET bar=? WHERE foo=? LIMIT 1" ); $bar = "blah"; // v bazi je bar UNSIGNED INT(10), za $bar pa zahtevam, da je integer (i) - pri bind_param() $foo = 1; $stmt->bind_param("ii", $bar, $foo); $stmt->execute ();
In bi pričakoval, da se UPDATE ne bi izvedel ampak očitno se in mi vrednost bar v bazi ponastavi na 0.
Upam, da sem razumljivo napisal.
Zgodovina sprememb…
- spremenil: urli ()
Jakkob ::
MySQL včasih naredi kaj po svoje. Tule poglej: http://dev.mysql.com/doc/refman/5.7/en/...
Nastavi MySQL v STRICT Mode, mogoče bo rešilo težavo: http://dev.mysql.com/doc/refman/5.7/en/...
Nastavi MySQL v STRICT Mode, mogoče bo rešilo težavo: http://dev.mysql.com/doc/refman/5.7/en/...
Zgodovina sprememb…
- spremenil: Jakkob ()
urli ::
MySQL včasih naredi kaj po svoje. Tule poglej: http://dev.mysql.com/doc/refman/5.7/en/...
Nastavi MySQL v STRICT Mode, mogoče bo rešilo težavo: http://dev.mysql.com/doc/refman/5.7/en/...
Ni to, ker že imam nastavljeno na strict. Sem pa ugotovil kje je "napaka". Težava je bila v bind_param(). Z "i" očitno type cast-am spremenljivko in mi v primeru, da je ta string, to enostavno spremeni v 0 in potem to vrednost "zabriše" v mysql kjer je vse ok. Težavo sem odpravil tako, da sem enostavno privzel, da gre za string, torej $stmt->bind_param("si", $bar, $foo); oz. ker delam class bom kar lepo za vse privzel string. Tako kot je verjetno pri Laravel...
https://laravel.com/docs/5.1/database#r...
oz. primer DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']); kjer ni nikjer možnost izbire tipa (d, i, b ali s). Očitno je vse privzeto na s, da ni težav. Men se je pa tok fajn zdel, ko sem zadevo malo "izboljšal" in sem imel še možnost te izbire pa je bil to bolj strel v koleno
Zgodovina sprememb…
- spremenil: urli ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | MySQL izpis vsebine iz dveh tabelOddelek: Programiranje | 1201 (1089) | iMark |
» | Sortiranje podatkov v mysql podatkovni baziOddelek: Programiranje | 916 (724) | i33a |
» | utf-8 in dolzina polja v mysqlOddelek: Izdelava spletišč | 3675 (3425) | tmz |
» | [PHP] charter set windows-1250Oddelek: Programiranje | 2826 (2826) | Blisk |
» | MySQL 5.0 zrel za delovno okoljeOddelek: Novice / Ostala programska oprema | 3566 (2716) | krho |