PDO paraméteres lekérdezés MYSQL-ben
2021-04-26T19:13:55+02:00
2021-04-28T07:43:31+02:00
2022-08-12T02:20:29+02:00
gyendresz
Van egy ilyesmi lekérdezésem:

$query="SELECT * from tabla where type=:type and in_date like :in_date"; $sql_param[:type]="TIPUS1"; $sql_param[:in_date]="2021-04-26"; $sql_param[:nem_hasznalt]="valami_plusz"; run_sql($query, $sql_param); function run_sql($query, $sql_param = array()){ $sth = $db->prepare($query); $sth->execute($sql_param); return($sth); } Ha a queryben a paramétereket megadom visszaadja az értékeket, ha paraméterként adom át akkor nem. Ki lehet valahogy íratni, hogy végülis milyen lekérdezést generált a paraméterek behelyettesítésével. Régebben működött, de valamit valamikor elrontottam. (Persze az életben kicsit minden bonyolultabb, de talán a lényeget sikerült összefoglalni.)
Esetleg az zavarhatja, hogy nem az sql_param-ban több nem használt paraméter is van?
Mutasd a teljes hozzászólást!
Hali!

Esetleg az zavarhatja, hogy nem az sql_param-ban több nem használt paraméter is van?

Igen, mint ahogy' a dokumentáció is írja: „Binding more values than specified is not possible; if more keys exist in input_parameters than in the SQL specified in the PDO::prepare(), then the statement will fail and an error is emitted”. Persze, ez egyből kiderült volna, ha megnézed a hibaüzenetet.

Mutasd a teljes hozzászólást!

  • Na igen, a PDO-t nem olyan egyszerű debugolni, de azért nem teljesen reménytelen:
    How to debug PDO database queries?
    Mutasd a teljes hozzászólást!
  • Bár nekem talán ez tűnik a leghasználhatóbb módszernek:
    PHP: PDOStatement::debugDumpParams - Manual
    Mutasd a teljes hozzászólást!
  • Hali!

    Ez hogy' segít a felvetett probléma megoldásában?

    A nyitó hozzászólásban felvetett példára a következőket adja a debugDumpParams() metódus:
    1. Ha nem emulált prepared statement-et használunk (azaz, a \PDO::ATTR_EMULATE_PREPARES opciót 0-ra állítjuk):
    SQL: [62] SELECT * from tabla where type=:type and in_date like :in_date Params: 2 Key: Name: [5] :type paramno=0 name=[5] ":type" is_param=1 param_type=2 Key: Name: [8] :in_date paramno=1 name=[8] ":in_date" is_param=1 param_type=2
    2. Ha emulált prepared statement-et használunk (\PDO::ATTR_EMULATE_PREPARES-t 1-re állítjuk):
    SQL: [62] SELECT * from tabla where type=:type and in_date like :in_date Params: 3 Key: Name: [5] :type paramno=-1 name=[5] ":type" is_param=1 param_type=2 Key: Name: [8] :in_date paramno=-1 name=[8] ":in_date" is_param=1 param_type=2 Key: Name: [13] :nem_hasznalt paramno=-1 name=[13] ":nem_hasznalt" is_param=1 param_type=2
    Ebből hogyan tudja eldönteni, hogy mi a hiba (ha van egyáltalán) – vagy másként kérdezve, hogyan tudja egyszerűbben eldönteni, mint konkrétan a hibát/hibakódot vizsgálva? OK, esetleg eljátszadozhat azzal, hogy emulált prepared statement használata esetén (!), ha nincs hiba, akkor a debugDumpParams() metódus eredményében a második sorban lesz egy SENT SQL… kezdetű szöveg is (a „teljes” SQL-mondatot tartalmazza, a paraméterek behelyettesítésével).

    Persze, mindez totálisan lényegtelen, hiszen a dokumentáció egyértelműen leírja, hogy csak annyi paramétert adhatunk meg a statement execute() metódusában (vagy a bindParam() metódussal külön-külön), amennyi paraméterhely az SQL-mondatban van.

    Mutasd a teljes hozzászólást!
  • Szia,

    Az már elkezdtem írni a kérdést amikor szemet szúrt, hogy itt több paraméter maradt mint kellene.
    Most a kérés előtt inkább lecserém a lecserélhető paramétereket, hogy ne legyen ilyen fennakadás.
    Nem szép, de stabilabbnak tűnik az adott felhasználás mellett.

    Köszönöm: EGY
    Mutasd a teljes hozzászólást!
  • Hát például ha azt látom, hogy
    [...] SET nev = :nev, sor = :sor, akt = :akt [...]
    Params: 3
    és mégsem fut le az update, akkor tudom, hogy nem a paramétereket rontottam el.
    Mutasd a teljes hozzászólást!
  • Hali!

    Hát például ha azt látom, hogy […] akkor tudom, hogy nem a paramétereket rontottam el.

    Egyáltalán nem biztos, hogy nem azokat rontottad el. Olvasd el figyelmesen az előző hozzászólásomat, annak is az első pontját (ami most lényeges). Nem emulált prepared statement-et használva, az SQL-mondatban 2 paraméterhely van, az execute() metódusban 3 paramétert adsz meg, mégis azt látod a debugDumpParams() metódus eredményeként, hogy „Params: 2”, és mégis hibára fog futni. Tehát, ebből egyáltalán nem tudod megállapítani, hogy mi lehet a hiba (sőt, ebben az esetben azt sem, hogy hibás).

    De miért is kellene ezzel megállapítani a hibát? Hiszen:
    1. A debugDumpParams() nem arra való.
    2. Ami viszont pontosan arra való: a PDO- vagy statement-objektum errorCode() és/vagy errorInfo() metódusa. Esetleg, a PDO-példányosításkor (vagy utána) beállítani, hogy hiba esetén kivételt dobjon, majd minden adatbázis-műveletet try…catch(…finally) blokkokba tenni és elkapni a \PDOException kivételt.
    3. Tanulmányozni is lehet (kell!) a dokumentációt.

    Mutasd a teljes hozzászólást!
abcd