Array-Datensatz löschen per ID

cyriousX

Grünschnabel
Moin zusammen,

ich lasse mir meine gewünschten Daten als Tabelle ausgeben und habe am Ende jeder Zeile einen Button zum löschen des Datensatzes. Das funktioniert leider nicht so gut wie ich möchte, denn der Button löscht immer nur den letzten Datensatz in der Tabelle und nicht den gewünschten. Ich hoffe jemand kann mir hier helfen.

Löschvorgang:
---------------------

PHP:
var_dump($_POST);

$sql = "SELECT * FROM daten";

// Löschen
if(isset($_POST['delete']))
{

$db->query("DELETE FROM daten WHERE id='".$_POST['id']."'");
printf("Affected rows (DELETE): %d\n", $db->affected_rows);

echo "<strong>Datensatz erfolgreich gelöscht</strong>";
}



Innerhalb dieser Form:
-----------------------------
//Formular Start
PHP:
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';



Button:
--------------
PHP:
echo '<td><input type="hidden" name="id" value="'.$datensatz['id'].'" /></td>','<td><input type="submit" name="delete" value="Entfernen" /></td>';
 
Du hast mehrere hidden-inputs mit dem namen "id". Alle werden beim Absenden mitgeschickt und mit $_POST['id'] greifst du auf den letzten zu.

Edit: Üblicherweise löst man so was per Link und nicht über ein Formular.

PHP:
echo '<td><a href="delete.php?do=delete&amp;id='.$datensatz['id'].'">Entfernen</a></td>'; 

......

// Löschen
if($_GET['do'] == 'delete')
{

$db->query("DELETE FROM daten WHERE id='".$_GET['id']."'");
printf("Affected rows (DELETE): %d\n", $db->affected_rows);

echo "<strong>Datensatz erfolgreich gelöscht</strong>";
}

Und nochwas: Es ist ziemlich unnötig gewesen, das unsichtbare Input in eine extra Tabellen-Spalte zu stecken.
 
Zuletzt bearbeitet:
Ich sollte noch erwähnen, dass man mit dem Aufruf folgender URL alle Datensätze löscht.

Code:
delete.php?do=delete&id='+OR+1

Du solltest also niemals Nutzereingaben direkt irgendwo weiter verwenden, ohne sie zu überprüfen. Am einfachsten ist es, mysql_real_escape_string() zu benutzen.

PHP:
$db->query("DELETE FROM daten WHERE id='".mysql_real_escape_string($_GET['id'])."'");

Die Variante mit dem versteckten Inputs ist übrigens genauso anfällig.
 
Ich bräuchte noch etwas Hilfe beim editieren eines Datensatzes. Ich trage die Daten bisher wie folgt über ein modales JS-Fenster ein.



PHP:
<?php
if (!empty($_POST["submit"])) {
$sql="INSERT INTO daten " . 
"(id, Bundesland, KrStLk, StadtGemeinde, Format, Netzbezeichnung, Beschreibung, Anliefermenge, " . 
"VK, EK, VKKultur, EKKultur, Aushangdauer, Starttermin, Notizen) VALUES ('', '$_POST[Bundesland]', " .
"'$_POST[KrStLk]', '$_POST[StadtGemeinde]', '$_POST[Format]', " .
"'$_POST[Netzbezeichnung]', '$_POST[Beschreibung]', '$_POST[Anliefermenge]', " .
"'$_POST[VK]', '$_POST[EK]' , '$_POST[VKKultur]' , '$_POST[EKKultur]' , '$_POST[Aushangdauer]' , '$_POST[Starttermin]' , '$_POST[Bemerkungen]' )";
if (mysqli_query($db, $sql)) {
  echo "<p>Abfrage erfolgreich!</p>";
} else {
  echo "<p>Abfrage nicht erfolgreich!</p>";
}
mysqli_close($db);
}
?>

PHP:
<form $_SERVER['$PHP_SELF'] id="eintragenform" method='Post'>
  <p>Bundesland:
    <input type="text" name="Bundesland">
    <br>
    Kreisfreie Stadt / Landkreis:
    <input type="text" name="KrStLk">
    <br>
    Stadt / Gemeinde:
    <input type="text" name="StadtGemeinde">
    <br>
    Format:
    <input type="text" name="Format">
    <br>
    Netzbezeichnung:
    <input type="text" name="Netzbezeichnung">
    <br>
    Beschreibung:
    <input type="text" name="Beschreibung">
    <br>
    Anliefermenge:
    <input type="text" name="Anliefermenge">
    <br>
    VK:
    <input type="text" name="VK">
    <br>
    EK:
    <input type="text" name="EK">
    <br>
    VK Kultur:
    <input type="text" name="VKKultur">
    <br>
    EK Kultur:
    <input type="text" name="EKKultur">
    <br>
    Aushangdauer:
    <input type="text" name="Aushangdauer">
    <br>
    Starttermin:
  <div class="demo">
    <p>Date:
      <input type="text" id="datepicker" name="Starttermin">
    </p>
  </div>
  <!--//-->
  <div style="display: none;" class="demo-description">
    <p>The datepicker is tied to a standard form input field. Focus on the input (click, or use the tab key) to open an interactive calendar in a small overlay. Choose a date, click elsewhere on the page (blur the input), or hit the Esc key to close. If a date is chosen, feedback is shown as the input's value.</p>
  </div>
  <br>
  Bemerkungen:
  <textarea cols="60" rows="4" name="Bemerkungen">
</textarea>
  <p>
    <input type="submit" value="Daten eintragen" id="ReloadButton" name="submit">
</form>

Wie kann ich ein Formular passend zum Eintrag nun editieren, bzw. mit entprechenden Daten füllen?

LG
 
Erstmal: Da hast du das "action=""" vergessen:
PHP:
<form $_SERVER['$PHP_SELF'] id="eintragenform" method='Post'>

Jetzt zum Eigentlichen

Du ließt den entsprechenden Datensatz aus und füllst die inputs mit den Daten. Z.B
PHP:
<input type="text" name="Bundesland" value="<?php echo abfrage_ergebnis['Bundesland'] ?>">

Und nach dem Absenden wird der Datensatz geupdated
SQL:
UPDATE daten SET Bundesland='ein Wert', StadtGemeinde='noch ein Wert' WHERE id=deineID
 
Und wenn ich weider einen Datensatz per Link aufrufen will? Also zum editieren eines Datensatzes. Muss ich das genau so machen wie beim löschen? Steh gerade etwas aufm Schlauch.

PHP:
// Bearbeiten
if($_GET['do'] == 'update')
{
$db->query("SELECT * FROM daten WHERE id='".mysql_real_escape_string($_GET['id'])."'"); 
printf("Affected rows (UPDATE): %d\n", $db->affected_rows);
}
 
Was muss denn da drin stehen? Sorry bin noch recht neu dabei ;-)

In deinem Eingangspost hast du es bereits richtig geschrieben:
PHP:
<?php
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post">'; 
?>

oder auch
PHP:
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">

Und jetzt wieder zum Eigentlichen:

Das Editieren der Datensätze ist etwas komplizierter, denn anders als das Löschen erfordert es ja Nutzereingaben.
So sollte es etwa ablaufen:

1.Man klickt in der Übersicht(wo auch die ganzen "Löschen"-Links sind) auf den "Editieren"-Link in der entsprechenden Zeile. Dieser bringt einen zu einer neuen Seite und dabei wird die ID mit übergeben.
2.Auf dieser neuen Seite ist praktisch die Eingabemaske (das Formular), welches du auch zum Eintragen neuer Datensätze verwendest. Aber hier lässt du die Textfelder nicht leer, sondern füllst sie mit den aktuellen Daten aus der Datenbank.
3.Wenn der Nutzer dieses Formular absendet, machst du ein UPDATE auf der Tabelle und kannst den Nutzer eine Erfolgsmeldung zeigen und ihn eventuell auf die Ursprüngliche Übersichtsseite aus Punkt 1 weiterleiten.

Das ganze geht natürlich auch mit einem modalen Dialog, aber diesen müsstest du dann beim Klick auf "Editieren" auch erstmal füllen.
 
Zurück