Hilfe zu Syntax-Fehler bei PDO prepared Statements

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hilfe zu Syntax-Fehler bei PDO prepared Statements

    Hi!

    Ich habe - glaub ich - eine typische newbie-Frage, komme aber selbst nicht mehr weiter und wäre daher für sachdienliche Hinweise dankbar.

    Bei der nachfolgenden DB-Abfrage erhalte ich die Fehlermeldung:

    Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? OR plz =?' at line 1 )

    Bei den Variablen plz1 und plz2 handelt es sich um zwei Postleitzahlen des Typs char, die Verbindung mit der DB erfolgt weiter vorn und macht funktioniert einwandfrei. Sind für die Analyse sonst noch INfos notwendig?


    PHP-Code:
    if ($_POST) {
        
    // connect to MySQL
        
    $conn dbConnect('query');
        
    $sql "SELECT * FROM geoplz WHERE plz =? OR plz =?";
        
    $stmt $conn->prepare($sql);
        
    // execute query by passing array of variables
        
    $stmt->execute(array($_POST['plz1'], $_POST['plz2']));
        
    $result $conn->query($sql);
        
    $error $conn->errorInfo();
        echo 
    print_r($error,$result);
        } 
    P.S.: Das ist mein erster Post im Forum und ich habe mich noch nicht vorgestellt. Bin thirtysomething und wie man wahrscheinlich merkt blutiger Änfänger. Trotzdem habe ich mir eingebildet, ein eigenes kleines Projekt auf die Füße zu stellen. Habe mich in den letzten Wochen durch die PHP- und SQL-Grundlagen gewühlt/gelesen (bei CSS bin ich noch ziehmlich blank) und will jetzt mit einfacheren scripts Übung zu bekommen. Es ist also noch ein weiter WEg...

    lippes

  • #2
    Hmm, das sieht eigentlich richtig aus. Bist du sicher, das in $_POST was drin steht? if( $_POST ) reicht zur Kontrolle auch nicht aus! Gib dir das Array mal aus und zeig mal her, was drin steht.

    Kommentar


    • #3
      Danke für die schnelle Antwort!

      Das Array sieht eigentlich o.k. für mich aus:

      Array ( [plz1] => 12345 [plz2] => 13579 [send] => Senden )

      Kommentar


      • #4
        Hast du es mal mit bindValue probiert?
        BTW: Dein error_reporting steht auf E_ALL und display_errors ist an?

        Kommentar


        • #5
          Habe

          error_reporting(E_ALL);

          am Anfang meines skripts eingefügt. Genügt das?

          BindValue sagt mir nix, muss erst mal nachschlagen..

          Kommentar


          • #6
            Ah ja bindValue...nein, hab ich noch nicht probiert, weil ich dachte so müsste es funktionieren

            Ich werde es morgen damit mal versuchen...

            Kommentar


            • #7
              Das Problem ist gelöst!

              Eine Abfrage mit PDO prepared statements muss prinzipiell nach folgendem Schema ablaufen (eine große Hilfe war mir dabei die PHP-Funktionsreferenz):

              prepare() bereitet die DB-Abfrage mit Platzhaltern vor
              execute() führt die Abfrage aus
              fetch() bzw. fetchAll() ruft die Ergebnisse ab

              query() dagegen macht in etwa das gleiche wie execute() und fetch() zusammen, bietet allerdings nicht die Möglichkeit mit Platzhaltern zu arbeiten. Seh ich das richtig?

              Meine funktionierende Abfrage sieht jetzt so aus:

              PHP-Code:
              <?php
              if ($_POST) {
                  
              $conn dbConnect('query');
                  
              $stmt $conn->prepare("SELECT * FROM geoplz WHERE plz =? OR plz =?");
                  
              /*$stmt->bindValue(1,$_POST['plz1'],PDO::PARAM_STR);
                  $stmt->bindValue(2,$_POST['plz2'],PDO::PARAM_STR);
                  $ok = $stmt->execute();*/
                  
              $ok $stmt->execute(array($_POST['plz1'], $_POST['plz2']));
                  
              $result $stmt->fetchAll(PDO::FETCH_ASSOC); ?>
                  <pre><?php echo print_r($result);?></pre>
                  <?php
                  $error 
              $conn->errorInfo();
                  }
              Hier noch der Nachweis, dass es klappt :
              Array
              (
              [0] => Array
              (
              [plz] => 01217
              [lon] => 13.74451633873620
              [lat] => 51.01714374820780
              [ex] => 0.61107378213590
              [ey] => 0.14946681812031
              [ez] => 0.77733422867330
              [ort] => Dresden
              )

              [1] => Array
              (
              [plz] => 27442
              [lon] => 9.02204851137085
              [lat] => 53.38158486216570
              [ex] => 0.58910322828882
              [ey] => 0.09353718433403
              [ez] => 0.80262580419928
              [ort] => Gnarrenburg
              )

              )

              Die Abfrage funktioniert natürlich auch unter Verwendung von bindValue() wie von PHP-Desaster vorgeschlagen. Der Unterschied von bindParam() und bindValue() ist mir dabei allerdings noch nicht ganz klar...Naja, ich bleibe sowieso erst mal bei meiner Lösung. Ich finde sie so schön knapp.

              Morgen will ich mit meinen Fingerübungen weiter machen; Entfernungberechnungen einmal mit Hilfe der Polarkoordinaten und dann noch über das Skalarprodukt. Mal sehn, welcher Weg schneller ist. "Elisabeth" ist gerade raus , ich mach Feierabend und schau da mal rein.

              Bis dann

              lippes

              Kommentar


              • #8
                Jetzt sehe ich erst dein $conn->query() ^^. Hab das wohl verdrängt. Darum hatte ich auch keinen Fehler gesehen.
                bindValue bindet einen Wert an das Statement, bindParam bindet hingegen eine Referenz auf eine Variable an das Statement. Änderst du vor dem Aufruf von execute den Wert in der Variablen, wird entsprechend der geänderte Wert übernommen. Ich meine, du kannst auch Variablen für die fetch-Methoden an das Statement binden.

                Kommentar

                Lädt...
                X