Sneapi: Problem mit auslesen von übergebenen Variablen

Hallo Leute,
ich hab da ein kleines Problem und zwar möcht ich gerne Einträge aus meiner DB löschen. Das ganze soll so funktionieren:

  • Anzeigen der Einträge
  • Makieren der Einträge (die gelöscht werden sollen)
  • Button klicken
  • Einträge löschen

Also ich hab es jetzt so weit das ich nur noch prüfen muß welcher Einträge makiert wurden um diese dann zu löschen. Leider komm ich beim auslesen nicht ganz weiter vll kann mir da ja jemand helfen wie ich es hinbekomme, das ich weiß welche Ids gelöscht werden sollen.

So sieht das ganze aus. (etwas gekürzt):

  
$sql = mysql_query("SELECT * FROM ".$odgb_table."  ORDER BY postid DESC");  
  
if(isset($_POST['dell_entrys'])){  
  // Hier weiß ich nicht weiter.  
}  
  
echo '<form action="" method="POST">';  
echo "<input type='submit' name='dell_entrys' value='Makierte Eintr&auml;ge l&ouml;schen'><br><br>";  
echo '<table border="1" cellspacing="0" cellpadding="0">';  
echo '<tr>';  
echo '<td>check</td>';  
echo '<td>postid</td>';  
echo '</tr>';  
  
while($row = mysql_fetch_row($sql)) {  
  echo "<tr>";  
  echo "<td><input type='checkbox' value='dell' name='box_".$row['0']."'></td>";  
  if(!empty($row['0'])) echo "<td>".$row['0']."</td>"; else echo "<td>&nbsp;</td>";  
  echo "</tr>";  
}  
echo "</table>";  
echo "<br><input type='submit' name='dell_entrys' value='Makierte Eintr&auml;ge l&ouml;schen'>";  
echo "</form>";  
  
mysql_close($db);  

Danke schon mal für euere Hilfe.

Mfg

  1. Servus,

    statt ...

    <input type='checkbox' value='dell' name='box_".$row['0']."'></td>

    ... könnte ...

    <input type='checkbox' value='".$row['id']."' name='box_".$row['0']."'></td>

    ... funktionieren. Sprich, der Wert/value der Checkbox kapselt die ID des Datensatzes, steht dann in einer PHP Variable $_POST['box_#ROW_NUMBER'] bzw. $_POST['box_#ROW_ID'] falls in $row['0'] die ID des Datensatzes steht.

    Es empfiehlt sich immer assoziative Arrays zu nutzen, anstatt numerischen, d.h. statt $row['0'] (ohnehin $row[0]) besser $row['id'].

    Geht das nicht so mit den Checkboxen (meine HTML Zeiten liegen eine Weile zurück), dann kannst pro Zeile ein hidden field mitgeben, in dem die ID des Datensatzes steht.

    Viel Erfolg!

    1. Du hast mich auf den richtigen Weg geführt, das mit dem array war ne gute Idee.

      Habs jetzt so gemacht:

        
        //Prüfen ob etwas übergeben wurde  
        if(!empty($_POST['dell_ids'])){  
          $array = $_POST['dell_ids'];  
          //Prüfen ob dell_ids ein array ist  
          if (is_array($array) == true){	  
            for ($x = 0; $x < sizeof($array); ++$x){  
              echo "key: ".key($array)."<br>value: ".current($array)."<br>";  
              next($array);  
            }  
          }  
        }  
        
        
        
      echo "<td><input type='checkbox' value='".$row['0']."' name='dell_ids[]'></td>";  
      
      

      1000 Dank für deine Hilfe.

      1. Servus,

        for ($x = 0; $x < sizeof($array); ++$x){
            echo "key: ".key($array)."<br>value: ".current($array)."<br>";
            next($array);
        }

        ist schlecht.

        Besser: PHP foreach Konstrukt

        foreach(array as $key => $value)
             echo "key: ".$key."<br>value: ".$value."<br>";

        Ohne das böse zu meinen, aber du bist wohl (PHP)-Anfänger. Informier dich über SQL-Injection und Input-Validation im Allgemeinen. PHP ist eine tolle Sache, und verzeiht einem viele Fehler - das wiederum ist der Grund warum PHP so einen schlechten Ruf hat. PHP ist sehr leicht, aber es ist genauso leicht damit enorm (sicherheits-)anfälligen Code zu produzieren.

  2. Hi!

    echo "<td><input type='checkbox' value='dell' name='box_".$row['0']."'></td>";

    Es ist in den meisten Fällen ungünstig, variable Variablen zu verwenden, wenn man eine Auflistung von Werten haben möchte. "box_0", "box_1", ... "box_n" wären solche variablen Variablen. Gib dem name-Attribut den Wert "box[]" und leg in value dein Selektionskriterium ab (vermutlich ist das bei dir auch der Wert aus der ID-Spalte). Die leeren Klammern bei box[] sorgen unter PHP dafür, dass bei mehrfachen Auftreten eines solchen Namens, PHP ein Array anlegt. Das kannst du zum Beispiel mit

    foreach ($_POST['box'] as $value)

    durchlaufen. Oder du kannst es gleich implodieren lassen

    $sql = sprintf('DELETE ... WHERE ID IN (%s)', implode(',', $_POST['box']));

    Bedenke aber, dass das ungefilterte Einfügen in ein SQL-Statement eine SQL-Injection-Lücke darstellt. Die Werte im Array sollte vorher geprüft oder "zwangsentschärft" werden.

    $_POST['box'] = array_map('intval', $_POST['box']);

    Diese Zeile durchläuft $_POST['box'] und wendet auf alle Elemente die Funktion intval() an. intval() wandelt den übergebenen Wert in einen Integerwert um. "Nicht-Zahlen" wie einzuschmuggeln versuchte SQL-Code-Fragmente werden dabei zu 0. Eine ID 0 gibt es üblicherweise nicht, also wird für dieses Eintrag auch nichts gelöscht. Das Ergebnis von array_map() kannst du wie gezeigt wieder in $_POST['box'] ablegen, wenn du die Originaleingaben nicht benötigst, ansonsten kannst du eine eigene Variable nehmen oder den array_map()-Aufruf direkt im implode() notieren (möglichst nur, wenn dadurch nicht die Übersichtlichkeit leidet).

    Du könntest aber auch mit anderen Testmöglichkeiten (wie is_numeric()) alle übergebenen Werte prüfen und bei Nichtgefallen den ganzen Vorgang abbrechen. Wer teilweise ungültige Werte sendet, der meint auch die gültigen Werte garantiert nicht ernst.

    Lo!