mercedes: Hilfe - SQL syntax

Hallo,
ich bräuchte mal bitte eure Hilfe.
Ich verstehe diese Meldung nicht und weiß nicht was ich da ändern muß?

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET SCHICHT = '' SET ORT = '' SET KURZBESCHREIBUNG = '' WHERE ID = '22'' at line 1"

  
if(isset($_POST["submitted"])) {  
$_sql = "UPDATE FW_Fehlerbericht";  
$_sql .= " SET M_NAME = '".$_POST["M_NAME"]."'";  
$_sql .= " SET SCHICHT = '".$_POST["SCHICHT"]."'";  
$_sql .= " SET ORT = '".$_POST["ORT"]."'";  
$_sql .= " SET KURZBESCHREIBUNG = '".$_POST["KURZBESCHREIBUNG"]."'";  
$_sql .= " WHERE ID = '".$_POST["ID"]."'";  
mysql_query($_sql,$conID);  
echo mysql_error();  
}  
else {  
$ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht ORDER BY ID" );  
echo mysql_error();  

  1. Hello,

    ich bräuchte mal bitte eure Hilfe.

    Sollst Du haben.

    Ich verstehe diese Meldung nicht und weiß nicht was ich da ändern muß?

    Erstmal würde ich mir das fertige Statement (zum Debuggen) ausgeben lassen von PHP, bevor ich es an MySQL zur Ausführung übergebe:

    "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET SCHICHT = '' SET ORT = '' SET KURZBESCHREIBUNG = '' WHERE ID = '22'' at line 1"

    if(isset($_POST["submitted"])) {
    $_sql = "UPDATE FW_Fehlerbericht";
    $_sql .= " SET M_NAME = '".$_POST["M_NAME"]."'";
    $_sql .= " SET SCHICHT = '".$_POST["SCHICHT"]."'";
    $_sql .= " SET ORT = '".$_POST["ORT"]."'";
    $_sql .= " SET KURZBESCHREIBUNG = '".$_POST["KURZBESCHREIBUNG"]."'";
    $_sql .= " WHERE ID = '".$_POST["ID"]."'";

    echo "<pre>$sql</pre>";

      
    Und dann zähle mal Deine SETs im Statement. Wieviel durften doch gleich drin sein?  
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
    Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>  
      
    
    
    1. Hello,

      echo "<pre>$sql</pre>";

      Du hattest die Variable ja $_sql genannt...
      Dann sollten wir die auch benutzten

      echo "<pre>$_sql</pre>";

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. ...so sieht die Ausgabe aus.

        Gruß

        You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET SCHICHT = '' SET ORT = '' SET KURZBESCHREIBUNG = '' WHERE ID = '22'' at line 1

        UPDATE FW_Fehlerbericht SET M_NAME = 'mmmm' SET SCHICHT = '' SET ORT = '' SET KURZBESCHREIBUNG = '' WHERE ID = '22'

        1. Hello,

          ...so sieht die Ausgabe aus.

          You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET SCHICHT = '' SET ORT = '' SET KURZBESCHREIBUNG = '' WHERE ID = '22'' at line 1

          UPDATE FW_Fehlerbericht SET M_NAME = 'mmmm' SET SCHICHT = '' SET ORT = '' SET KURZBESCHREIBUNG = '' WHERE ID = '22'

          Ja und?
          Wie viele SET sind drin im Statement und wieviele dürfen drin sein?
          Wie lautet die Syntax von SET?

          http://dev.mysql.com/doc/refman/5.1/de/set-option.html

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi!

            Wie viele SET sind drin im Statement und wieviele dürfen drin sein?
            Wie lautet die Syntax von SET?

            Uninteressant. Die Syntax des UPDATE-Statements wäre die relevante.

            Lo!

            1. ...ich habe es mal so geändert, nun kommt eine andere Fehlermeldung!
              Unknown column 'mama' in 'field list'

              UPDATE FW\_Fehlerbericht
              SET M_NAME = mama,
                  SCHICHT = fw,
                  ORT = pp,
                  KURZBESCHREIBUNG = blabla
              WHERE ID = 22

                
              <html>  
              <head>  
              <title>Update Formular</title>  
              </head>  
              <body>  
                
              <form action="<?php echo $PHP_SELF; ?>" method="post">  
              <?php  
              // Datenbankzugriff  
              include("admin/includes/config.php");  
              error_reporting(E_ALL);ini_set('display_errors', 1);  
                
              $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Momentan leider keine Verbindung zum Server. Wir bitten um Ihr Verstaendnis!" );  
              mysql_select_db( $db_name, $conID ) or die ( "Server Error. Wir bitten um Ihr Verstaendnis" );  
                
              if(isset($_POST["submitted"])) {  
              $_sql = "UPDATE `FW_Fehlerbericht`  
              SET M_NAME = ".$_POST['M_NAME'].",  
                  SCHICHT = ".$_POST['SCHICHT'].",  
                  ORT = ".$_POST['ORT'].",  
                  KURZBESCHREIBUNG = ".$_POST['KURZBESCHREIBUNG']."  
              WHERE ID = ".$_POST['ID']."";  
              mysql_query($_sql,$conID);  
                
              echo mysql_error();  
              echo "<pre>$_sql</pre>";  
                
              }  
              else {  
              $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht ORDER BY ID" );  
              echo mysql_error();  
                
              while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {  
              $ID = $datensatz["ID"];  
              $M_NAME = $datensatz["M_NAME"];  
              $SCHICHT = $datensatz["SCHICHT"];  
              $ORT = $datensatz["ORT"];  
              $KURZBESCHREIBUNG = $datensatz["KURZBESCHREIBUNG"];  
              ?>  
              <table>  
              <tr>  
              <td valign="top"><input type="text" id="ID" name="ID" size="35" value="<?php echo $ID; ?>"></td>  
              <td valign="top"><input type="text" id="M_NAME" name="M_NAME" size="35" value="<?php echo $M_NAME; ?>"></td>  
              <td valign="top"><input type="text" id="SCHICHT" name="SCHICHT" size="35" value="<?php echo $SCHICHT; ?>"></td>  
              <td valign="top"><input type="text" id="ORT" name="ORT" size="35" value="<?php echo $ORT; ?>"></td>  
              <td valign="top"><input type="text" id="KURZBESCHREIBUNG" name="KURZBESCHREIBUNG" size="35" value="<?php echo $KURZBESCHREIBUNG; ?>"></td>  
              <td><p></td>  
              </tr>  
              </table>  
                
              <?php  
              }  
                
              mysql_close($conID);  
                
              ?>  
              <input type="submit" name="submitted" value="&Uuml;bernehmen">  
              </form>  
              <?php  
                
              }  
                
              ?>  
              </html>  
              
              
              1. Hallo,

                ...ich habe es mal so geändert, nun kommt eine andere Fehlermeldung!
                Unknown column 'mama' in 'field list'

                UPDATE FW\_Fehlerbericht
                SET M_NAME = mama, [...]

                Logisch. Du sagst MySQL ja auch, dass er(?) der Spalte »M_NAME« den Wert der Spalte »mama« zuweisen soll - da es die Spalte aber nicht gibt, mault MySQL halt ... Du willst der Spalte »M_NAME« vermutlich den String »mama« zuweisen, oder?

                Gruß,
                Tobias

                1. ...ich habs!
                  Danke für die Denkanstöße!
                   So nun habe ich ein weiteres Problem.
                  Ich möchte per ID Übergabe einen Datensatz auslesen.
                  In der Adresszeile steht folgendes:

                  http://.../bearbeiten_.php?ID=23

                  und nach Aufruf der Seite bleibt die komplette Seite leer. Was ist daran ".mysql_real_escape_string($_GET["ID"]);" falsch?

                    
                  <html>  
                  <head>  
                  <title>Update Formular</title>  
                  </head>  
                  <BODY onLoad="CheckStations()">  
                    
                  <form action="<?php echo $PHP_SELF; ?>" method="post">  
                  <?php  
                  // Datenbankzugriff  
                  include("admin/includes/config.php");  
                  error_reporting(E_ALL);ini_set('display_errors', 1);  
                    
                  $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Momentan leider keine Verbindung zum Server. Wir bitten um Ihr Verstaendnis!" );  
                  mysql_select_db( $db_name, $conID ) or die ( "Server Error. Wir bitten um Ihr Verstaendnis" );  
                    
                  if(isset($_POST["submitted"])) {  
                  $_sql = "UPDATE FW_Fehlerbericht  
                  SET M_NAME = '".$_POST["M_NAME"]."',  
                      SCHICHT = '".$_POST["SCHICHT"]."',  
                      ORT = '".$_POST["ORT"]."',  
                      BESCHREIBUNG = '".$_POST["BESCHREIBUNG"]."'  
                      WHERE ID = ".$_POST["ID"]."";  
                  mysql_query($_sql,$conID);  
                    
                  echo mysql_error();  
                  echo "<pre>$_sql</pre>";  
                    
                  }  
                  else {  
                  $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);  
                    
                  echo mysql_error();  
                  echo "<pre>$ergebnis</pre>";  
                    
                  while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {  
                  $M_NAME = $datensatz["M_NAME"];  
                  $SCHICHT = $datensatz["SCHICHT"];  
                  $ORT = $datensatz["ORT"];  
                  $BESCHREIBUNG = $datensatz["BESCHREIBUNG"];  
                    
                  ?>  
                    <div>  
                      Datensatz Nr.:&nbsp;<?=$datensatz['ID']?><p>	  
                    </div>  	  
                    
                  <table>  
                  <tr>  
                  <td valign="top"><input type="text" id="M_NAME" name="M_NAME" size="35" value="<?php echo $M_NAME; ?>"></td>  
                  <td valign="top"><input type="text" id="SCHICHT" name="SCHICHT" size="35" value="<?php echo $SCHICHT; ?>"></td>  
                  <td valign="top"><input type="text" id="ORT" name="ORT" size="35" value="<?php echo $ORT; ?>"></td>  
                  <td valign="top"><input type="text" id="BESCHREIBUNG" name="BESCHREIBUNG" size="35" value="<?php echo $BESCHREIBUNG; ?>"></td>  
                  <td><p></td>  
                  </tr>  
                  </table>  
                    
                  <?php  
                  }  
                    
                  mysql_close($conID);  
                    
                  ?>  
                  <input type="submit" name="submitted" value="&Uuml;bernehmen">  
                  </form>  
                  <?php  
                    
                  }  
                    
                  ?>  
                  </html>
                  
                  1. Hi!

                    Was ist daran ".mysql_real_escape_string($_GET["ID"]);" falsch?
                    $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);

                    Die Antwort dazu habe ich dir schon verlinkt. Wenn du damit ein Verständnisproblem hast, dann frag bitte konkret.

                    Und bitte bleib bei einem Namen. Je mehr Spielchen du gegen die hiesige Charta unternimmst, desto mehr sinkt die Bereitschaft beim Stammpublikum, sich ernsthaft mit deinen Problemen zu befassen. Wenn du dir das leisten kannst, ...

                    Lo!

                    1. Hi!

                      Was ist daran ".mysql_real_escape_string($_GET["ID"]);" falsch?
                      $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);

                      ..mhh,
                      tut mir leid ich raffe es einfach nicht was geändert werden muß.

                      Gruß

                      1. Hallo!

                        Was ist daran ".mysql_real_escape_string($_GET["ID"]);" falsch?
                        $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);

                        tut mir leid ich raffe es einfach nicht was geändert werden muß.

                        Locker bleiben! Wir versuchen es, wie die alten Römer - divide et impera: will heißen wir teilen unser großes (PHP/SQL) Problem in kleinere Probleme auf!

                        Beginnen wir mit SQL - was steht im String ~~~php

                        "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]

                        ?

                        Diesen reichst du ja per PHP an den mySQL-Server zur Ausführung weiter.  
                        Was passiert, wenn Du dieses Statement direkt an den My-Sql-Server sendest (Fehlermeldung)?  
                        Was sagt Dein [Error Reporting in PHP](http://de.php.net/manual/de/function.error-reporting.phphttp://de.php.net/manual/de/function.error-reporting.php)?  
                          
                        Zum Schluß ein Tipp: auf SELFHTML gibt es einen Artikel zum Thema  [Kontextwechsel](http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/) - lies diesen, denn er beseitigt IMHO einige grundlegende Verständnisprobleme von Anfängern. Nach der Lektüre wird es Dir auch nicht mehr passieren, dass Du versuchst, PHP-Code (der nur innerhalb eines Strings rudimentären SQL-Code enthält), als SQL-Code zu "highlighten".  
                          
                        Auch wenn diverse Magazine und "Bücher", sowie Online-Artikel es immer wieder suggerieren: der Umgang mit PHP, SQL und diversen Webtechniken ist nicht trivial - schon gar nicht in der Kombination.  
                        Ciao  
                        GG  
                        
                        -- 
                        "If I do not seek to understand what is happening here  
                        - then I've got peanuts in my head!"  
                        (I. Hosein) 
                        
                        1. [/code]
                          Diesen reichst du ja per PHP an den mySQL-Server zur Ausführung weiter.
                          Was passiert, wenn Du dieses Statement direkt an den My-Sql-Server sendest (Fehlermeldung)?
                          Was sagt Dein Error Reporting in PHP?

                          ...danke für die Ausdauer,
                          das Problem ist "ich sehe nichts" der Bildschirm bleibt Weiß!

                          Gruß

                          1. Hi!

                            ...danke für die Ausdauer,
                            das Problem ist "ich sehe nichts" der Bildschirm bleibt Weiß!

                            Wir sehen auch nichts. Das liegt zum einen daran, dass wir weder vor deinem Rechner sitzen noch über deine Schulter schauen können, um zu sehen, was du konkret gemacht hast.

                            Wenn keine Ausgabe erfolgt, dann musst du deinem Script beibringen gesprächiger zu sein. Beispiele:

                            Ein echo als Kontrollausgabe ist ja ganz nett für den Anfang, aber bei bestimmten Werten gibt es einfach mal nichts aus. Ein var_dump() ist da deutlich auskunftsfreudiger.

                            Wenn ein Script keine Ausgabe erzeugt (auch nicht in der Quelltextansicht des Browsers), dann kann es daran liegen, dass es leise stirbt. display_error sollte aber schon auf on stehen, was man mit phpinfo() überprüfen kann. Wenn das der Fall ist und immer noch keine Ausgabe erfolgt, kann man mit die('testext'); eine Ausgabe und einen Abbruch veranlassen. Das setzt man am Scriptanfang ein, lässt es laufen und sieht eine Ausgabe. Man versetzt es immer weiter nach hinten und wenn die Ausgabe wegbleibt, ist man schon recht nahe am Übeltäter.

                            Lo!

                          2. Hallo!

                            [/code]
                            Diesen reichst du ja per PHP an den mySQL-Server zur Ausführung weiter.
                            Was passiert, wenn Du dieses Statement direkt an den My-Sql-Server sendest (Fehlermeldung)?
                            Was sagt Dein Error Reporting in PHP?

                            ...danke für die Ausdauer,
                            das Problem ist "ich sehe nichts" der Bildschirm bleibt Weiß!

                            Steht auch nichts im Quellcode, der beim Browser ankommt?
                            Welche Einstellungen für o.a. error_reporting hast Du?
                            Was genau hast Du bislang _wie_ versucht, auszugeben (per echo, print_r oder am besten var_dump)?
                            Was steht in $_POST, wie lautet die SQL-Query ($_sql) ...?

                            Ciao

                            GG

                            --
                            "If I do not seek to understand what is happening here
                            - then I've got peanuts in my head!"
                            (I. Hosein)
                          3. ...ich glaube, jetzt hab ich's, zumindest es funktioniert.
                            Ist das denn jetzt von eurer Seite so i.O.?

                              
                            <html>  
                            <head>  
                            <title>Update Formular</title>  
                            </head>  
                            <BODY onLoad="CheckStations()">  
                              
                            <form action="<?php echo $PHP_SELF; ?>" method="post">  
                            <?php  
                            // Datenbankzugriff  
                            include("admin/includes/config.php");  
                            error_reporting(E_ALL);ini_set('display_errors', 1);  
                              
                            $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Momentan leider keine Verbindung zum Server. Wir bitten um Ihr Verstaendnis!" );  
                            mysql_select_db( $db_name, $conID ) or die ( "Server Error. Wir bitten um Ihr Verstaendnis" );  
                              
                            if(isset($_POST["submitted"])) {  
                            $_sql = "UPDATE FW_Fehlerbericht  
                            SET M_NAME = '".$_POST["M_NAME"]."',  
                                SCHICHT = '".$_POST["SCHICHT"]."',  
                                ORT = '".$_POST["ORT"]."',  
                                KURZBESCHREIBUNG = '".$_POST["KURZBESCHREIBUNG"]."'  
                                WHERE ID = ".$_POST["ID"]."";  
                            mysql_query($_sql,$conID);  
                              
                            echo mysql_error();  
                            echo "<pre>$_sql</pre>";  
                              
                            }  
                            else {  
                            $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".intval($_GET["ID"]));  
                              
                            echo mysql_error();  
                            echo "<pre>$ergebnis</pre>";  
                              
                            while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {  
                            $ID = $datensatz["ID"];  
                            $M_NAME = $datensatz["M_NAME"];  
                            $SCHICHT = $datensatz["SCHICHT"];  
                            $ORT = $datensatz["ORT"];  
                            $KURZBESCHREIBUNG = $datensatz["KURZBESCHREIBUNG"];  
                              
                            ?>  
                              <div>  
                                Datensatz Nr.:&nbsp;<?=$datensatz["ID"]?><p>  
                              </div>  
                              
                            <table>  
                            <tr>  
                            <td valign="top"><input type="text" id="ID" name="ID" size="35" value="<?php echo $ID; ?>"></td>  
                            <td valign="top"><input type="text" id="M_NAME" name="M_NAME" size="35" value="<?php echo $M_NAME; ?>"></td>  
                            <td valign="top"><input type="text" id="SCHICHT" name="SCHICHT" size="35" value="<?php echo $SCHICHT; ?>"></td>  
                            <td valign="top"><input type="text" id="ORT" name="ORT" size="35" value="<?php echo $ORT; ?>"></td>  
                            <td valign="top"><input type="text" id="KURZBESCHREIBUNG" name="KURZBESCHREIBUNG" size="35" value="<?php echo $KURZBESCHREIBUNG; ?>"></td>  
                            <td><p></td>  
                            </tr>  
                            </table>  
                              
                            <?php  
                            }  
                              
                            mysql_close($conID);  
                              
                            ?>  
                            <input type="submit" name="submitted" value="&Uuml;bernehmen">  
                            </form>  
                            <?php  
                              
                            }  
                              
                            ?>  
                            </html>  
                            
                            
                            1. Hi!

                              Ist das denn jetzt von eurer Seite so i.O.?

                              Von i.O. ist es meiner Meinung nach noch recht weit entfernt. Du hast immer noch nicht die Problematik des Kontextwechsels verstanden und so klaffen noch weitere Sicherheitslücken in deinem Code.

                              <form action="<?php echo $PHP_SELF; ?>" method="post">

                              $PHP_SELF existiert zum einen nur, wenn register_globals aktiv ist, was aber schon seit Jahren nicht mehr empfohlen wird. Zudem ist das unbehandelte Einfügen als Formularziel schon die erste Lücke. htmlspecialchars() zu verwenden ist das mindeste, $_SERVER['SCRIPT_NAME'] wäre eine weitere Möglichkeit. Du kannst aber auch einfach, problemlos und ohne Sicherheitsrisiko action="" notieren, um das Formular an sich selbst zu senden.

                              error_reporting(E_ALL);ini_set('display_errors', 1);

                              Das solltest du nur für das Entwickeln aktiviert haben. Im Produktivbetrieb will man Informationen zu Fehlern nicht an alle möglichen Besucher  rausgeben. Vielen werden sie nichts nützen und die anderen lesen daraus Informationen, die sie gegen dich verwenden können.

                              $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Momentan leider keine Verbindung zum Server. Wir bitten um Ihr Verstaendnis!" );
                              mysql_select_db( $db_name, $conID ) or die ( "Server Error. Wir bitten um Ihr Verstaendnis" );

                              "or die()" - schnell und schmerzhaft - gern genommen und meist keine akzeptable Art, auf Fehler zu reagieren. Was machen deine Kunden, wenn sie diesen Fehler sehen? Wirklich Verständnis haben oder zur Konkurrenz laufen (mal angenommen dass das eine Alternative wäre)?

                              if(isset($_POST["submitted"])) {
                              $_sql = "UPDATE FW_Fehlerbericht
                              SET M_NAME = '".$_POST["M_NAME"]."',
                                  SCHICHT = '".$_POST["SCHICHT"]."',
                                  ORT = '".$_POST["ORT"]."',
                                  KURZBESCHREIBUNG = '".$_POST["KURZBESCHREIBUNG"]."'
                                  WHERE ID = ".$_POST["ID"]."";
                              mysql_query($_sql,$conID);

                              Kontextwechsel beachten!

                              echo mysql_error();
                              echo "<pre>$_sql</pre>";

                              Was macht denn das hier noch?

                              $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".intval($_GET["ID"]));

                              Wenigstens das ist einigermaßen in Ordnung.

                              echo mysql_error();
                              echo "<pre>$ergebnis</pre>";

                              Wenn ein Fehler auftritt, musst du den Programmablauf komplett ändern. "or die()" ist keine schöne Möglichkeit dazu.

                              while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {

                              Aber einfach mit der Abfrage fortzufahren erzeugt nur Folgefehler.

                              $ID = $datensatz["ID"];
                              $M_NAME = $datensatz["M_NAME"];
                              $SCHICHT = $datensatz["SCHICHT"];
                              $ORT = $datensatz["ORT"];
                              $KURZBESCHREIBUNG = $datensatz["KURZBESCHREIBUNG"];

                              Hat diese Umkopiererei aus deiner Sicht einen Nutzen?

                              Datensatz Nr.:&nbsp;<?=$datensatz["ID"]?><p>
                              <td valign="top"><input type="text" id="ID" name="ID" size="35" value="<?php echo $ID; ?>"></td>
                              <td valign="top"><input type="text" id="M_NAME" name="M_NAME" size="35" value="<?php echo $M_NAME; ?>"></td>
                              <td valign="top"><input type="text" id="SCHICHT" name="SCHICHT" size="35" value="<?php echo $SCHICHT; ?>"></td>
                              <td valign="top"><input type="text" id="ORT" name="ORT" size="35" value="<?php echo $ORT; ?>"></td>
                              <td valign="top"><input type="text" id="KURZBESCHREIBUNG" name="KURZBESCHREIBUNG" size="35" value="<?php echo $KURZBESCHREIBUNG; ?>"></td>

                              Auch hier sind wieder die Kontextwechsel zu HTML nicht beachtet worden. Man muss ja noch nicht mal was böses wollen, es reicht einfach schon, als Kurzbeschreibung etwas mit "Anführungszeichen" eingegeben zu haben, um das value=" zu beenden. Und dann wunderst du dich, dass nur ein Teil angezeigt wird.

                              <input type="submit" name="submitted" value="&Uuml;bernehmen">

                              Es ist fast immer besser, eine Zeichencodierung zu benutzen, die es erlaubt, die Zeichen in ihrer normalen Form zu verwenden, anstatt Zeichen-Entity-Referenzen oder numerische Zeichenreferenzen zu verwenden.

                              Lo!

                              1. Kontextwechsel beachten!

                                ... tut mir Leid, das mit dem "Kontextwechsel" verstehe ich einfach nicht

                                  
                                <html>  
                                <head>  
                                <title>Update Formular</title>  
                                </head>  
                                <BODY onLoad="CheckStations()">  
                                  
                                <form action="" method="post">  
                                <?php  
                                // Datenbankzugriff  
                                include("admin/includes/config.php");  
                                  
                                $conID = mysql_connect($db_host, $db_user, $db_pass );  
                                if (!$conID) {  
                                    die('keine Verbindung möglich: ' . mysql_error());  
                                }  
                                  
                                mysql_select_db( $db_name, $conID );  
                                  
                                if(isset($_POST["submitted"])) {  
                                $_sql = "UPDATE FW_Fehlerbericht  
                                SET M_NAME = '".$_POST["M_NAME"]."',  
                                    SCHICHT = '".$_POST["SCHICHT"]."',  
                                    ORT = '".$_POST["ORT"]."',  
                                    KURZBESCHREIBUNG = '".$_POST["KURZBESCHREIBUNG"]."'  
                                    WHERE ID = ".$_POST["ID"]."";  
                                $ergebnis = mysql_query($_sql,$conID);  
                                if (!$ergebnis) {  
                                echo "Es ist ein Fehler aufgetreten: ".mysql_error($conID);  
                                }  
                                }  
                                $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".intval($_GET["ID"]));  
                                  
                                while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {  
                                  
                                ?>  
                                  <div>  
                                    Datensatz Nr.:&nbsp;<?=$datensatz["ID"]?><p>  
                                  </div>  
                                  
                                <table>  
                                <tr>  
                                <td valign="top"><input type="hidden" id="ID" name="ID" size="35" value="<?php echo $datensatz["ID"]; ?>"></td>  
                                <td valign="top"><input type="text" id="M_NAME" name="M_NAME" size="35" value="<?php echo $datensatz["M_NAME"]; ?>"></td>  
                                <td valign="top"><input type="text" id="SCHICHT" name="SCHICHT" size="35" value="<?php echo $datensatz["SCHICHT"]; ?>"></td>  
                                <td valign="top"><input type="text" id="ORT" name="ORT" size="35" value="<?php echo $datensatz["ORT"]; ?>"></td>  
                                <td valign="top"><input type="text" id="KURZBESCHREIBUNG" name="KURZBESCHREIBUNG" size="35" value="<?php echo $datensatz["KURZBESCHREIBUNG"]; ?>"></td>  
                                <td><p></td>  
                                </tr>  
                                </table>  
                                  
                                <?php  
                                  
                                mysql_close($conID);  
                                  
                                ?>  
                                <input type="submit" name="submitted" value="&Uuml;bernehmen">  
                                </form>  
                                <?php  
                                  
                                }  
                                  
                                ?>  
                                </html>
                                
                                1. Hi!

                                  Kontextwechsel beachten!
                                  ... tut mir Leid, das mit dem "Kontextwechsel" verstehe ich einfach nicht

                                  <input type="text" name="foo" value="bar">

                                  Das dürfte dir bekannt sein. Wenn am Ende

                                  <input type="text" name="foo" value="benutzereingabe">

                                  rauskommen soll und die Benutzereingabe

                                  Hallo "Welt"!

                                  lautet, dann bekommst du als Ergebnis, wenn du das einfach so einfügst

                                  <input type="text" name="foo" value="Hallo "Welt"!">

                                  Das " vor dem Welt beendet den mit dem " nach dem value= begonnenen Attributtext. Das darf nicht sein. Richtig wäre

                                  <input type="text" name="foo" value="Hallo &quot;Welt&quot;!">

                                  Du hattest mit

                                  Hallo "Welt"!

                                  einen String. Den willst du in den Kontext "HTML-Code" einfügen, also musst du die HTML-Regeln beachten und " als &quot; notieren.

                                  Und das musst du in jedem Fall beachten, wann immer du Daten irgendwo einfügst. In meinem Beispiel siehst du das recht deutlich, aber in der Praxis verbergen sich die Strings gern in Variablen.

                                  <input type="text" name="foo" value="$wert">

                                  Einem $wert siehst du es derzeit nicht an, aber zur Laufzeit kann da alles mögliche drinstehen, auch " (Anführungszeichen). Deswegen ist es so wichtig, dass du die Kontextwechsel (richtig) erkennst und weißt, was zu unternehmen ist, um die einzufügenden Werte korrekt zu behandeln.

                                  printf('<input type="text" name="foo" value="%s">', htmlspecialchars($wert));

                                  Lo!

                      2. Hi!

                        Was ist daran ".mysql_real_escape_string($_GET["ID"]);" falsch?
                        $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);

                        ..mhh, tut mir leid ich raffe es einfach nicht was geändert werden muß.

                        Dann hast du das Problem an sich noch nicht verstanden und es wäre schön, was du an dem verlinkten Artikel nicht verstanden hast, so dass ich das für eine (eventuelle) Überarbeitung berücksichtigen kann.

                        mysql_real_escape_string() ist dafür da, einige innerhalb eines String vorkommende Zeichen so zu umzuschreiben, dass sie weder den String beenden noch anderweitig missverständlich für den SQL-Statement-Interpreter sind. Nun gedenkst du aber eine Zahl zu übergeben und lässt deshalb die stringbegrenzenden Anführungszeichen weg. Für die Zahl ist das kein Problem, wenn du sicherstellst, dass es wirklich eine Zahl ist, was beispielsweise mit intval() erreicht werden kann.

                        Da du keinen String anfängst, ist es so wie es jetzt ist, für einen Angreifer überhaupt kein Problem, SQL-Injection auszuführen, weil du immer noch im Code-Modus bist und nicht mit den Anführungszeichen den String-Modus eingeleitet hast.

                        SELECT * FROM tabelle WHERE ID = benutzereingabe
                        SELECT * FROM tabelle WHERE ID = 0 OR ...
                        SELECT * FROM tabelle WHERE ID = '0 OR ...'

                        Der Unterschied ist nun, dass in Zeile 3 das >0 OR ...< als String angesehen wird und maximal ein falsches Ergebnis liefert, in Zeile 2 aber als Code interpretiert wird. Das mysql_real_escape_string() hilft an der Stelle nichts, weil es an der Eingabe nichts verändert. Es kommen einfach keine Zeichen vor, die davon behandelt werden müssen. Selbst Strings kann man ohne Anführungszeichen notieren, wenn diese für einen Angriff notwendig wären.

                        Alternativ zum intval() kannst du auch die Zahl als String notieren, also mit Anführungszeichen drumrum, dann kannst und solltest du auch wieder mysql_real_escape_string() verwenden.

                        Lo!

                        1. Hello Dedlfix,

                          SELECT * FROM tabelle WHERE ID = benutzereingabe
                          SELECT * FROM tabelle WHERE ID = 0 OR ...
                          SELECT * FROM tabelle WHERE ID = '0 OR ...'

                          diese Form der Darstellung finde ich gut. Man sieht sofort, was Sache ist!
                          SO solltest Du das noch nachtragen für die verschiedenen SQL-Fälle in deinem Artikel.

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                          Nur selber lernen macht schlau
                          http://bergpost.annerschbarrich.de
                          1. Hi!

                            SELECT * FROM tabelle WHERE ID = benutzereingabe
                            SELECT * FROM tabelle WHERE ID = 0 OR ...
                            SELECT * FROM tabelle WHERE ID = '0 OR ...'

                            diese Form der Darstellung finde ich gut. Man sieht sofort, was Sache ist!
                            SO solltest Du das noch nachtragen für die verschiedenen SQL-Fälle in deinem Artikel.

                            Ich habs mir mal notiert.

                            Lo!

              2. Hello,

                Unknown column 'mama' in 'field list'

                und hat deine Tabelle eine Spalte namens "mama"? Wenn nein, dann ist

                SET M_NAME = mama,

                das hier nicht das was du meinst. Schau dir die Verwendung von String-Typen an, Anführungszeichen wären ein Zauberwort...

                MfG
                Rouven

                --
                -------------------
                sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
                Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
            2. Hello,

              Wie viele SET sind drin im Statement und wieviele dürfen drin sein?
              Wie lautet die Syntax von SET?

              Uninteressant. Die Syntax des UPDATE-Statements wäre die relevante.

              Oh, Entschuldigung. Nicht richtig hingeguckt beim Verlinken.
              Danke für die Richtigstellung

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
    2. ...wo muß ich denn das "echo "<pre>$sql</pre>";" einfügen

        
      <html>  
      <head>  
      <title>Update Formular</title>  
      </head>  
      <body>  
        
      <form action="<?php echo $PHP_SELF; ?>" method="post">  
      <?php  
      // Datenbankzugriff  
      include("admin/includes/config.php");  
      error_reporting(E_ALL);ini_set('display_errors', 1);  
        
      $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Momentan leider keine Verbindung zum Server. Wir bitten um Ihr Verstaendnis!" );  
      mysql_select_db( $db_name, $conID ) or die ( "Server Error. Wir bitten um Ihr Verstaendnis" );  
        
        
      if(isset($_POST["submitted"])) {  
      $_sql = "UPDATE FW_Fehlerbericht";  
      $_sql .= " SET M_NAME = '".$_POST["M_NAME"]."'";  
      $_sql .= " SET SCHICHT = '".$_POST["SCHICHT"]."'";  
      $_sql .= " SET ORT = '".$_POST["ORT"]."'";  
      $_sql .= " SET KURZBESCHREIBUNG = '".$_POST["KURZBESCHREIBUNG"]."'";  
      $_sql .= " WHERE ID = '".$_POST["ID"]."'";  
      mysql_query($_sql,$conID);  
      echo mysql_error();  
        
      }  
      else {  
      $ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht ORDER BY ID" );  
      echo mysql_error();  
        
      while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {  
      $ID = $datensatz["ID"];  
      $M_NAME = $datensatz["M_NAME"];  
      $SCHICHT = $datensatz["SCHICHT"];  
      $ORT = $datensatz["ORT"];  
      $KURZBESCHREIBUNG = $datensatz["KURZBESCHREIBUNG"];  
      ?>  
      <table>  
      <tr>  
      <td valign="top"><input type="text" id="ID" name="ID" size="35" value="<?php echo $ID; ?>"></td>  
      <td valign="top"><input type="text" id="M_NAME" name="M_NAME" size="35" value="<?php echo $M_NAME; ?>"></td>  
      <td valign="top"><input type="text" id="SCHICHT" name="SCHICHT" size="35" value="<?php echo $SCHICHT; ?>"></td>  
      <td valign="top"><input type="text" id="ORT" name="ORT" size="35" value="<?php echo $ORT; ?>"></td>  
      <td valign="top"><input type="text" id="KURZBESCHREIBUNG" name="KURZBESCHREIBUNG" size="35" value="<?php echo $KURZBESCHREIBUNG; ?>"></td>  
      <td><p></td>  
      </tr>  
      </table>  
        
      <?php  
      }  
        
      mysql_close($conID);  
        
      ?>  
      <input type="submit" name="submitted" value="&Uuml;bernehmen">  
      </form>  
      <?php  
        
      }  
        
      ?>  
      </html>