Yadgar: Problem mit UPDATE

Hi(gh)!

Ich habe meine kleine Testdatenbank zwischenzeitlich um einige Funktionalitäten erweitert - Hinzufügen neuer Datensätze, Anzeige der Datensätze und Löschen eines Datensatzes, funktioniert alles einwandfrei. Beim Bearbeiten eines bereits vorhandenen Datensatzes gibt es allerdings Probleme: klicke ich auf "Bearbeiten" (jeweils links in der HTML-Tabellenzeile des entsprechenden Datensatzes, wird mir zwar die Eingabemaske mit dem bisher vorhandenen Wert im Feld "Name" angezeigt, das Skript wartet aber gar nicht, bis ich ich auf "Daten absenden" geklickt habe, sondern ersetzt den bisherigen Eintrag einfach durch einen Leerstring.

Hier ist der gesamte Code:

<?php  
  require("head.php");  
  head("TESTDATENBANK - Dateneingabe: Testtabelle");  
  error_reporting(E_ALL);  
  ini_set('display_errors', 1);  
?>  
  <body>  
  <div>  
    <h2>TESTDATENBANK: Dateneingabe</h2>  
    <h3>Datentabelle: hersteller</h3>  
  
    <p>  
      <a href="testtabelle.php?section=1">Neue Datensätze eingeben</a> <a href="testtabelle.php?section=2">Vorhandene Datensätze bearbeiten</a>  
    </p>  
<?  
  function enter()  
  {  
    $section = $_GET['section'];  
    if ($_GET['mode'] == 'edit')  
    {  
      $query = "SELECT Name FROM Testtabelle WHERE ID=".$_GET['id'];  
      $result = mysql_query($query);  
      $row = mysql_fetch_row($result);  
    }  
    echo '<form method="POST" action="testtabelle.php?section='.$section.'">';  
    echo '  <table>';  
    echo '    <tr>';  
    echo '      <th>';  
    echo '        Name';  
    echo '      </th>';  
    echo '      <td>';  
    echo '       <input type="text" name="Name" value="'.$row[0].'">';  
    echo '      </td>';  
    echo '    </tr>';  
    echo '    <tr>';  
    echo '      <td colspan="2">';  
    echo '        <input type="submit" value="Daten absenden">';  
    echo '      </td>';  
    echo '    </td>';  
    echo '  </table>';  
    echo '</form>';  
  }  
  
  $section = $_GET['section'];  
  
  switch ($section)  
  {  
    case 1:  
      enter();  
      $Name = $_POST['Name'];  
  
      if (!$Name)  
      {  
	echo "<p>Bitte geben Sie einen Namen ein!</p>";  
      }  
      else  
      {  
	dbcall();  
	dberror();  
	$query = 'INSERT INTO Testtabelle (Name) VALUES ("'.mysql_real_escape_string($Name).'")';  
	$result = mysql_query($query);  
	dberror();  
	echo "<p>Datensatz wurde in die Datenbank eingetragen!</p>";  
      }  
    break;  
    case 2:  
      dbcall();  
      dberror();  
      $query = "DESCRIBE Testtabelle";  
      $result = mysql_query($query);  
      dberror();  
      echo '<table>';  
      echo '<tr>';  
      echo '<td colspan="2" class="transparent">';  
      for ($i=0; $i<2; $i++)  
      {  
        $row = mysql_fetch_row($result);  
        echo '<th class="headrow">'.$row[0].'</th>';  
      }  
      echo '</tr>';  
      $i = 0;  
      $query = "SELECT * FROM Testtabelle";  
      $result = mysql_query($query);  
      dberror();  
      while ($row = mysql_fetch_row($result))  
      {  
	switch($i%2)  
	{  
	  case 0:  
	    echo '<tr class="brightrow">';  
	  break;  
	  case 1:  
	    echo '<tr class="darkrow">';  
	  break;  
	}  
	$i++;  
        echo '<th><a href="testtabelle.php?section=2&mode=prerase&id='.$row[0].'">Löschen</a></th><th><a href="testtabelle.php?section=2&mode=edit&id='.$row[0].'">Bearbeiten</a></th>';  
        echo '<td>'.$row[0].'</td><td>'.$row[1].'</td>';  
        echo '</tr>';  
      }  
      echo '</table>';  
  
      if ($_GET['mode'] == "prerase")  
        echo '<p>Wollen Sie den Datensatz wirklich löschen?  <a href="testtabelle.php?section=2&mode=erase&id='.$_GET['id'].'">ja</a> / <a href="testtabelle.php?section=2">nein</a></p>';  
  
      if ($_GET['mode'] == "erase")  
      {  
        $query = "DELETE from Testtabelle WHERE ID=".$_GET['id'];  
        $result = mysql_query($query);  
        dberror();  
        echo "<p>Der Datensatz wurde gelöscht! Erneuter Klick auf \"Vorhandene Datensätze bearbeiten\" zeigt aktuellen Stand.</p>";  
      }  
      if ($_GET['mode'] == "edit")  
      {  
        enter();  
        $Name = $_POST['Name'];  
	$query = "UPDATE Testtabelle SET Name='".mysql_real_escape_string($Name)."' WHERE ID=".$_GET['id'];  
	var_dump($query);  
	$result = mysql_query($query);  
	dberror();  
	echo "<p>Datensatz wurde geändert!</p>";  
      }  
    break;  
  }  
?>  
  </body>  
</html>	

Die var_dump()-Ausgabe von Query ergibt (bei Auswahl des Datensatzes mit der ID-Nr. 4):

string(41) "UPDATE Testtabelle SET Name='' WHERE ID=4"

Wieso ist $Name bzw. $_POST['Name'] nach dem erneuten Aufruf von enter() leer?

Bis bald im Khyberspace!

Yadgar

  1. Tach!

    klicke ich auf "Bearbeiten" (jeweils links in der HTML-Tabellenzeile des entsprechenden Datensatzes, wird mir zwar die Eingabemaske mit dem bisher vorhandenen Wert im Feld "Name" angezeigt, das Skript wartet aber gar nicht, bis ich ich auf "Daten absenden" geklickt habe, sondern ersetzt den bisherigen Eintrag einfach durch einen Leerstring.

    Das Script kann nicht warten. Es arbeitet auf dem Server und als Ergebnis kommt die Ausgabe auf den Browser. Das Script muss nun beendet sein und darf keine Tätigkeiten ausführen, die erst nach einem erneuten Request seitens des Browsers stattfinden dürfen. Üblicherweise existiert keine dauerhafte Verbindung zwischen Client und Server. Client stellt eine Anfrage, Server antwortet. Ende der Geschichte. Irgendwann der nächste Request - oder auch nicht.

    Im Klartext: Der Bearbeiten-Link erzeugt einen GET-Request. Das aufgerufene Script holt die Daten und erzeugt eine Seite mit ausgefülltem Eingabeformular. Ende des Scripts. Daten verändernde Aktionen werden mit einem POST-Request abgeschickt. Das action-Attribut des Formulars kann auch wieder auf daselbe Script zeigen. Damit hast du nun die Art des Requests als Unterscheidungsmerkmal. Wenn GET mit ID als Parameter, dann ist es der erste Teil eines Updates, dann ausgefülltes Formular zur Verfügung stellen. Wenn GET ohne ID, dann wird es wohl ein Create sein, dann leeres Formular ausgeben. Wenn POST mit ID, dann wird es der zweite Teil des Updates sein, bei POST ohne ID ist es der zweite Teil vom Create.

    Wieso ist $Name bzw. $_POST['Name'] nach dem erneuten Aufruf von enter() leer?

    Weil es ein GET-Request war?

    dedlfix.

    1. Hi(gh)!

      Wieso ist $Name bzw. $_POST['Name'] nach dem erneuten Aufruf von enter() leer?

      Weil es ein GET-Request war?

      Ich habe das Problem in der Zwischenzeit lösen können, hier der Code:

      <?php  
        require("head.php");  
        head("TESTDATENBANK - Dateneingabe: Testtabelle");  
        // error_reporting(E_ALL);  
        // ini_set('display_errors', 1);  
      ?>  
        <body>  
        <div>  
          <h2>TESTDATENBANK: Dateneingabe</h2>  
          <h3>Datentabelle: hersteller</h3>  
        
          <p>  
            <a href="testtabelle.php?section=1">Neue Datensätze eingeben</a> <a href="testtabelle.php?section=2&first=0">Vorhandene Datensätze bearbeiten</a>  
          </p>  
      <?  
        function enter()  
        {  
          $section = $_GET['section'];  
          if ($_GET['mode'] == 'edit')  
          {  
            $query = "SELECT Name FROM Testtabelle WHERE ID=".$_GET['id'];  
            $result = mysql_query($query);  
            $row = mysql_fetch_row($result);  
          }  
          echo '<form method="POST" action="testtabelle.php?section='.$section.'&mode='.$_GET["mode"].'&id='.$_GET["id"].'&first='.$_GET["first"].'&sort='.$_GET["sort"].'">';  
          echo '  <table>';  
          echo '    <tr>';  
          echo '      <th>';  
          echo '        Name';  
          echo '      </th>';  
          echo '      <td>';  
          echo '       <input type="text" name="Name" value="'.$row[0].'">';  
          echo '      </td>';  
          echo '    </tr>';  
          echo '    <tr>';  
          echo '      <td colspan="2">';  
          echo '        <input type="submit" value="Daten absenden">';  
          echo '      </td>';  
          echo '    </td>';  
          echo '  </table>';  
          echo '</form>';  
        }  
        
        $section = $_GET['section'];  
        
        switch ($section)  
        {  
          case 1:  
            enter();  
            $Name = $_POST['Name'];  
        
            if (!$Name)  
            {  
      	echo "<p>Bitte geben Sie einen Namen ein!</p>";  
            }  
            else  
            {  
      	dbcall();  
      	dberror();  
      	$query = 'INSERT INTO Testtabelle (Name) VALUES ("'.mysql_real_escape_string($Name).'")';  
      	$result = mysql_query($query);  
      	dberror();  
      	echo "<p>Datensatz wurde in die Datenbank eingetragen!</p>";  
            }  
          break;  
          case 2:  
            dbcall();  
            dberror();  
            $query = "DESCRIBE Testtabelle";  
            $result = mysql_query($query);  
            dberror();  
            echo '<table>';  
            echo '<tr>';  
            echo '<td colspan="2" class="transparent">';  
            for ($i=0; $i<2; $i++)  
            {  
              $row = mysql_fetch_row($result);  
              echo '<th class="headrow"><a href="testtabelle.php?section=2&sort='.($i+1).'&first='.$_GET['first'].'">'.$row[0].'</a></th>';  
            }  
            echo '</tr>';  
            $i = 0;  
            $query = "SELECT * FROM Testtabelle";  
            switch ($_GET['sort'])  
            {  
              case 1:  
                $query = $query." ORDER BY ID";  
              break;  
              case 2:  
                $query = $query." ORDER BY Name";  
              break;  
            }  
            $query = $query." LIMIT ".$_GET['first'].", 20";  
            $result = mysql_query($query);  
            dberror();  
            while ($row = mysql_fetch_row($result))  
            {  
      	switch($i%2)  
      	{  
      	  case 0:  
      	    echo '<tr class="brightrow">';  
      	  break;  
      	  case 1:  
      	    echo '<tr class="darkrow">';  
      	  break;  
      	}  
      	$i++;  
              echo '<th><a href="testtabelle.php?section=2&mode=prerase&id='.$row[0].'&sort='.$_GET['sort'].'&first='.$_GET['first'].'">Löschen</a></th><th><a href="testtabelle.php?section=2&mode=edit&id='.$row[0].'&sort='.$_GET['sort'].'&first='.$_GET['first'].'">Bearbeiten</a></th>';  
              echo '<td>'.$row[0].'</td><td>'.$row[1].'</td>';  
              echo '</tr>';  
            }  
            echo '</table>';  
        
            if ($_GET['mode'] == "prerase")  
              echo '<p>Wollen Sie den Datensatz wirklich löschen?  <a href="testtabelle.php?section=2&mode=erase&id='.$_GET['id'].'&sort='.$_GET['sort'].'&first='.$_GET['first'].'">ja</a> / <a href="testtabelle.php?section=2">nein</a></p>';  
        
            if ($_GET['mode'] == "erase")  
            {  
              $query = "DELETE from Testtabelle WHERE ID=".$_GET['id'];  
              $result = mysql_query($query);  
              dberror();  
              echo "<p>Der Datensatz wurde gelöscht! Erneuter Klick auf \"Vorhandene Datensätze bearbeiten\" zeigt aktuellen Stand.</p>";  
            }  
        
            if ($_GET['mode'] == "edit")  
            {  
              enter();  
              $Name = $_POST['Name'];  
              if (!$Name)  
              {  
                echo "<p>Bitte geben Sie einen neuen Namen ein</p>";  
              }  
              else  
              {  
      	  $query = "UPDATE Testtabelle SET Name='".mysql_real_escape_string($Name)."' WHERE ID=".$_GET['id'];  
      	  $result = mysql_query($query);  
      	  dberror();  
      	  echo "<p>Der Datensatz wurde geändert!</p>";  
      	}  
            }  
            echo '<p class="browse">';  
            if ($_GET['first'] >= 20)  
      	echo '<a href="testtabelle.php?section=2&first='.($_GET['first']-20).'&sort='.$_GET['sort'].'">Vorherige 20 Datensätze</a>';  
            if ($_GET['first'] >= 20 && $i % 20 == 0)  
      	echo ' | ';  
            if ($i % 20 == 0) // Ende der Datensatzliste noch nicht erreicht  
      	echo '<a href="testtabelle.php?section=2&first='.($_GET['first']+20).'&sort='.$_GET['sort'].'">Nächste 20 Datensätze</a>';  
            echo '</p>';  
          break;  
        
        }  
        
        
      ?>  
        
        </body>  
      </html>	
      

      Bis bald im Khyberspace!

      Yadgar