Ankündigung

Einklappen
Keine Ankündigung bisher.

Umstellung von MySql auf PDO - Fehler in Abfrage bzw. Parameter

Einklappen

Neue Werbung 2019

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

  • Umstellung von MySql auf PDO - Fehler in Abfrage bzw. Parameter

    Hallo ich schreibe gerade eine Funktion von MySql auf PDO um. Leider erhalte ich dabei folgenden Fehler:

    HTML-Code:
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in D:\Webserver\Web\spieleverwaltung\func\function.inc.php
    Meine Funktion sieht so aus:

    PHP-Code:
    function hole_spiele($start=0$anzahl=100$suchstring=""$suchbegriff=""$suchkat=""$kat=0){
        
    $spiele=array();
        
    $params=array();
        
    $linkID connectDB();
        
    $sql="SELECT * FROM spiele WHERE UPPER(";

        if(
    $suchkat!=""){
            if(
    $suchkat=="beschreibung" AND $kat=="1"$sql.="name) = UPPER('";
            else 
    $sql.=$suchkat.") LIKE UPPER('";
        }
        else{
            
    $sql.="name) LIKE UPPER('";
        }

        if(
    $suchbegriff!=""){
            switch(
    $suchkat){
                case 
    "beschreibung":
                    if(
    $kat==1) {
                        
    $sql.=":suchbegriff1') COLLATE utf8_bin";
                        
    $params[":suchbegriff1"] = $suchbegriff;
                    }
                    else 
    $sql.=":suchbegriff') COLLATE utf8_bin";
                break;

                default:
                    
    $sql.=":suchbegriff') COLLATE utf8_bin";
                break;
            }
            
    $params[":suchbegriff"] = '%'.$suchbegriff.'%';

        }
        else{
            
    $sql.=":suchstring')";
            
    $params[":suchstring"] ='%'.$suchstring.'%';
        }

    /*-----Variablen und Werte für die Seitennavigation (Blättern) erstellen----------------*/    
        
    $sql2=str_replace("*","COUNT(id) as count",$sql); //Gesamtanzahl der gefundenen Datensätze ermitteln (Select * wird durch Select Count(id) ) ersetzt

        
    $stmt2 $linkID->prepare($sql2);
        
    $stmt2->execute();
            
    // ********Datendefinition für die Clientausgabe**************//
         
    $start abs((int)$start);                     
        
    $total    $stmt2->fetchColumn();//Anzahl der ges. Datensätze
        
    if($total==0$total=1//falls nichts gefunden dann total auf 1 setzen, weil sonst steht da Seite 1/0 ;)
        
    $gseiten=ceil($total/$anzahl); //ceil rundet immer auf die nächste ganze zahl auf
        
    $seite=$start/$anzahl+1//aktuelle Seite

    // Ggf. $start korrigieren (falls Parameter in der URL manipuliert wurde)
    $start = ($start >= $total) ? $total $anzahl $start;
    if(
    $start<0$start=0//wenn Start kleiner 0 dann auf 0 setzen    

    //das Ganze jetzt in eine Session für spätere Verarbeitung (Funktion create_seitennavi) bringen
    $_SESSION["seiten"]["total"] = $total;
    $_SESSION["seiten"]["gesamt"] = $gseiten;
    $_SESSION["seiten"]["seite"] = $seite;
    $_SESSION["seiten"]["start"] = $start;
    $_SESSION["seiten"]["anzahl"] = $anzahl;
    $_SESSION["token"] = $suchstring;
    /*----- Ende - Variablen und Werte fuer die Seitennavigation erstellen----------------*/

        
    $sql.= " ORDER BY name ASC LIMIT :start, :anzahl";

        
    $params[":start"] = $start;
        
    $params[":anzahl"] = $anzahl;

    var_dump($params);
    echo 
    $sql;

        
    $stmt $linkID->prepare($sql);
        
    $stmt->execute($params);

        
    $stmt->debugDumpParams();

        
    $x=0;

        while(
    $row $stmt->fetch(PDO::FETCH_ASSOC)){
            
    $spiele[$x]["name"] = $row["name"];
            
    $spiele[$x]["genre"] = $row["genre"];
            
    $spiele[$x]["bild"] = "./img/".$row["bild"];
            
    $spiele[$x]["beschreibung"] = $row["beschreibung"];
            
    $spiele[$x]["plattform"] = $row["plattform"];
            
    $x++;
        }

        return 
    $spiele;

    Die Funktion zum Datenbankaufbau sieht so aus:

    PHP-Code:
    function connectDB() {
            try {
            
    // Datenbankverbindung mit PDO object.
            
    $linkID = new PDO("mysql:host="._DB_SERVER_.";dbname="._DB_NAME_.";charset=utf8"_DB_USER_,_DB_PASSWD_, array(PDO::ATTR_EMULATE_PREPARES => falsePDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONPDO::ATTR_PERSISTENT => true));
            } catch(\
    PDOException $e){
                
    // wenn Verbindung fehl schlägt, dann Fehler ausgeben.
                
    echo "Error connecting: "$e->getMessage();
            }

          return 
    $linkID;
         } 
    Das var_dump bzw. echo sql bringt mir folgendes:

    HTML-Code:
    array(3) { [":suchstring"]=> string(2) "%%" [":start"]=> int(0) [":anzahl"]=> int(10) }
    SELECT * FROM spiele WHERE UPPER(name) LIKE UPPER(':suchstring') ORDER BY name ASC LIMIT :start, :anzahl
    Ich hab den Code jetzt schon ne Stunde überprüft und durchsucht. Aber ich komme leider nicht drauf wo der Fehler liegt.
    Kann mir jemand mit besseren Augen helfen? Bitte

  • #2
    Wow, das ist mal ein Chaos-Code. Ich würde da überhaupt nicht mehr durchblicken.

    Warum setzt zu :suchstring in Hochkomma?

    Kommentar


    • #3
      Chaos-Code? Finde ihn eigentlich net so schlimm Aber bin für Verbesserungsvorschläge immer offen.
      :suchstring steht in Hochkomma wegen sql query. Lautet ja dann übersetzt (also in dem Beispiel ist ja suchstring leer):

      HTML-Code:
        sql="SELECT * FROM spiele WHERE UPPER(name) LIKE UPPER('%%') ORDER BY name ASC LIMIT :start, :anzahl"
      Die Hochkommas kann man sicherlich auch weglassen

      Kommentar


      • #4
        Zitat von pfump Beitrag anzeigen
        Chaos-Code? Finde ihn eigentlich net so schlimm Aber bin für Verbesserungsvorschläge immer offen.
        • einheitliche Code-Einrückung
        • keine Variablen nummerieren
        • nicht Englisch und Deutsch mischen. Am besten überhaupt alles in Englisch schreiben.
        • keine einzeiligen ifs
        • mehr Funktionen verwenden und nicht alles in einer Wurst programmieren. Pi-mal-Daumen-Regel: Eine Funktion sollte nicht länger als eine Bildschirmseite sein.
        • kein SELECT * verwenden
        • eine Funktion sollte von sich aus keine Datenbankverdbindung aufbauen, sondern die Datenbankverbindung als Parameter entgegen nehmen

        Zitat von pfump Beitrag anzeigen
        :suchstring steht in Hochkomma wegen sql query. Lautet ja dann übersetzt (also in dem Beispiel ist ja suchstring leer):

        HTML-Code:
         sql="SELECT * FROM spiele WHERE UPPER(name) LIKE UPPER('%%') ORDER BY name ASC LIMIT :start, :anzahl"
        Die Hochkommas kann man sicherlich auch weglassen
        Du hast aber ':suchstring' und nicht '%%' geschrieben. Das zweite wäre so möglich, das erste nicht.

        Kommentar


        • #5
          Du hast aber ':suchstring' und nicht '%%' geschrieben. Das zweite wäre so möglich, das erste nicht.
          Na in :suchstring steht ja %% drin.

          PHP-Code:
          $sql="SELECT * FROM spiele WHERE UPPER(";
          ...
          $sql.="name) LIKE UPPER('";
          ...
          $sql.=":suchstring')";
          ...
          $params[":suchstring"] ='%'.$suchstring.'%'
          ergibt am Ende
          PHP-Code:
          $sql="SELECT * FROM spiele where UPPER(name) LIKE UPPER('%%')"

          Kommentar


          • #6
            Zitat von pfump Beitrag anzeigen

            Na in :suchstring steht ja %% drin.

            PHP-Code:
            $sql="SELECT * FROM spiele WHERE UPPER(";
            ...
            $sql.="name) LIKE UPPER('";
            ...
            $sql.=":suchstring')";
            ...
            $params[":suchstring"] ='%'.$suchstring.'%'
            ergibt am Ende
            PHP-Code:
            $sql="SELECT * FROM spiele where UPPER(name) LIKE UPPER('%%')"
            Nein, so funktionieren Prepared Statements nicht. Da wird kein Wert in SQL-Code eingefügt, sondern der Wert wird separat an die Datenbank gesendet. ':suchstring' bleibt ':suchstring' und ist aus Sicht der Datenbank kein Parameter, sondern ein String, der ":suchstring" enthält.

            Kommentar


            • #7
              Also müssen die Hochkomas vor und nach :suchstring weg?

              Kommentar


              • #8
                Zitat von pfump Beitrag anzeigen
                Also müssen die Hochkomas vor und nach :suchstring weg?
                Wenn du willst, dass es ein Parameter ist, dann ja. Wenn du willst, dass es ein String ":suchstring" ist, dann nicht.

                Kommentar


                • #9
                  Vielen Dank. Da hätte ich noch Tage suchen können und mir wäre es nicht aufgefallen
                  Werd das morgen gleich ändern. Werde auch versuchen deine anderen Verbesserungsvorschläge umzusetzen

                  Kommentar


                  • #10
                    Hier steht alles was du über PDO wissen musst: https://phpdelusions.net/pdo

                    Kommentar

                    Lädt...
                    X