taisön: array ABFRAGE in PDO SELECT Anfrage

Hallo, ich möchte EINE längere SELECT Abfrage erstellen, da nicht immer alle Wert abgefragt werden sollen, möchte ich diese in einem Arry speichern und dann in der Abfrage ausgeben.

suche = array();

$suche[] = array(	'select' => 'a.id =:eingabe',  
					'result' => '\'eingabe\' => $eingabe',
					  );		
	
	


$statement = $pdo->prepare("SELECT a* FROM table a WHERE ".$suche[0]['select'].");

$result = $statement->execute(array("$suche[0]['result']"));

Leider bekomme ich eine Fehlermeldung, mit der ich leider nichts so recht anfangen kann.

Notice: Array to string conversion in suche.php on line 529

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in suche.php on line 29

In meinem Array sieht es so aus

Array
(
    [0] => Array
        (
            [select] => a.id_typ =:eingabe
            [result] => 'eingabe' => $eingabe
        )

)
  1. Hallo taisön,

    der von Dir gepostete Code passt nicht, da sind Anführungszeichen falsch. Das ." am Ende der prepare-Zeile erzeugt das Problem. Aber ich gehe davon aus, dass das beim Kopieren hierher passiert ist, sonst hättest Du ganz andere Fehlermeldungen.

    Was auch nicht passt, ist dein SQL-Statement. Du müsste a.* schreiben, nicht a*.

    Für den Fehler interssanter ist aber:

    • was steht in den Zeilen 29 und 529 von suche.php

    Das ist eigentlich das wichtigste: welches Statement genau ist es, das den Fehler wirft. Diese Information enthältst Du uns vor.

    Und was bei solchen generierten SQLs auch immer wichtig ist:

    • wie sieht das generierte SQL Statement aus

    Meine Hypothese ist der result-Teil deines Arrays, da wird garantiert was nicht funktionieren. PHP ersetzt Variablen nur in Strings, die in "doppelten" Anführungszeichen stehen, und die Ersetzung findet genau dann statt, wenn dieser String benutzt wird. In deinem Fall wäre das das Erstellen des $suche-Arrays, wenn der String denn in doppelten Anführungszeichen gestanden hätte.

    Die String-Auflösung in "$suche[0]['result']" funktioniert so übrigens gar nicht, das ist ein zweistufiger-Arrayzugriff, den kann die einfache Syntax des String Parsing nicht, da brauchst Du die komplexe Syntax: "{$suche[0]['result']}". Das hilft im konkreten Fall jedoch nicht weiter, weil Du für den Execute-Parameter ein Array brauchst, wo der Schlüssel der Placeholder ist (also ':eingabe', incl. des Doppelpunkts) und der Wert ist der zu übergebende Wert.

    Du könntest dein Suche-Array so erzeugen:

    $suche[] = array(	'select' => 'a.id =:eingabe',  
    					'result' => array(':eingabe' => $eingabe));		
    

    Das setzt aber voraus, dass Du $eingabe in dem Moment zur Verfügung hast, wo Du das suche-Array aufbaust.

    Mit diesem Suche-Array hast Du das nötige Array für execute sofort fertig und kannst dann bei der SQL-Abfrage schreiben:

    $statement = $pdo->prepare("SELECT a.* FROM table a WHERE ".$suche[0]['select']);
    if ($statement === FALSE) {
       // Fehlerbehandlung für prepare
    }
    if (!$statement->execute($suche[0]['result'])) {
       // Fehlerbehandlung für execute
    }
    

    Rolf

    --
    sumpsi - posui - clusi
    1. Erst mal Danke, für die umfassende Antwort

      was steht in den Zeilen 29 und 529 von suche.php

      $result = $statement->execute(array($suche[0]['result']));

      wäre die Zeile.

      $statement = $pdo->prepare("SELECT a.* FROM table a WHERE ".$suche[0]['select']);
      if ($statement === FALSE) {
         // Fehlerbehandlung für prepare
      }
      if (!$statement->execute($suche[0]['result'])) {
         $result = $statement->execute(array($suche[0]['result'][':eingabe']));
      }
      

      die besagte Zeile habe ich nun einfügt und angepasst, leider habe ich keine Ausgabe, aber auch keine Fehlermeldung.

      while($row = $statement->fetch()) 
      {
      echo $row['id']	.'<br/>';
      }
      
      1. Hallo taisön,

        der folgende Block Code ist - sorry - Blödsinn. Ich unterstelle einfach mal, dass Du das noch nicht überarbeitet hattest...

        if (!$statement->execute($suche[0]['result'])) {
           $result = $statement->execute(array($suche[0]['result'][':eingabe']));
        }
        

        Wenn der execute FALSE zurückgibt, solltest Du eine Fehlermeldung ausgeben und diesen Programmteil abbrechen. Ein weiterer Execute wird nicht besser. Ähnliches gilt für die Fehlermeldung wenn prepare FALSE zurückliefert. Man hat gern mal einen Tippfehler drin, und dann möchte man schon wissen, wo der ist. Diese Fehlerbehandlung programmierst Du für Dich! Du bist derjenige, der im Dunklen tappt wenn du nicht weißt woher der Fehler kommt.

        Wenn es bei prepare und execute keinen Fehler gab, aber die fetch-Schleife keine Ausgabe liefert, dann bekommst Du ggf. keinen SQL Treffer. Hier hilft nur das, was ich vorher schon schrieb: SQL Statement ausgeben und gucken ob es aussieht wie erwartet, das Parameter-Array, das Du an execute übergibst, ausgeben und inspizieren, vielleicht auch mal das generiert SQL Statement im myPhpAdmin ausführen.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo Rolf B,

          Hier hilft nur das, was ich vorher schon schrieb: SQL Statement ausgeben und gucken ob es aussieht wie erwartet,

          Wie kann man das tun, wenn man prepared statements verwendet? Ich kann mich erinnern, mich damit auch schon mal gequält zu haben.

          Bis demnächst
          Matthias

          --
          Pantoffeltierchen haben keine Hobbys.
          1. Tach!

            Hier hilft nur das, was ich vorher schon schrieb: SQL Statement ausgeben und gucken ob es aussieht wie erwartet,

            Wie kann man das tun, wenn man prepared statements verwendet? Ich kann mich erinnern, mich damit auch schon mal gequält zu haben.

            Es spielt keine Rolle, ob man ein Prepared Statement oder ein herkömmliches mittels Einzelstrings zusammenbaut. Natürlich kann man bei den Prepared nur die Platzhaltervariante sehen, denn ein vollständiges Statement entsteht entweder gar nicht oder nur in den Tiefen des DBMS oder der P.S.-Emulation. Aber auch das muss ja soweit syntaktisch in Ordnung sein.

            dedlfix.