Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Abfrage mit PDO liefert ein falsches Ergebnis

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Abfrage mit PDO liefert ein falsches Ergebnis

    Hallo zusammen,

    ich hab ein Problem, dass mich gerade etwas verzweifeln lässt. Ich habe eine Webseite, auf der Firmendaten hinterlegt sind. Benutzer können sich eine Liste dieser Firmen anzeigen lassen und diese Liste auch nach verschiedenen Kriterien filtern. Bei diesem Filtern gibt es jetzt dieses verflixte Problem. Solange ich nach einem Kriterium filtere, funktioniert alles ganz wunderbar. Ab zwei Kriterien liefert mir die Datenbank immer ein leere Ergebnis.

    Also mal ein Beispiel:
    Code:
    SELECT DISTINCT company.* FROM company WHERE company.name LIKE :companyname  LIMIT :offset, :limit
    liefert das richtige Ergebnis

    Code:
    SELECT DISTINCT company.* FROM company WHERE company.country LIKE :country  LIMIT :offset, :limit
    liefert auch das richtige Ergebnis

    Code:
    SELECT DISTINCT company.* FROM company WHERE company.name LIKE  :companyname AND company.country LIKE :country  LIMIT :offset, :limit
    liefert einfach 0 Ergebniszeilen zurück, was aber falsch ist.

    Der Datenbankzugriff erfolgt über PDO. Ich hab auch schon gedebugged und das Statement dann über phpMyAdmin abgefragt. Da kam dann das richtige Ergebnis (1 Zeile). Hat irgendjemand eine Idee, was falsch sein könnte?


  • #2
    Sicher, dass das nicht am
    PHP-Code:
    LIMIT :offset, :limit 
    liegt?
    Kannst du das mal direkt nach dem Aufbau der Verbindung ausführen:
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      .. und zeig mal den Code mit welchen du die Parameter für das LIMIT bindest.
      PHP-Klassen auf github

      Kommentar


      • #4
        Ich hab

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        aufgerufen. Verändert hat das nichts. Hab keine Fehlermeldung oder so erhalten.

        Der Code, mit dem ich das Limit einfüge:

        Code:
        if($limit > 0)
        {
             $dbStmt->bindParam(":offset", $offset, PDO::PARAM_INT);
             $dbStmt->bindParam(":limit", $limit, PDO::PARAM_INT);
        }
        Ich kann mir kaum vorstellen, dass es am Limit liegt. Bezüglich dem Limit gibt es ja keine Änderungen zwischen den Anfragen mit nur einem Kriterium und den Anfragen mit mehreren Kriterien.

        Kommentar


        • #5
          PDO::PARAM_INT für Limit wollte ich sehen.
          Bleibt auch $offset bis zur Ausführung der Anfrage 0 ?
          Sonst keine Idee mehr..
          PHP-Klassen auf github

          Kommentar


          • #6
            Wo hast "$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);" gesetzt? Das muss als erstes passieren, am besten direkt nach dem Verbindungsaufbau.

            Du kannst das binden von Parametern nicht optional machen. Wenn sie im Query angegeben sind müssen sie auch beim ausführen gesetzt sein.

            Zum eigentlichen Problem. PDO emuliert standardmässig die Prepared Statments bei Mysql und sendet normale Queries an Mysql. Wenn du die emulation deaktivierst funktioniert das ganze Problemlos. ($dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true) Ansonsten muss sichergestellt sein das die Parameter mit PDO::PARAM_INT gebunden werden (wie in deinem Code). Alles andere führt dazu das PDO den Wert quotet, was ein Syntax Fehler ist.

            Kommentar


            • #7
              Also, wie gesagt, an dem Limit liegt es nicht. Hab es inzwischen auch schon auskommentiert. Es bleibt beim gleichen Ergebnis.

              Der Code, mit dem ich das Statement bastle bzw. die Parameter binde:

              PHP-Code:

              if(isset($filter->companyname))
              {
                    
              $statementString .= " company.name LIKE :companyname AND";
                    
              $paramArray[":companyname"] = "%".$filter->companyname."%";
                    
              $dataTypeArray[":companyname"] = PDO::PARAM_STR;
              }
                      
              if(isset(
              $filter->country))
              {
                    
              $statementString .= " company.country LIKE :country AND";
                    
              $paramArray[":country"] = "%".$filter->country."%";
                    
              $dataTypeArray[":country"] = PDO::PARAM_STR;
              }
               
              ...

              foreach(
              $paramArray as $key => $value)
              {
                     
              $dbStmt->bindParam($key$value$dataTypeArray[$key]);

              @erc : Hab das setAttrbute direkt nach dem Verbindungsaufbau aufgerufen.

              PHP-Code:

              $this
              ->dbconnection = new PDO('mysql:host=localhost;dbname=blabla''blabla''blabla');
              $this->dbconnection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 
              Und es funktioniert weder, wenn ich PDO::ATTR_EMULATE_PREPARES auf true oder auf false setze.

              Viele Grüße
              DaKine

              Kommentar


              • #8
                versuch mal bindParam durch bindValue zu ersetzen
                liebe Grüße
                Fräulein Dingsda

                Kommentar


                • #9
                  Zitat von dingsda Beitrag anzeigen
                  versuch mal bindParam durch bindValue zu ersetzen
                  Wahnsinn. Habs gemacht und schon funktioniert es!

                  Und wenn man sich dann die Doku dann nochmal genauer ansieht, dann erkennt man auch warum. Bei bindParam wird der Value als Referenz übergeben. Oh man, wer lesen kann ist klar im Vorteil!
                  Vielen, vielen Dank an alle!

                  Gruß,
                  Da Kine

                  Kommentar

                  Lädt...
                  X