Ankündigung

Einklappen
Keine Ankündigung bisher.

UPDATE funktioniert nicht - Ich raste aus:D

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

  • UPDATE funktioniert nicht - Ich raste aus:D

    Hallo zusammen,
    ich raste hier gleich aus!!!!
    Ich suche seit über einer Stunde den besch...en Fehler

    Also:
    Ich habe ein Newslettersystem entwickelt, und ein biss Code geschrieben, wo man sich aus dem Newsletter wieder austragen kann.

    Hier mal ein Code-Snipet:

    PHP-Code:
    $code $_GET['code'];
        
    $dateout date("Y-m-d H:i:s",time());

        
    $email_sql "
            SELECT email, vorname, nachname
            FROM newsletter
            WHERE code = '
    $code'";
        
    $email_query $conn->query($email_sql);
        
    $data_email $email_query->fetch(PDO::FETCH_ASSOC);
        echo 
    $email $data_email['email'];

        if(isset(
    $_POST['gesendet'])){
            
    $reasonout $_POST['grund'];

            
    $austragen_sql "
                UPDATE newsletter
                SET status = :status, dateout = :dateout, reasonout = :reasonout 
                WHERE code = :code"
    ;
            
    $austragen $conn->prepare($austragen_sql);
            
    $austragen->execute(array("status" => 0"dateout" => $dateout"reasonout" => $reasonout));

            echo 
    "Schade, dass Sie sich von meinem Newsletter abgemeldet haben.<br>Ich wünsche Ihnen dennoch viel Spaß mit Ihrem Pampered Chef Produkt.";
        } 
    Zur Erklärung:
    Zunächst rufe ich die eMail-Adresse anhand einer ID ab. DIESE Abfrage funktioniert auch! Es kann also nicht an einer fehlerhaften Verbindung zu DB liegen.
    Wenn das Formular dann abgesendet wurde, möchte ich die Werte status, datout und reasonout aktualisieren.

    Aber dieser besch..ne Code funktioniert nicht.
    Vor lauter Verzweiflung habe ich auch folgendes ausprobiert:

    PHP-Code:
    $austragen_sql "
                UPDATE newsletter
                SET status = '0', dateout = '
    $dateout', reasonout = '$reasonout
                WHERE code = '
    $code'";

            if (
    mysqli_query($conn$austragen_sql)) {
                echo 
    "Record updated successfully";
            } else {
                echo 
    "Error updating record: " mysqli_error($conn);
            } 
    Dann wird "Error updating record:" angezeigt, aber kein Fehlercode ausgegeben.

    Da ich noch verzweifelter war, habe ich auch folgendes ausprobiert (mal nur mit dem status):

    PHP-Code:
    $austragen_sql "UPDATE newsletter SET status = '0' WHERE code = '$code'";
            
    $austragen->query($austragen_sql); 
    Auch das funktioniert nicht.

    Dann habe ich mir einfach mal den SQL Befehl mit eingefügten Variablen ausgegeben und bei phpMyAdmin in die Konsole eingegeben:
    DA funktioniert es... WARUM bitte nicht in meinem Script.
    Könnt ihr mir helfen?
    Ich verzweifle

    LG, Sebastian







  • #2
    status ist ein reserviertes Wort in MySQL. Benutze Backticks, eg. UPDATE `table` SET `status` = '1' WHERE ...
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Du hast eine Sicherheitslücke. Werte dürfen nicht einfach so in SQL-Abfragen eingefügt werden.

      Kommentar


      • #4
        Zitat von lstegelitz Beitrag anzeigen
        status ist ein reserviertes Wort in MySQL. Benutze Backticks, eg. UPDATE `table` SET `status` = '1' WHERE ...
        Daran liegt es leider auch nicht. Habe den Status auch mal komplett weggelassen, also nur versucht "dateout" und "reasonout" upzudaten. Doch auch das funktioniert nicht. Weiterhin hat der SQL Befehl ohne Backticks in der Konsole von phpMyAdmin funktioniert

        Kommentar


        • #5
          Zitat von hellbringer Beitrag anzeigen
          Du hast eine Sicherheitslücke. Werte dürfen nicht einfach so in SQL-Abfragen eingefügt werden.
          Auch nicht, wenn ich mit prepared-Statements arbeite? Was müsste ich denn noch ändern um es sicher zu machen?

          Kommentar


          • #6
            Zitat von lstegelitz Beitrag anzeigen
            status ist ein reserviertes Wort in MySQL. Benutze Backticks, eg. UPDATE `table` SET `status` = '1' WHERE ...
            Also hatte es so probiert:
            PHP-Code:
            $austragen_sql "
                        UPDATE newsletter
                        SET `status` = :status, dateout = :dateout, reasonout = :reasonout 
                        WHERE code = :code"
            ;
                    
            $austragen $conn->prepare($austragen_sql);
                    
            $austragen->execute(array("status" => 0"dateout" => $dateout"reasonout" => $reasonout)); 
            Würde das reichen? Aber es funktioniert nicht

            Kommentar


            • #7
              Zitat von selfmademan84 Beitrag anzeigen

              Daran liegt es leider auch nicht. Habe den Status auch mal komplett weggelassen, also nur versucht "dateout" und "reasonout" upzudaten. Doch auch das funktioniert nicht. Weiterhin hat der SQL Befehl ohne Backticks in der Konsole von phpMyAdmin funktioniert
              https://dev.mysql.com/doc/refman/5.5/en/keywords.html

              "code" ist ebenfalls reserviert... benutze doch einfach konsequent und durchgehend backticks... oder wahlweise keine reservierten Wörter als Spaltennamen
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Und auch das hier funktioniert nicht, OBWOHL die SELECT-Abfrage 10 Zeilen vorher funktioniert. Wenn wenigstens das nicht klappen würde, könnte man ja denken, es liegt an einer nicht vorhandenen Verbindung zur DB.

                PHP-Code:
                $austragen_sql "UPDATE `newsletter` SET `reasonout` = '$reasonout' WHERE `code` = '$code'";
                $austragen->query($austragen_sql); 

                Kommentar


                • #9
                  Zitat von lstegelitz Beitrag anzeigen

                  https://dev.mysql.com/doc/refman/5.5/en/keywords.html

                  "code" ist ebenfalls reserviert... benutze doch einfach konsequent und durchgehend backticks... oder wahlweise keine reservierten Wörter als Spaltennamen
                  Nochmals Danke für den Tipp Aber auch mein letzter Versuch (siehe einen Kommentar weiter oben) ist fehlgeschlagen. Auf der Seite, wo man sich für den Newsletter eintragen kann, meckert er bei status und code auch nicht, obwohl die Syntax genau die gleiche ist, wie bei meinem ersten Code-Snipet

                  Kommentar


                  • #10
                    Bastel nicht so viel herum, sondern lies dich mal ein wie man prepared statements mit named parameters in PDO verwendet.
                    Wenn dir das PHP Handbuch zu umständlich ist, hast du hier noch ein weiteres Tutorial.
                    http://wiki.hashphp.org/PDO_Tutorial...SQL_Developers

                    EDIT:
                    Und mische nicht PDO mit MYSQLI, Siehe dein Startbeitrag 2. Beispiel von dir:
                    fetch(PDO... vs. if (mysqli_query

                    Kommentar


                    • #11
                      Zitat von selfmademan84 Beitrag anzeigen
                      Auch nicht, wenn ich mit prepared-Statements arbeite? Was müsste ich denn noch ändern um es sicher zu machen?
                      Prepared Statements sind kein Wuntermittel. Wenn der Programmierer Quatsch macht, helfen auch Prepared Statements nicht. Man muss diese schon richtig verwenden.

                      Kommentar


                      • #12
                        Zitat von protestix Beitrag anzeigen
                        EDIT:
                        Und mische nicht PDO mit MYSQLI, Siehe dein Startbeitrag 2. Beispiel von dir:
                        fetch(PDO... vs. if (mysqli_query
                        Das scheint mir ein entscheidender Tipp zu sein, grade in Bezug auf eine fehlende Fehlermeldung... welche Datenbank API wird denn überhaupt benutzt?
                        Syntaktisch sehen die queries jedenfalls in Ordnung aus.
                        Hast du die Queries abgeschrieben oder per Copy&Paste in PHPMyAdmin ausprobiert?

                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #13
                          PHP-Code:

                          $austragen_sql 
                          "
                          UPDATE newsletter
                          SET status = :status, dateout = :dateout, reasonout = :reasonout
                          WHERE code = :code"
                          ;
                          $austragen $conn->prepare($austragen_sql);
                          $austragen->execute(array("status" => 0"dateout" => $dateout"reasonout" => $reasonout)); 
                          Zähl doch mal wie viele Platzhalter du beim Prepare vergibst und wie viele Platzhalter du mit dem Array bei der Ausführung mit Werten belegst.

                          Kommentar


                          • #14
                            Zitat von TessaKavanagh Beitrag anzeigen
                            Zähl doch mal wie viele Platzhalter du beim Prepare vergibst und wie viele Platzhalter du mit dem Array bei der Ausführung mit Werten belegst.
                            Oh man... Das Leben kann so einfach sein DAAAAAANKE Das war des Rätsels Lösung. Habe aber auch noch die Backticks bei den Spaltennamen hinzugefügt DAAAANKE

                            Kommentar


                            • #15
                              Backticks sind MySql spezifisch und somit eigentlich (in Belgangen Portabilität) nicht ganz im Sinne des "PDO-Erfinders". Schau mal hier - blauer Kasten: https://php-de.github.io/jumpto/pdo/...red-statements

                              Würde die weglassen. Kann man aber auch tot diskutieren - Ich sag nur SQL Dialekte etc etc..
                              PHP.de Wissenssammlung | Debugging: Finde DEINE Fehler selbst! | mysql_* ist veraltet! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__ | Kein Support per PN

                              Kommentar

                              Lädt...
                              X