» »

Težave s prepared statement [PHP]

Težave s prepared statement [PHP]

urli ::

Imam na primer spodnjo kodo v kateri updatem vrednost "bar"
...
$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...

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

Zgodovina sprememb…

  • spremenil: Jakkob ()

urli ::

Jakkob je izjavil:

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 :D

Zgodovina sprememb…

  • spremenil: urli ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

MySQL izpis vsebine iz dveh tabel

Oddelek: Programiranje
91201 (1089) iMark
»

Sortiranje podatkov v mysql podatkovni bazi

Oddelek: Programiranje
6916 (724) i33a
»

utf-8 in dolzina polja v mysql

Oddelek: Izdelava spletišč
103675 (3425) tmz
»

[PHP] charter set windows-1250

Oddelek: Programiranje
282826 (2826) Blisk
»

MySQL 5.0 zrel za delovno okolje

Oddelek: Novice / Ostala programska oprema
183566 (2716) krho

Več podobnih tem