kati: Einträge aus mittels PHP aus Datenbank löschen

Hallo zusammen

Ich habe ein kleines Formular gebastelt welches Einträge aus meiner sql datenbank (apache xampp) ausliest. Wenn man bei den Einträgen die checkbox auswählt und dann auf Löschen klickt sollten die angewählten Einträge gelöscht werden.

Es sind zwei Tabellen in der Datenbank "MasterProblem" die eine heisst "master" die andere "problem".

Hier das Formular

  
  
<?php  
  
for ($i=0;$i<$anzahlMaster;$i++) {  
$idMaster = mysql_result($ergebnisMaster, $i, "id");  
$checkMaster = "<input type='checkbox' name='delMaster[]' value='".$idMaster."'>";  
$katMaster = mysql_result($ergebnisMaster, $i, "kurzbeschreibung");  
$dateMaster = mysql_result($ergebnisMaster, $i, "Datum");  
  
print "<tr><td>".$checkMaster."</td><td>".$idMaster."<td>".$katMaster."</td><td>".$dateMaster."</td></tr>\n";  
}  
  
?>  
<form action="loeschen_succ.php" method="GET">  
<table  width="100%">  
<tr>  
<th>&nbsp;</th>  
<th>Problem ID</th>  
<th>Kurzbeschreibung</th>  
<th>Eröffnungsdatum</th>  
  
</tr>  
//Master daten auslesen  
$dbMaster=mysql_connect("localhost","***","****");  
$ergebnisMaster=mysql_db_query("MasterProblem", "select * from master order by id");  
$anzahlMaster=mysql_num_rows($ergebnisMaster);  
mysql_close($dbMaster);  
  
//Problem daten auslesen  
$dbProblem=mysql_connect("localhost","ithd","ithd123");  
$ergebnisProblem=mysql_db_query("MasterProblem", "select * from problem order by id");  
$anzahlProblem=mysql_num_rows($ergebnisProblem);  
mysql_close($dbProblem);  
  
for ($i=0;$i<$anzahlProblem;$i++) {  
$idProblem = mysql_result($ergebnisProblem, $i, "id");  
$checkProblem= "<input type='checkbox' name='delProblem[]' value='".$idProblem."'>";  
$katProblem = mysql_result($ergebnisProblem, $i, "kurzbeschreibung");  
$dateProblem = mysql_result($ergebnisProblem, $i, "Datum");  
  
  
print "<tr><td>".$checkProblem."</td><td>".$idProblem."<td>".$katProblem."</td><td>".$dateProblem."</td></tr>\n";  
}  
  
  
?>  
  

Die Ausgabe funktioniert soweit auch. Das Problem ist dann auf der seite loeschen_succ.php.

Die Einträge werden einfach nicht gelöscht. Ich nehme an, dass die Parameter nicht sauber übergeben werden.
Sieht jemand den Fehler?

Hier der Code vom loeschen_succ.php

  
<?php  
  
  
$db=mysql_connect("localhost","***","****");  
if (!$db)  
  {  
  die('Could not connect: ' . mysql_error());  
  }  
  
mysql_select_db("MasterProblem", $db);  
  
  
$master=$_GET["delMaster"];  
$problem=$_GET["delProblem"];  
  
  
if(isset($master))  
{  
	foreach($master as $id)  
	{  
  
	mysql_querry("DELETE FROM master WHERE id = ".$id."");  
	echo "<b>Der Folgende Eintrag wurde erfolgreich gelöscht:</b><br><br>";  
	echo $id;  
	}  
	}  
  
  
if(isset($problem))  
{  
foreach($problem as => $id)  
{  
	mysql_querry("DELETE FROM problem WHERE id = ".$id."");  
	echo "<b>Der Folgende Eintrag wurde erfolgreich gelöscht:</b><br><br>";  
	echo $id;  
	}  
}  
  
mysql_close ($db);  
  
?>  
  

  1. Hallo zusammen

    Ich habe ein kleines Formular gebastelt welches Einträge aus meiner sql datenbank (apache xampp) ausliest. Wenn man bei den Einträgen die checkbox auswählt und dann auf Löschen klickt sollten die angewählten Einträge gelöscht werden.

    Es sind zwei Tabellen in der Datenbank "MasterProblem" die eine heisst "master" die andere "problem".

    Hier das Formular

      
      
    <?php  
      
    for ($i=0;$i<$anzahlMaster;$i++) {  
    $idMaster = mysql_result($ergebnisMaster, $i, "id");  
    $checkMaster = "<input type='checkbox' name='delMaster[]' value='".$idMaster."'>";  
    $katMaster = mysql_result($ergebnisMaster, $i, "kurzbeschreibung");  
    $dateMaster = mysql_result($ergebnisMaster, $i, "Datum");  
      
    print "<tr><td>".$checkMaster."</td><td>".$idMaster."<td>".$katMaster."</td><td>".$dateMaster."</td></tr>\n";  
    }  
      
    ?>  
    <form action="loeschen_succ.php" method="GET">  
    <table  width="100%">  
    <tr>  
    <th>&nbsp;</th>  
    <th>Problem ID</th>  
    <th>Kurzbeschreibung</th>  
    <th>Eröffnungsdatum</th>  
      
    </tr>  
    //Master daten auslesen  
    $dbMaster=mysql_connect("localhost","***","****");  
    $ergebnisMaster=mysql_db_query("MasterProblem", "select * from master order by id");  
    $anzahlMaster=mysql_num_rows($ergebnisMaster);  
    mysql_close($dbMaster);  
      
    //Problem daten auslesen  
    $dbProblem=mysql_connect("localhost","ithd","ithd123");  
    $ergebnisProblem=mysql_db_query("MasterProblem", "select * from problem order by id");  
    $anzahlProblem=mysql_num_rows($ergebnisProblem);  
    mysql_close($dbProblem);  
      
    for ($i=0;$i<$anzahlProblem;$i++) {  
    $idProblem = mysql_result($ergebnisProblem, $i, "id");  
    $checkProblem= "<input type='checkbox' name='delProblem[]' value='".$idProblem."'>";  
    $katProblem = mysql_result($ergebnisProblem, $i, "kurzbeschreibung");  
    $dateProblem = mysql_result($ergebnisProblem, $i, "Datum");  
      
      
    print "<tr><td>".$checkProblem."</td><td>".$idProblem."<td>".$katProblem."</td><td>".$dateProblem."</td></tr>\n";  
    }  
      
      
    ?>  
      
    
    

    Die Ausgabe funktioniert soweit auch. Das Problem ist dann auf der seite loeschen_succ.php.

    Die Einträge werden einfach nicht gelöscht. Ich nehme an, dass die Parameter nicht sauber übergeben werden.
    Sieht jemand den Fehler?

    Hier der Code vom loeschen_succ.php

      
    <?php  
      
      
    $db=mysql_connect("localhost","***","****");  
    if (!$db)  
      {  
      die('Could not connect: ' . mysql_error());  
      }  
      
    mysql_select_db("MasterProblem", $db);  
      
      
    $master=$_GET["delMaster"];  
    $problem=$_GET["delProblem"];  
      
      
    if(isset($master))  
    {  
            foreach($master as $id)  
            {  
      
            mysql_querry("DELETE FROM master WHERE id = ".$id."");  
            echo "<b>Der Folgende Eintrag wurde erfolgreich gelöscht:</b><br><br>";  
            echo $id;  
            }  
            }  
      
      
    if(isset($problem))  
    {  
    foreach($problem as $id)  
    {  
            mysql_querry("DELETE FROM problem WHERE id = ".$id."");  
            echo "<b>Der Folgende Eintrag wurde erfolgreich gelöscht:</b><br><br>";  
            echo $id;  
            }  
    }  
      
    mysql_close ($db);  
      
    ?>  
    
    
    1. Hi!

      Die Einträge werden einfach nicht gelöscht. Ich nehme an, dass die Parameter nicht sauber übergeben werden.
      Sieht jemand den Fehler?

      Mehrere. Und zwar die üblichen:

      • Unnötiges Umkopieren von $_GET/$_POST-Inhalten.
      • Falsch geschriebene Funktionsnamen - sollte eine Fehlermeldung seites PHP bringen.
      • Verwendung veralteter Funktionen (mysql_db_query())
      • Keine Kontextwechselbeachtung in HTML und Datenbank - mit SQL-Injection könnte man die gesamte Tabelle löschen.
      • Keine Fehlerbehandlung - nicht mal ein nutzerunfreundliches "or die()". Robuste rogramme werten die Rückgabewerte der verwendeten Fukntionen aus unf reagieren auf Fehlerzustände anstatt einfach weiterzuarbeiten.
      • Kein Debugging betrieben - sonst hättest du berichten können, an welcher Stelle genau welcher Wert nicht mehr deinen Erwartungen entspricht.

      Lo!

      1. Hallo,

        Sieht jemand den Fehler?
        Mehrere. Und zwar die üblichen:

        • Keine Kontextwechselbeachtung in HTML und Datenbank - mit SQL-Injection könnte man die gesamte Tabelle löschen.

        und jeder harmlose Spider, der mal mit den Formularfeldern "spielt", kann aus Versehen Einträge löschen, weil der Löschvorgang über einen GET-Request angestoßen wird. Das ist nicht gut - es gilt die Faustregel, dass Requests, die den Datenbestand verändern, möglichst per POST eingereicht werden. Eine wie auch immer geartete Authentifizierung wäre sicher auch keine schlechte Idee.

        Ciao,
         Martin

        --
        Chef:         Zum vierten Mal in dieser Woche erwische ich Sie nun schon beim Zuspätkommen. Was haben Sie dazu zu sagen?
        Angestellter: Dann muss heute Donnerstag sein.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hello,

          und jeder harmlose Spider, der mal mit den Formularfeldern "spielt", kann aus Versehen Einträge löschen, weil der Löschvorgang über einen GET-Request angestoßen wird. Das ist nicht gut - es gilt die Faustregel, dass Requests, die den Datenbestand verändern, möglichst per POST eingereicht werden. Eine wie auch immer geartete Authentifizierung wäre sicher auch keine schlechte Idee.

          Und außerdem sollte man eine "Forward-Translation Strategy" benutzen. Dazu werden selektierte Datensätze, die der User sehen und löschen darf, in der Session eingetragen (i.d.R. die ID) und dafür ein Key an den Client gesendet. Dieser Key  kann dann (relativ egal, ob per Get oder Post) zusammen mit der Session benutzt werden, um den Datensatz beim Löschrequest zu identifizieren und zu löschen.

          Wenn keine Rücküberstzung mehr stattfinden kann, kann man entscheiden, ob man den Täter gleich verhaften lässt, oder nur dumm grinst.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de