Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PDO-Probleme (Update funzt nicht)

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PDO-Probleme (Update funzt nicht)

    Hey Leute

    Ich habe folgendes Problem:
    Um SQL-Injections abzuwenden, benutze ich für die DB-Schnittstelle PDO (welches mir allerdings noch unbekannt ist, aber ich habe mich ein bisschen reingearbeitet, jedenfalls in das, was für mich hier nötig ist)

    Allerdings bekomme ich immer Fehler und ich weiß nicht warum.

    Der Fehler lautet:
    Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\update_verans.php on line 186
    In Zeile 186 befindet sich bei mir das $stmt->execute();

    Kann es sein, dass diese ganze PDO-Sache lediglich auf Select-Anweisungen läuft und nicht auf Update-Anweisungen?

  • #2
    Hier mal ein bisschen was zum verdeutlichen, vielleicht findet ja irgendwer den Fehler.
    Ich weiß sonst echt einfach nicht mehr weiter!

    PHP-Code:
    $pdo = new PDO("mysql:host=$server;dbname=s0.alpha"$user$pass) or die(mysql_error());
            
            
    $stmt $pdo->prepare(
            
    "UPDATE $table 
            SET 
            veranst_kurz= :veranst_kurz;, 
            Veranstalter0= :Veranstalter0;,
      //NOCH SO EINIGE ANDERE!
            CERT_DESCRIPTION= :CERT_DESCRIPTION; 
            WHERE V_Nr = 
    $V_Nr"
            
    );

            
    $stmt->bindValue(':veranst_kurz',$_POST['veranst_kurz']);
            
    $stmt->bindValue(':Veranstalter0',$_POST['Veranstalter0']);
      
    //NOCH SO EINIGE ANDERE!
            
    $stmt->bindValue(':CERT_DESCRIPTION',$_POST['CERT_DESCRIPTION']);
            
            
    $stmt->execute(); 

    Kommentar


    • #3
      PDO funktioniert bei allen SQL-Statements. Könntest du den Code-Auszug hier einfügen. Hast du vor ->execute() mit bindParam Werte zugewiesen?

      Kommentar


      • #4
        "UPDATE $table
        SET
        veranst_kurz= :veranst_kurz;,
        Veranstalter0= :Veranstalter0;,
        //NOCH SO EINIGE ANDERE!
        CERT_DESCRIPTION= :CERT_DESCRIPTION;
        WHERE V_Nr = $V_Nr"

        Ich meine, Semikolons hätten hier nichts zu suchen.

        Kommentar


        • #5
          Nein, der oben stehende Auszug ist alles, was ich im Zusammenhang mit PDO benutze.
          Ist das zu wenig?

          (edit)

          Ich habe auch schon versucht, die Semikoli (Mehrzahl für Semikolon? XD) zu entfernen, aber es hat auch nichts geändert

          Kommentar


          • #6
            PHP-Code:
            $stmt $pdo->prepare"UPDATE $table 
                    SET 
                    veranst_kurz= :veranst_kurz;, 
                    Veranstalter0= :Veranstalter0;,
              //NOCH SO EINIGE ANDERE!
                    CERT_DESCRIPTION= :CERT_DESCRIPTION; 
                    WHERE V_Nr = 
            $V_Nr
            hier am ende die klammer schließen und semikolon setzen.

            Kommentar


            • #7
              Ja stimmt, fehlt aber nur in meiner Post hier, im QT habe ich das.
              Habe nämlich hier im Post die Klammer auch nicht geschlossen, ich update den Beitrag oben grade mal

              Kommentar


              • #8
                PHP-Code:
                $stmt->execute(array(':veranst_kurz' => $_POST['veranst_kurz'], ':Veranstalter0' => $_POST['Veranstalter0'], ':CERT_DESCRIPTION' => $_POST['CERT_DESCRIPTION'])); 
                und wenn du bindValue weglässt und anstattdessen so machst?

                Ich bin auch noch ziemlich frisch auf diesem Gebiet, aber ich meine, diese Kombination
                PHP-Code:
                $pdo = new PDO("mysql:host=$server;dbname=s0.alpha"$user$pass) or die(mysql_error()); 
                sieht arg komisch aus. Ich dachte PDO sei eine Schnittstelle für alle Datenbanken, also auch alle nicht-mysql. Wie bei der Instanziierung von PDO ein mysql_error entstehen?!

                Kommentar


                • #9
                  Danke, das werde ich mal probieren!
                  Kann jetzt ein bisschen dauern, aber ich mache mich direkt an die Arbeit!
                  Ich verrate dir das Ergebnis dann gleich ^^

                  Kommentar


                  • #10
                    Also folgendes:
                    Ich habe es jetzt nur mal mit ':veranst_kurz' und ':Veranstalter0' probiert und da ist wenigstens schonmal der Fehler weg.
                    Aber er übernimmt das Update trotzdem nicht =/

                    Und bezüglich des mysql_errors hast du natürlich auch Recht, daran habe ich garnicht gedacht
                    Habe mit PDO heute erst angefangen ^^

                    Kommentar


                    • #11
                      mach mal einen rowCount() und baue eine try-catch-Anweisung, damit PDO eine Exception rausspuckt.

                      Kommentar


                      • #12
                        Da wäre noch eine Frage bezüglich des Updates...
                        Führt die execute-Anweisung direkt den Update-Befehl aus?
                        Denn, wie gesagt, der Fehler taucht nicht mehr auf, aber das Update findet leider auch nicht statt =/

                        Kommentar


                        • #13
                          execute() führt alles aus. Du solltest dich mehr im Manual einlesen.
                          PHP: PDOStatement->execute - Manual Es finden sich dort auch immer sehr nützliche Userbeispiele für die jeweiligen Methoden.

                          Kommentar


                          • #14
                            Das habe ich bereits gelesen.
                            Am Anfang habe ich sogar einen execute bezogenen Fehler bekommen, da dachte ich schon, dass man nach jedem bindValue ein execute machen muss, aber das muss man ja zum Glück nicht ^^
                            Doch leider habe ich noch immer das Problem, dass der Update-Befehl irgendwie nicht ausgeführt wird =/

                            Kommentar


                            • #15
                              Versuche mal.
                              PHP-Code:

                              try {    $pdo = new PDO('mysql:host='.$server.';dbname=s0.alpha'$user$pass);
                                      
                              $pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
                                      
                              $pdo->exec('SET CHARACTER SET utf8');
                                  }
                              catch(
                              PDOException $exception)
                                  {    throw new 
                              Exception('Connection to database failed : '.$exception->getMessage().'');
                                  }
                                  
                              $setTable $pdo->prepare('UPDATE '.$table.'
                                                         SET    `veranst_kurz`     = :veranst_kurz ,
                                                                `Veranstalter0`    = :Veranstalter0,
                                                                `CERT_DESCRIPTION` = :CERT_DESCRIPTION
                                                         WHERE  `V_NR` = :V_NR'
                              );

                              $setTable->bindParam(':veranst_kurz'$_POST['veranst_kurz'],         PDO::PARAM_STR);
                              $setTable->bindParam(':Veranstalter0'$_POST['Veranstalter0'],       PDO::PARAM_STR);
                              $setTable->bindParam(':CERT_DESCRIPTION'$_POST['CERT_DESCRIPTION'], PDO::PARAM_STR);
                              $setTable->bindParam(':V_NR'$V_NrPDO::PARAM_INT);

                              $setTable->execute(); 
                              Ein Tipp von mir - alles DB bezogene klein und am besten komplett in Englisch.
                              Und verwende keine Zahlen als Feldername.

                              Ein Denglisch finde ich sehr unpassend.
                              Man sollte vornerein immer nur eine Sprache komplett einsetzen.

                              Kommentar

                              Lädt...
                              X