Yadgar: PHP/MySQL: Unterscheidung zwischen Neueintrag und Bearbeitung eines vorhandenen Datensatzes

Hi(gh)!

Nächstes Problem: nachdem ich die Anzeige der vorhandenen Datensätze fehlerfrei hinbekommen hatte, fügte ich in der Spalte "Operationen" Textlinks für "Bearbeiten" und "Löschen" hinzu. Bei "Bearbeiten" wird mit $_GET die Nummer des zu bearbeitenden Datensatzes an das Dokument gesendet und der bisherige Wert des Feldes "name" im Eingabeelement angezeigt.

Nur - wie weiß mein Formular danach, ob es jetzt einen weiteren Datensatz einfügen oder den in der Liste ausgewählten Datensatz bearbeiten soll?

Hier mein aktueller Code (bitte nicht an kosmetischen oder Sicherheitsfragen aufhalten, das kann ich auch später noch ändern):

<!DOCTYPE html lang="de">
<html>
  <head>
    <title>"GREENBOOK-Dateneingabe: Bundesland (land)"</title>
    <meta charset="UTF-8">
    <style>
      table { width:100%; padding:5px; background-color:#ffe0c2; }
      th { background-color:#ffb369; }
      th, td { text-align:left }
      tr:nth-child(2n+1) { background-color:#ffb369; } 
      td:nth-child(1) { width:20% }
      td:nth-child(2) { width:5% }
      td:nth-child(3) { width:75% }
      .error { color:#ff0000; font-weight:bold }
    </style>
  </head>
  <?php 
require("greenbook_admin_input_menu.php");
require("greenbook_functions.php");
$lengths=[22];
$db = new mysqli("localhost", "root", "***", "***");
ccheck($db);
?>
  <body>
<?php
$mode = htmlspecialchars($_GET["mode"]);
if ($mode == "edit")
  $bundesland = htmlspecialchars($_GET["bundesland"]);
else
  $bundesland = "";
?>

    <div style="position:absolute; width:74%; height:40%; top:0%; left:26%; padding-left:5px; background-color:#99ff99">
<?php
  if (!isset($_POST["liststart"]) && !isset($_POST["listend"]) && !isset($_GET["listpos"]))
  {
    $offset= 0;
    $range = 10;
  }
  else if (isset($_POST["liststart"]) && isset($_POST["listend"]))
  {
    $offset = 0;
    $range = 10;
    if ($_POST["liststart"] < 0 || $_POST["listend"] - $_POST["liststart"] < 0)
    {
      $fehler = "Fehler: erste Datensatznummer kleiner als 1 oder größer als letzte Datensatznummer!";
    }
    else if ((!empty($_POST["liststart"] && empty($_POST["listend"])) || empty($_POST["liststart"]) && !empty($_POST["listend"])))
    {
      $fehler = "Fehler: bitte Start- und End-Datensatznummer eingeben!";
    }
    else
    {
      $offset = trim(htmlspecialchars($_POST["liststart"]))-1;
      $range = trim(htmlspecialchars($_POST["listend"])) - $offset;
      $next10 = $offset + $range;
    }
  }
  else if (isset($_GET["listpos"]))
  {
    $offset = $_GET["listpos"];
    $range = 10;
    $next10 = $offset + 10;
  }

  $prev10 = $offset - 10;
  
  $sql = "SELECT COUNT(*) FROM land";
  $res = $db->query($sql);
  qcheck($res, $db);
  $zeile = $res->fetch_array();
  $all = $zeile[0];
  $last10 = $all - 10;
  
  if ($offset < 0)
  {
    $fehler = "Fehler: erste Datensatznummer kleiner als 1!";
  }
  if ($offset >= $all)
  {
    $fehler = "Fehler: erste Datensatznummer größer als höchste vorhandene Datensatznummer!";
  }
    
  if (!isset($fehler))
  {
    $sql = "SELECT * FROM land LIMIT 0".$offset.", ".$range.";";
    $res = $db->query($sql);
    echo "<table>\n";
    echo "  <tr>\n";
    echo "    <th>Operationen</th>\n";
    echo "    <th>id</th>\n";
    echo "    <th>name</th>\n";
    echo "  </tr>\n"; 
    while ($zeile = $res->fetch_array())
    {
      echo "  <tr>\n";
      echo "    <td><a href='".htmlspecialchars($_SERVER["PHP_SELF"])."?edit=".$zeile['id']."'>Bearbeiten</a> Löschen</td>\n";
      echo "    <td>{$zeile['id']}</td>\n";
      echo "    <td>{$zeile['name']}</td>\n";
      echo "  </tr>\n";
    }
    echo "</table>\n";
  }
  else
  {
    echo "<p class='error'>$fehler</p>";
  }
?>
      
      <form style="position:absolute; top:73%" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="POST">
	Datensätze von Nr.
	<input type="text" size="2" maxlength="2" name="liststart"> bis
	<input type="text" size="2" maxlength="2" name="listend">
	<!-- <input type="submit" value="anzeigen"> -->
	<button>anzeigen</button>
      </form>
      <p style="position:absolute; top:80%">
	<a href="<?=htmlspecialchars($_SERVER["PHP_SELF"]); ?>?listpos=0">Erste 10</a> | 
	<a href="<?=htmlspecialchars($_SERVER["PHP_SELF"]); ?>?listpos=<?=$prev10 ?>">vorige 10</a> | 
	<a href="<?=htmlspecialchars($_SERVER["PHP_SELF"]); ?>?listpos=<?=$next10 ?>">nächste 10</a> | 
	<a href="<?=htmlspecialchars($_SERVER["PHP_SELF"]); ?>?listpos=<?=$last10 ?>">letzte 10 Datensätze</a>
      <p>
    </div>
    <div style="position:absolute; width:74%; height:60%; top:40%; left:26%; padding-left:5px; background-color:#ccffcc">
<?php
if (empty($_GET["edit"]))
  $entry = "";
else
{
  $sql = "SELECT name FROM land WHERE id=".$_GET["edit"].";";
  $res = $db->query($sql);
  qcheck($res, $db);
  $zeile = $res->fetch_array();
  $entry = $zeile[0];
}  
?>
      <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="POST">
	Bundesland:<br>
	<input type="text" name="bundesland" size="<?php echo $lenghts[0]; ?>" maxlength="<? echo $lengths[0]; ?>" value="<?php echo $entry; ?>"><br>
	<input type="submit" value="Abschicken">
      </form>
<?php

if (!empty($entry))
{
  $sqlpart1 = "UPDATE land SET name ='";
  $sqlpart2 = "' WHERE id=".$_GET["edit"].";";
}
else
{
  $sqlpart1 = "INSERT INTO land (name) VALUES ('";
  $sqlpart2 = "');";
}

if (isset($_POST["bundesland"]) && !empty($_POST["bundesland"]))
{
  $bundesland = lencheck($_POST["bundesland"], $lengths[0]);
  $bundesland = trim(htmlspecialchars($bundesland, ENT_QUOTES));
  // $bundesland = $db->real_escape_string($bundesland);
  // $sql = "INSERT INTO land (name) VALUES ('".$bundesland."');";
  $sql = $sqlpart1.$bundesland.$sqlpart2;
  $res = $db->query($sql);
  qcheck($res, $db);
  echo "$bundesland wurde eingegeben.\n";
}

if (isset($_POST["bundesland"]) && empty($_POST["bundesland"]) && empty($_GET["bundesland"]) && empty($_GET["edit"]))
{
  echo "Fehler: keine Daten eingegeben!\n";
}
?>
      <p>
	<a href="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>?mode=refresh">Datensatzliste aktualisieren
      </p>
    </div>  
  </body>
</html>
      
      

  1. Hallo

    Nächstes Problem: nachdem ich die Anzeige der vorhandenen Datensätze fehlerfrei hinbekommen hatte, fügte ich in der Spalte "Operationen" Textlinks für "Bearbeiten" und "Löschen" hinzu. Bei "Bearbeiten" wird mit $_GET die Nummer des zu bearbeitenden Datensatzes an das Dokument gesendet und der bisherige Wert des Feldes "name" im Eingabeelement angezeigt.

    Nur - wie weiß mein Formular danach, ob es jetzt einen weiteren Datensatz einfügen oder den in der Liste ausgewählten Datensatz bearbeiten soll?

    Wenn du für die Neueingabe und die Bearbeitung von vorhandenen Datensätzen das selbe Forumular und das selbe Skript aufrufst, kannst du die beiden Fälle anhand des Vorhandenseins einer ID des Datensatzes unterscheiden.

    ID vorhanden => Bearbeitung
    ID nicht vorhanden (weil sie erst beim speichern des Datensatzes erzeugt wird) => Neueingabe

    Tschö, Auge

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
  2. Hello,

    um den Mechanismus etwas besser zu durchschauen, solltest Du mal nach "Affenformular" suchen.

    Insbesondere das Wiedervorlegen verschiedener Elementtypen (input, textarea, select, select multiple, radio, usw.) sollte sitzen, bevor Du die Datenbankkopplung in Angriff nimmst.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
  3. Wenn du "vorhandene Datensätze" zum Verarbeiten und Löschen anbietest, woher sollte dann ein neuer Eintrag kommen?

    Bei meinen Listen gibt es oben eine Extra-Schaltfläche "neuen Datensatz erfassen". Dann poppt das leere Pflege-Formular auf.

    Wird eine vorhandene Position angeklickt, wird dem Pflegeformular die id mitgeteilt und es stellt die Frage voran: Möchtest du "ändern", "kopieren", "löschen"?. Sind drei verschiedene Buttons.

    Linuchs

    1. Hallo Linuchs,

      Wird eine vorhandene Position angeklickt, wird dem Pflegeformular die id mitgeteilt und es stellt die Frage voran: Möchtest du "ändern", "kopieren", "löschen"?. Sind drei verschiedene Buttons.

      Das könnte zum Beispiel so aussehen

      In diesem Zustand wird lediglich eine Zusammenfassung des Datensatzes angezeigt, erst wenn man auf den Bearbeiten-Button klickt, wird das Formular sichtbar:

      Bis demnächst
      Matthias

      --
      Pantoffeltierchen haben keine Hobbys.
      ¯\_(ツ)_/¯
      1. Hi(gh)!

        Ich habe das Problem zwischenzeitlich mal wieder mit einer externen Datei gelöst, in der die Nummer des zum Bearbeiten angeforderten Datensatzes zwischengespeichert wird - und es funktioniert einwandfrei. Kommt mir jetzt nicht mit Problemen durch konkurrierende Dateizugriffe im Mehrbenutzer-Betrieb - es wird keinen Mehrbenutzerbetrieb geben!

        Bis bald im Khyberspace!

        Yadgar