AristoLion: Daten werden in der DB nicht aktualisiert

Guten Tag, mein Problem ist das ein Scriptelement zwar die Datei ausliest, aber Änderungen nicht übernimmt.

if  (isset($_GET['action'])){  
    switch ($_GET['action']) {  
        case "edit":  
            $sql = "SELECT  
                        `id`,  
                        `title`,  
                        `text`  
                    FROM  
                        `".$dbPrix."rules`  
                    WHERE  
                        `id` = '". $_GET['id'] ."'";  
            $result = mysql_query($sql)  
                or die("<b>Error:</b> ". mysql_error());  
            $row = mysql_fetch_object($result);  
  
            if (isset($_POST['sent']) && $_POST['sent']=='1') {  
                $sql = "UPDATE  
                            `".$dbPrix."rules`  
                        SET  
                            `title` = '". $_POST['title'] ."',  
                            `text` = '". $_POST['text'] ."'  
                        WHERE  
                            `id` = '". $row->id ."'";  
                mysql_query($sql)  
                    or die("<b>Error:</b> ". mysql_error());  
                print "<meta http-equiv='refresh' content='0; URL=rules_admin.php?s_id=".$_GET['s_id']."'>\n";  
            } else {  
                print "<div id='overlay' class='overlayBG'><div id='lightBox'>  
                <form action='rules_admin.php?action=edit&s_id=".$_GET['s_id']."'&id=". $_GET['id'] ."' method='post'>  
                <input name='title' type='input' value='". $row->title ."'><br>  
                <textarea cols='60' name='text' rows='10'>". $row->text ."</textarea><br>  
                <input name='sent' type='hidden' value='1'>  
                <input name='send' type='submit' value='Senden'>  
                <input name='reset' type='reset' value='Zurücksetzen'>  
  
                </form></div></div>\n";  
            }  
            break;

Ich komme irgendwie nicht auf das problem, ich hoffe ihr könnt mir helfen.

  1. if (isset($_POST['sent']) && $_POST['sent']=='1') {
                    $sql = "UPDATE
                                ".$dbPrix."rules
                            SET
                                title = '". $_POST['title'] ."',
                                text = '". $_POST['text'] ."'
                            WHERE
                                id = '". $row->id ."'";
                    mysql_query($sql)
                        or die("<b>Error:</b> ". mysql_error());

    1.) SICHERHEITSWARNUNG

    Du willst $_POST['title'] und $_POST['text'] mit mysql_real_escape_string() behandeln. Also:

    SET
          title = '". mysql_real_escape_string($_POST['title']) ."',
          text = '". mysql_real_escape_string( $_POST['text']) ."'

    Sonst ist Deine Anwendung so offen wie ein Scheunentor.

    2.)

    Du willst Debugging betreiben und vor

                     mysql_query($sql)  
                        or die("<b>Error:</b> ". mysql_error());
    

    mit

    echo $sql.'<br>'

    eine debug-Ausgabe erzwingen und danach mit mysql-affected-rows() ebenfalls zu Debug-Zwecken ausgeben, wie viele Zeilen betroffen waren.

    3.)
    dabei findest Du gleich heraus, ob überhaupt bei

     case "edit":  
     ...  
     if (isset($_POST['sent']) && $_POST['sent']=='1') {
    

    richtig verzweigt wurde.

    Jörg Reinholz

    1. Guten Tag,
      die Antwort hilft nir einwenig im Bezug auf Sicherheit, aber nicht auf die Frage nach dem
      "Warum wird es nicht in die Datenbank übernommen/gespeichert?", das ist mein grösstes Problem,
      natürlich kannes sein das du jetzt die Lösung schon mit geschrieben hast(nur ich es nicht verstehe).

      1. Tach!

        die Antwort hilft nir einwenig im Bezug auf Sicherheit, aber nicht auf die Frage nach dem "Warum wird es nicht in die Datenbank übernommen/gespeichert?", das ist mein grösstes Problem, natürlich kannes sein das du jetzt die Lösung schon mit geschrieben hast(nur ich es nicht verstehe).

        Du beziehst dich auf den ersten Teil seiner Antwort (der Kontextwechsel ist übrigens auch im HTML-Teil nicht beachtet). Der zweite (und dritte) Teil der Antwort sagte aus, dass du Debugging betreiben sollst. Wenn Wunsch und Wirklichkeit nicht übereinstimmen, muss man dem auf den Grund gehen. Kontrollausgaben (mit var_dump()) aller beteiligten Variablen und der Funktionsergebnisse sind immer noch sehr effektive und einfache Methoden zuf Ursachensuche. Ebenfalls hat es sich bewehrt, beim Entwickeln das error_reporting auf E_ALL (und display_errors auf on) stehen zu haben, damit sämtliche Hinweise angezeigt bekommt.

        Wenn du nicht weißt, wie du beim Debuggen anfangen sollst, nun, error_reporting(E_ALL); iniset('display_errors', 1); am Anfang vom Script notieren und dann mit der Ausgabe der zusammengebauten Statements sowie $row fortfahren.

        dedlfix.

        1. Guten Tag
           und erstmal einen großen Dank für die Hilfe..........das Problem ist gelöst.....
          <form action='rules_admin.php?action=edit&s_id=".$_GET['s_id']."'&id=". $_GET['id'] ."' method='post'>
          dort war der Fehler es war ein ' zwischen
          "'&id.

          Jetzt hab ich allerdings noch eine Frage und absolut keine Lösung.
          Ich möchte den 'titel' anzeigen lassen, des zu löschenden Beitrages.

                  case "delete":  
                      if (isset($_GET['check']) && $_GET['check']=='ok') {  
                          $sql = "DELETE FROM  
                                      `".$dbPrix."rules`  
                                  WHERE  
                                      `id` = '". $_GET['id'] ."'";  
                          mysql_query($sql)  
                              or die("<b>Error:</b> ". mysql_error());  
                          print "<meta http-equiv='refresh' content='0; URL=rules_admin.php?s_id=".$_GET['s_id']."'>\n";  
                      } elseif (isset($_GET['check']) && $_GET['check']=='no') {  
                          print "<meta http-equiv='refresh' content='0; URL=rules_admin.php?s_id=".$_GET['s_id']."'>\n";  
                      } else {  
                          print "Wollen Sie den Eintrag wirklich löschen?<br>\n";  
                          print "<a href='rules_admin.php?action=delete&s_id=".$_GET['s_id']."&id=". $_GET['id'] ."&check=ok'>Ja</a> |\n";  
                          print "<a href='rules_admin.php?action=delete&s_id=".$_GET['s_id']."&id=". $_GET['id'] ."&check=no'>Nein</a>\n";  
                      }  
                      break;
          

          Leider weiß ich nicht wie es bei delete funktioniert("Eintrag" soll ersetzt werden durch den title).
          Ich hoffe ihr könnt mir auch dabei helfen.
          Danke

          1. Tach!

            Ich möchte den 'titel' anzeigen lassen, des zu löschenden Beitrages.

            Den musst du entweder mit dem Löschformular übertragen oder ihn nochmal mit einem SELECT aus der Datenbank holen.

            Noch zwei Anmerkungen: Daten verändernde Operationen (also auch Löschen) sollten stets nur mit einem POST-Request ausgelöst werden. (Beim Vorgeplänkel der Sicherheitsabfrage ist GET in Ordnung.) Grund ist, dass Spider und andere Tools gern mal Links folgen, dabei auch Formulare absenden und dann sind deine Daten in einem Rutsch weg.

            Du solltest, wie schon empfohlen, unbedingt die Kontextwechsel-Problematik verstehen und deine Sicherheitslücken (SQL-Injection, XSS) beseitigen. Sicherheit ist kein Vorgang, den man im Anschluss einbaut - die entsprechenden Funktionalitäten sollten immer zusammen mit der Anwendungslogik implementiert werden.

            dedlfix.