T-Rex: PDO Prepared Statement - falscher Query?

Moin,

also als erstes ich weiß nicht genau ob das jetzt ein SQL Fehler ist oder ein PHP Fehler.

Hab da ein Query, der sieht so aus:
select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = :FACEBOOK_ID_KONTO_0 and FACEBOOK_EDITDATE = :FACEBOOK_EDITDATE_1)

Dann hab ich noch ein Array das sieht so aus:
$arPrepare[':FACEBOOK_ID_KONTO_0'] = 1;
$arPrepare[':FACEBOOK_EDITDATE_1'] = 0;

Wenn ich das jetzt mittels dem PDO Objekt abschicke erhalte ich kein Ergebnis.
Wenn ich das Query direkt abschicke erhalte ich ein paar Treffer:
select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = 1 and FACEBOOK_EDITDATE = 0)

Bin ich doof, überarbeitet oder hab keine Ahnung? Wie auch immer Hilfe...

Gruß
do-arb-ung
T-Rex

  1. Tach!

    also als erstes ich weiß nicht genau ob das jetzt ein SQL Fehler ist oder ein PHP Fehler.
    select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = :FACEBOOK_ID_KONTO_0 and FACEBOOK_EDITDATE = :FACEBOOK_EDITDATE_1)

    Die Schreibweise für Platzhalter hängt vom verwendeten DBMS ab. Wenn deines keine benannten Platzhalter kann, so kannst du die auch nicht mit PDO verwenden. Beispielsweise will MySQL nur Fragezeichen als unbenannte aber positionierte Platzhalter haben.

    dedlfix.

    1. Tach!

      also als erstes ich weiß nicht genau ob das jetzt ein SQL Fehler ist oder ein PHP Fehler.
      select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = :FACEBOOK_ID_KONTO_0 and FACEBOOK_EDITDATE = :FACEBOOK_EDITDATE_1)

      Die Schreibweise für Platzhalter hängt vom verwendeten DBMS ab. Wenn deines keine benannten Platzhalter kann, so kannst du die auch nicht mit PDO verwenden. Beispielsweise will MySQL nur Fragezeichen als unbenannte aber positionierte Platzhalter haben.

      dedlfix.

      Also das ist ja nicht der einzige Query den ich hab. Das müssten hunderte zur Zeit sein. Die sind alle auf die gleiche Art und Weise aufgebaut und machen keine Probleme. Nur dieser Query macht eben Probleme wie gesagt.

      Wenn es da keine Lösung gibt, muss ich den Query umformulieren :(.

      Gruß
      enttäuschter
      T-Rex

      1. Guten Tag,

        also als erstes ich weiß nicht genau ob das jetzt ein SQL Fehler ist oder ein PHP Fehler.

        Gibt es denn keine Fehlermeldung?

          
        setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);  
        
        

        Zeige uns doch bitte den PHP-Code, dann kann dir auch sinnvoll geholfen werden.

  2. Hallo,

    also als erstes ich weiß nicht genau ob das jetzt ein SQL Fehler ist oder ein PHP Fehler.

    mit sehr hoher Wahrscheinlichkeit ein PHP-Fehler.

    select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = :FACEBOOK_ID_KONTO_0 and FACEBOOK_EDITDATE = :FACEBOOK_EDITDATE_1)
    $arPrepare[':FACEBOOK_ID_KONTO_0'] = 1;
    $arPrepare[':FACEBOOK_EDITDATE_1'] = 0;

    Wenn ich das jetzt mittels dem PDO Objekt abschicke erhalte ich kein Ergebnis.

    Statt verbaler Beschreibungen wäre der tatsächlich verwendete Code hilfreich.
    Vermutlich machst Du was falsch.

    Freundliche Grüße

    Vinzenz

  3. Hallo,

    Moin,

    also als erstes ich weiß nicht genau ob das jetzt ein SQL Fehler ist oder ein PHP Fehler.

    Hab da ein Query, der sieht so aus:
    select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = :FACEBOOK_ID_KONTO_0 and FACEBOOK_EDITDATE = :FACEBOOK_EDITDATE_1)

    Dann hab ich noch ein Array das sieht so aus:
    $arPrepare[':FACEBOOK_ID_KONTO_0'] = 1;
    $arPrepare[':FACEBOOK_EDITDATE_1'] = 0;

    Wenn ich das jetzt mittels dem PDO Objekt abschicke erhalte ich kein Ergebnis.
    Wenn ich das Query direkt abschicke erhalte ich ein paar Treffer:
    select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = 1 and FACEBOOK_EDITDATE = 0)

    Bin ich doof, überarbeitet oder hab keine Ahnung? Wie auch immer Hilfe...

    Naja, Dein $arPrepare scheint ja nicht anzukommen. Frägt sich, warum? Und warum du keine Möglichkeit hast, den query-String auszugeben (geht vielleicht nicht bei PDO-Statements)?

    Auf das Errorreporting wurdest du ja schon hingewiesen. U.u. auch mal phps error reporting auf Warnings und Notices erweitern, dann bekommst du vielleicht mal ne Fehlermeldung, dass eine Var nicht existiert ...???

    Gruß

    jobo

    1. Auf das Errorreporting wurdest du ja schon hingewiesen. U.u. auch mal phps error reporting auf Warnings und Notices erweitern, dann bekommst du vielleicht mal ne Fehlermeldung, dass eine Var nicht existiert ...???

      Es gibt keine Fehler. Es kommen halt keine Ergebnisse.
      Den PHP Code kann ich leider komplett nicht posten da es über mehrere Klassen geht.
      Der Kern sieht bei mir jedoch nicht anders aus wie bie der PHP Doku.

      PDO Execute

      Beispiel aus der PHP Doku:

      /* Execute a prepared statement by passing an array of insert values */
      $calories = 150;
      $colour = 'red';
      $sth = $dbh->prepare('SELECT name, colour, calories
          FROM fruit
          WHERE calories < :calories AND colour = :colour');
      $sth->execute(array(':calories' => $calories, ':colour' => $colour));

      So ungefähr siehts bei mir aus. Vor dem Execute hab ich mir das array was dem execute über geben wird, ausgeben lassen und auch den "select" Query habe ich mir unmittelbar davor ausgeben lassen und hier gepostet. Keine Fehler und keine Fehlermeldungen und einfach kein Resultat.

      Das einzige was ich mit Sicherheit weiß ist, dass ihr einen
      Gruß
      von mir bekommt
      T-Rex

      1. Hallo,

        die Sache ist doch einfach: wenn du mit dem einfachen String ein Resultat bekommst (also die Query) o.k. ist und eine Resultat bringt, dann ist beim u.g. Zusammenbasteln was falsch. Wenn du allerdings ohne E_NOTICE | E_WARNING arbeitest, bekommst du auch nicht mit, wenn du da irgendwo die Variable nicht richtig übergibst. Dann checkt die Query u.u. eben ob color NULL ist oder ähnliches. Das gibt dann natürlich ein leeres Resultat.

        Gruß

        jobo

        1. Also ich setzte generell immer alle Mechanismen auf ON die mir Fehlermeldungen ausspucken ist doch klaro! Deshalb kann ich mit breiter Brust sagen dass es keine Fehler Meldungen gibt. Das Problem liegt aber wo anders, sie meine Direkte Antwort auf meinen ersten Post.

          Gruß
          verweisender
          T-Rex

  4. Soooo des Rästels Lösung muss im PDO MySQL Treiber irgendwo liegen, auf jeden Fall kommt man da nicht ran.

    Also nochmal zusammen fassend. Wenn ich einen normales Query an die Datenbank schicke, dann erhalte ich Resultate und bei einem Prepared Statement (welches eigentlich das gleiche Query abbildet) nicht.
    Auslöser des ganzen ist ein Datumsfeld, welches in der Where abfrage mit drin ist.
    Ein normales Query schafft folgende Abfrage:
    select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = 1 and FACEBOOK_EDITDATE = 0)

    Bei einem Prepared Statement muss es so aussehen:
    select FACEBOOK.* from FACEBOOK where (FACEBOOK_ID_KONTO = 1 and FACEBOOK_EDITDATE = "0000-00-00 00:00:00")

    Dann funktioniert auch dies. Ergo muss das Prepared Array so aussehen:
    $arPrepare[':FACEBOOK_ID_KONTO_0'] = 1;
    $arPrepare[':FACEBOOK_EDITDATE_1'] = "0000-00-00 00:00:00";

    Der normale Query schafft eine 0 eines Datumfeldes bei einer Abfrage, das Prepared Statement schafft dies nicht bzw. nicht ohne genauere Angaben. Eventuell hätte man eine Chance, wenn man die Parameter per bindParam() und übergebendem data_type bindet (Das hab ich nicht überprüft). Ich übergebe das Array jedoch einfach dem execute().

    Auf jeden Fall hab ich jetzt den "Fehler" gefunden. Das werde ich gleich auch bei den PHP Kommentaren hinterlassen.

    Danke für eure Hilfe

    Gruß
    Genie bei der Arbeit
    T-Rex