Haruzept: Änderung in der MySql DB mit Formular

Hallo Zusammen!

Ich sitze schon ne ganze weile an folgendem Problem.
Ich habe hier ein Formular, welches zuerst die Daten aus der DB holt.
Jetzt möchte ich gerne z.b. den Kurznamen ändern. Leider speichert er die
Änderung nicht in der Datenbank.

Wo liegt mein Fehler?

<?php  
$mysqlhost="localhost"; // MySQL-Host angeben  
$mysqluser="abc"; // MySQL-User angeben  
$mysqlpwd="abc"; // Passwort angeben  
$mysqldb="Projekte"; // Gewuenschte Datenbank angeben  
  
if($_GET['id'] == "")  
{  
$id = "0";  
}  
else $id = $_GET['id'];  
  
  
$pro ="";  
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");  
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");  
$sql = "SELECT * FROM Projekt WHERE ID = '$id'";  
$projekte_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");  
  
$pro = mysql_fetch_array($projekte_query);  
  
   echo "  
        <p>ID".$id." gefunden und kann jetzt bearbeitet werden.</p>  
     <form action='' method='post'>  
  <table border='0' cellpadding='0' cellspacing='4'>  
     <tr>  
      <td align='right'>ID:</td>  
     <td><input name='ID' type='text' size='30' maxlength='30' value='".$pro[ID]."'></td>  
    </tr>  
    <tr>  
      <td align='right'>Kurzname:</td>  
      <td><input name='Kurzname' type='text' size='30' maxlength='40' value='".$pro[Kurzname]."'></td>  
    </tr>  
    <tr>  
      <td align='right'>Langname:</td>  
      <td><input name='Langname' type='text' size='30' maxlength='40' value='".$pro[Langname]."'></td>  
    </tr>  
    <tr>  
      <td align='right'>Beschreibung:</td>  
      <td><input name='Beschreibung' type='text' size='30' maxlength='40' value='".$pro[Beschreibung]."'></td>  
    </tr>  
    <tr>  
      <td align='right'>Aufnamedatum:</td>  
      <td><input name='Aufnamedatum' type='text' size='30' maxlength='40' value='".$pro[Aufnamedatum]."'></td>  
    </tr>  
        <tr>  
      <td align='right'>Projektleiter:</td>  
      <td><input name='Projektleiter' type='text' size='30' maxlength='40' value='".$pro[Projektleiter]."'></td>  
    </tr>  
        <tr>  
      <td align='right'>Bereich:</td>  
      <td><input name='Bereich' type='text' size='30' maxlength='40' value='".$pro[Bereich]."'></td>  
    </tr>  
        <tr>  
      <td align='right'>Zeitbedarf:</td>  
      <td><input name='Zeitbedarf' type='text' size='30' maxlength='40' value='".$pro[Zeitbedarf]."'></td>  
    </tr>  
        <tr>  
      <td align='right'>Bearbeiter:</td>  
      <td><input name='Bearbeiter' type='text' size='30' maxlength='40' value='".$pro[Bearbeiter]."'></td>  
    </tr>  
        <tr >  
      <td align='right'>Aktiv:</td>  
      <td><input name='Aktiv' type='text' size='30' maxlength='40' value='".$pro[Aktiv]."'></td>  
    </tr>  
        <tr>  
      <td align='right'>Erledigt:</td>  
      <td><input name='Erledigt' type='text' size='30' maxlength='40' value='".$pro[Erledigt]."'></td>  
    </tr>  
  </table>  
<input type='submit' name='save' value=' Speichern '>  
<input type='reset' name='reset' value=' reset '>  
</form>  
";  
if ($_POST['save']) {  
      $update = mysql_query("UPDATE Projekt SET Kurzname = '{$_POST['Kurzname']}' WHERE ID = '{$_POST['$id']}'");  
}  
?>

Gruß

Haruzept

  1. Ich sitze schon ne ganze weile an folgendem Problem.

    Bleib bitte in deinem bestehenden Thread:
    https://forum.selfhtml.org/?t=207436&m=1409548

    Ich habe hier ein Formular, welches zuerst die Daten aus der DB holt.
    Jetzt möchte ich gerne z.b. den Kurznamen ändern. Leider speichert er die
    Änderung nicht in der Datenbank.

    Wozu? Bei deinem aktuellen Code ist das völlig unerheblich:
    http://example.com/foo.php?id=0'%3B%20DROP%20TABLE%20Projekt%3B--

    1. Ich sitze schon ne ganze weile an folgendem Problem.

      Bleib bitte in deinem bestehenden Thread:
      https://forum.selfhtml.org/?t=207436&m=1409548

      Ich habe hier ein Formular, welches zuerst die Daten aus der DB holt.
      Jetzt möchte ich gerne z.b. den Kurznamen ändern. Leider speichert er die
      Änderung nicht in der Datenbank.

      Wozu? Bei deinem aktuellen Code ist das völlig unerheblich:
      http://example.com/foo.php?id=0'%3B%20DROP%20TABLE%20Projekt%3B--

      Hmmm... das sind zwei Paar Schuhe.
      Mit meinem ersten Skript habe ich eine Tabelle aufgerufen, welche die Daten
      aus der DB auflistet. Das jetzige Script soll die Daten aus der DB auslesen und in das Formular einfügen. Dann sollen Änderungen wieder in die DB geschrieben werden.

    2. Hi!

      http://example.com/foo.php?id=0'%3B%20DROP%20TABLE%20Projekt%3B--

      Das funktioniert mit mysql_query() nicht. Es sind nur SQL-Injections möglich, die das aktuelle Statement erweitern.

      Lo!

  2. Hi!

    Leider speichert er die Änderung nicht in der Datenbank. Wo liegt mein Fehler?

    Wer konkret ist "er"? An welcher Stelle genau stimmen denn Wunsch und Wirklichkeit nicht mehr überein? Bitte betreibe Debugging.

    [code lang=php]<?php
    $mysqlhost="localhost"; // MySQL-Host angeben
    $mysqluser="abc"; // MySQL-User angeben
    $mysqlpwd="abc"; // Passwort angeben
    $mysqldb="Projekte"; // Gewuenschte Datenbank angeben

    if($_GET['id'] == "")
    {
    $id = "0";
    }
    else $id = $_GET['id'];

    Ob ein Array-Element vorhanden ist, prüft man mit isset() oder in speziellen Fällen wie deinem mit empty(). Der einfache lesende Zugriff auf nicht vorhandenes ergibt eine Notice-Meldung (wenn man sie sich anzeigen lässt, was beim Entwickeln immer eine gute Idee ist: error_reporting auf E_ALL stellen).

    $connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
    mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");

    "or die()" ist üblicherweise eine völlig unangemessene Art, auf Fehler zu reagieren. Sowas hinterlässt halbe Dokumente und unzufriedene Anwender.

    $sql = "SELECT * FROM Projekt WHERE ID = '$id'";

    Kontextwechsel beachten!

    echo "
            <p>ID".$id." gefunden und kann jetzt bearbeitet werden.</p>

    Kontextwechsel beachten!

    <td><input name='ID' type='text' size='30' maxlength='30' value='".$pro[ID]."'></td>

    Kontextwechsel beachten!

    ...

    if ($_POST['save']) {
          $update = mysql_query("UPDATE Projekt SET Kurzname = '{$_POST['Kurzname']}' WHERE ID = '{$_POST['$id']}'");

    Kontextwechsel beachten! Wo ist die Fehlerbehandlung? Hast du Debugging betrieben?

    Lo!

    1. Hi!

      Leider speichert er die Änderung nicht in der Datenbank. Wo liegt mein Fehler?

      Wer konkret ist "er"? An welcher Stelle genau stimmen denn Wunsch und Wirklichkeit nicht mehr überein? Bitte betreibe Debugging.

      Das Formular wird richtig dargestellt und auch der Inhalt. Bis hier ist alles wie es soll.

      Ab hier ist der Fehler

      if ($_POST['submit']) {  
            $update = ("UPDATE Projekt SET Kurzname = '{$_POST['Kurzname']}' WHERE ID = '{$_POST['$id']}'");  
      }  
      
      

      Eigentlich müsste er hier doch die im Formular unter "Kurzname" eingetragenden Infos in "Kurzename" in der DB schreiben, wo die ID halt die ID aus dem Formular ist.

      Nur warum macht er es nicht?

      1. Lieber Haruzept,

        if ($_POST['submit']) {

        $update = ("UPDATE Projekt SET Kurzname = '{$_POST['Kurzname']}' WHERE ID = '{$_POST['$id']}'");
        }

          
        dass diese Zeile Code mangels kontextgerechter Maskierung gemeingefährlich ist und eine zentrale Sicherheitslücke darstellt (warum glaubst Du wurde Sonmy so oft gechackt?), hat man Dir schon gesagt. Setze das Gesagte um!  
          
        
        > Nur warum macht er es nicht?  
          
        Was ist der Unterschied zwischen `$_POST['$id']`{:.language-php}, `$_POST[$id]`{:.language-php} und `$_POST['id']`{:.language-php}?  
          
        Liebe Grüße,  
          
        Felix Riesterer.
        
        -- 
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        
        1. Hi!

          if ($_POST['submit']) {

          $update = ("UPDATE Projekt SET Kurzname = '{$_POST['Kurzname']}' WHERE ID = '{$_POST['$id']}'");
          }

            
          Zum Debuggen sollte man sich das Statement zunächst in einer String-Variable erstellen, deren Inhalt man sich anzeigen lassen kann. Damit sieht man schonmal, ob das zusammengestückelte Statement korrekt ist. Da aber die notwendige Kontextwechselbeachtung noch fehlt, muss dieses Konstrukt sowieso nochmal umgeschrieben werden, wobei gleich noch eine Unsicherheit mit verschwindet, da nach dem Umschreiben keine ""-String-Variablenauflösung mehr vorhanden sein sollte.  
            
          Wohin ist eigentlich der Funktionsname "mysql\_query" verschwunden? Und was gibt diese Funktion für einen Wert zurück? Was bedeutet er? Was für Zusatzinformationen bekommt man im Falle eines false von mysql\_error()?  
            
          
          > Was ist der Unterschied zwischen `$_POST['$id']`{:.language-php}, `$_POST[$id]`{:.language-php} und `$_POST['id']`{:.language-php}?  
            
          Und vor allem innerhalb und außerhalb von ""-Strings.  
            
            
          Lo!