jezek01: löschen von Datensätzen mittels Checkboxen

Hallo!

Habe es schon in mehreren Foren versucht auf dieses Problem eine Lösung zu finden. Man will mir aber dort anscheinend nicht helfen! Nun versuche ich es bei euch.

Ich bin gerade beim erstellen eines Skripts, das Datensätze, die mittels Checkboxen ausgewählt wurden durch einen Klick auf löschen entfernt.

Bisher funktioniert aber nur das Löschen eines Datensatzes einer Checkbox, jedoch nicht von mehreren. Ich weiß, dass das mit einer Foreach-Schleife geht, aber ich weiß halt nicht wo ich das hineinplatzieren muss bzw. durch was ich das erstetzen muss.

hier der code:

<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

if ((isset($_POST['ausgewaehlte'])) && ($_POST['ausgewaehlte'] != "")) {
  $deleteSQL = sprintf("DELETE FROM tbl_links WHERE ID=%s",
                       GetSQLValueString($_POST['ausgewaehlte'], "int"));

mysql_select_db($database_conn_obertilliach, $conn_obertilliach);
  $Result1 = mysql_query($deleteSQL, $conn_obertilliach) or die(mysql_error());
}

$currentPage = $_SERVER["PHP_SELF"];

mysql_select_db($database_conn_obertilliach, $conn_obertilliach);
$query_rs_links = "SELECT * FROM tbl_links";
$rs_links = mysql_query($query_rs_links, $conn_obertilliach) or die(mysql_error());
$row_rs_links = mysql_fetch_assoc($rs_links);
$totalRows_rs_links = mysql_num_rows($rs_links);

$queryString_rs_links = "";
if (!empty($_SERVER['QUERY_STRING'])) {
  $params = explode("&", $_SERVER['QUERY_STRING']);
  $newParams = array();
  foreach ($params as $param) {
    if (stristr($param, "pageNum_rs_links") == false &&
        stristr($param, "totalRows_rs_links") == false) {
      array_push($newParams, $param);
    }
  }
  if (count($newParams) != 0) {
    $queryString_rs_links = "&" . htmlentities(implode("&", $newParams));
  }
}
$queryString_rs_links = sprintf("&totalRows_rs_links=%d%s", $totalRows_rs_links, $queryString_rs_links);
?>

Falls dieser Code für die Foreach-Schleife stimmt, wo muss ich diesen dann platzieren/erstezen?

foreach($_POST['ausgewaehlte'] as $ausgewaehlte) {
$sql=mysql_query("delete from tbl_links where id = $ausgewaelte");
}

Ich weiß, dass es irgendwo hier herein gehört:

php
if ((isset($_POST['ausgewaehlte'])) && ($_POST['ausgewaehlte'] != "")) {
  $deleteSQL = sprintf("DELETE FROM tbl_links WHERE ID=%s",
                       GetSQLValueString($_POST['ausgewaehlte'], "int"));

mysql_select_db($database_conn_obertilliach, $conn_obertilliach);
  $Result1 = mysql_query($deleteSQL, $conn_obertilliach) or die(mysql_error());
}
?>

Ich bitte zumindest hier um Hilfe!

Danke im Voraus

Mfg

  1. Hallo!

    Hi!

    also das is der code, den der dreamweaver generiert wenn man das application-zueg verwendet, oder?

    da ich da kein fan von bin, hier mein alternativer lösungvorschlag:

    1. alle datensätze auslesen und so ausgeben, dass die jeweilige checkbox des eintrages als value die id des datensatzes hat, aber alle gleich heissen in folgenden schema:

    //So sollte eine checkbox aussehen
    <input name='alleidnummern[]' type='checkbox' value='$jeweiligeid'>

    2. im skript an das du dein form dann abschickst baust du mit folgendem code ein pseudo-array aus diesen werten (gleich mit fehlerausgabe):

    //Auslesen der Checkboxen und übergeben in variable
    if (isset($_REQUEST['alleidnummern'])) {
      reset($_REQUEST['alleidnummern']);
      foreach ($_REQUEST['alleidnummern'] as $sended) {
        $_var = array($sended);
    if ($i == "0") {
     $liste_id = $sended;
    } else {
    $liste_id = $liste_id.";".$sended;
    }
      }
    } else {
      print "Es wurden keine Datensätze ausgewählt!";
    }

    Nun hast du eine Variable $liste_id, die alle gewählten ID-Nummern durch ein Semikolon getrennt enthält. Mit dieser kannst du nun mit einer Schleife in Ruhe deine Datensätze löschen. Z.B. mit folgendem Code:
    $allids = explode(";",$$liste_id);
    for($x=0;$x<count($allids);$x++){
        //Gewünschte Aktion ausführen
    }

    Hoffe du kannst damit umgehen und ich hab dir geholfen,
    der doktor

    1. echo $begrüßung;

      Die Idee ist nicht schlecht, die Ausführung ist es aber teilweise.

      if (isset($_REQUEST['alleidnummern'])) {

      $_REQUEST umfasst zwar POST- und GET-Variablen, in der konkreten Implementation sollte man dann aber doch die der wirklich verwendeten Methode entsprechende Variable nehmen. Anzunehenderweise wird das $_POST sein.

      reset($_REQUEST['alleidnummern']);
        foreach ($_REQUEST['alleidnummern'] as $sended) {

      foreach benötigt kein vorhergehendes reset

      $_var = array($sended);

      Was für einen Sinn soll das ergeben? Du nutzt $_var später nicht.

      if ($i == "0") {
      $liste_id = $sended;
      } else {
      $liste_id = $liste_id.";".$sended;
      }
        }
      } else {

      Der Code wäre besser lesbar, wenn du dir bei den Einrückungen mehr Mühe geben würdest. (Wenn es nur ein ungewolltes Formatierungsproblem ist, willl ich nichts gesagt haben.)

      Nun hast du eine Variable $liste_id, die alle gewählten ID-Nummern durch ein Semikolon getrennt enthält. Mit dieser kannst du nun mit einer Schleife in Ruhe deine Datensätze löschen.

      Für jeden Befehl muss beim Script Erzeugungs- und (Fehler-)Auswertungscode durchlaufen werden und auf der Datanbank-Seite muss auch jedes Mal Code zum Parsen der Anfrage aufgewendet werden. Es ist besser nur einen Befehl an die Datenbank abzusetzen, zumal MySQL dafür eine Möglichkeit bietet.

      Statt der obigen semikolon-separierten Liste sollte eine kommaseparierte Liste erzeugt werden. Außerdem ist jeder dem Script übergebenen Wert als unsicher anzusehen. Du hast zwar bei den Values der Checkboxen feste Zahlenwerte (die IDs) eingetragen, doch ist es ein leichtes, statt der Zahlenwerte beliebiges anderes zum Server zurückzusenden. Eine Auswertung ob der übergebenen Wert eine Zahlenwert ist sollte vorgenommen werden: if (is_numeric(...) ...

      Die kommaseparierte Liste mit den Zahlenwerten kann an einen Delete-Befehl übergeben werden:

      DELETE FROM tabelle WHERE id IN ( hier_die_Liste_einfügen )

      $allids = explode(";",$$liste_id);

      Das das doppelte $$ ist sicher nur ein Tippfehler. Die Verwendung einer variablen Variable hattest du bestimmt nicht vor.

      echo "$verabschiedung $name";

      P.S. Wäre es möglich, wenn du dich beim Antworten bemühtest einigermaßen ordentliche deutsche Sprache zu verwenden, anstatt der babyhaften, die du in deinen bisherigen Postigs benutzt hast?
      z.B. ist statt is, funktionieren statt funzt, usw.
      (Mindestens) ich würde das sehr zu schätzen wissen. Danke.

      1. echo $begrüßung;

        hi!

        da der code während deines posts spontan entstanden ist um dir bei deinem problem zu helfen, finde ich es eher arg als sonderlich hilfreich mich deinen korrekturen auszusetzen...

        manchmal frag ich mich, warum ichs immer wieder mach...

        grüße,
        der doktor

        p.s.: meine "babyhafte sprache" is dann doch wohl eher meine sache, obden es hier ja eher darum geht das man hilfe bekommt, als dass man sich sprachlich an irgendwas anpasst um einen undankbaren user zufriedenzustellen...

  2. echo $begrüßung;

    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")

    Die Idee hinter dieser Funktion ist richtig, die Ausführung jedoch mangelhaft.

    $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

    Der Magic-Quotes-Mechanismus soll vor ungewollten Manipulationen von Datenbankinhalten durch SQL-Injection schützen, dabei macht er aber meist mehr Ärger an anderen Stellen als er Nutzen bringt. Wenn sich die Magic-Quotes nicht in der Konfiguration ausschalten lassen, ist es empfehlenswert sie am Scriptanfang einmalig mit stripslashes_deep() (siehe Example 2 auf dieser Handbuchseite zu entfernen

    if (get_magic_quotes_gpc())
        $_POST = stripslashes_deep($_POST);

    und an den erforderlichen Stellen mit geeigneteren Funktionen als addslashes() die notwendige Maskierung von Sonderzeichen vorzunehmen. Für String-Werte in MySQL-Befehlen ist das mysql_real_escape_string().

    Falls dieser Code für die Foreach-Schleife stimmt, wo muss ich diesen dann platzieren/erstezen?

    foreach($_POST['ausgewaehlte'] as $ausgewaehlte) {
    $sql=mysql_query("delete from tbl_links where id = $ausgewaelte");
    }

    Ich weiß, dass es irgendwo hier herein gehört:

    Da hst du schon mal die richtige Stelle gefunden. Diese Lösung ist im Prinzip auch die gleiche wie die von der-doktor vorgeschlagene.

    if ((isset($_POST['ausgewaehlte'])) && ($_POST['ausgewaehlte'] != "")) {

    Der zweite Teil dieser Prüfung wird wie folgt ausgetauscht:

    if (isset($_POST['ausgewaehlte']) and is_array($_POST['ausgewaehlte'])) {
        foreach($_POST['ausgewaehlte'] as $ausgewaehlte) {
          if (is_numeric($_POST['ausgewaehlte'])) {

    $deleteSQL = sprintf("DELETE FROM tbl_links WHERE ID=%s",
                           GetSQLValueString($_POST['ausgewaehlte'], "int"));

    Diese beiden obigen Zeilen ersetze ich durch diese:

    $deleteSQL = 'DELETE FROM tbl_links WHERE ID=' . $_POST['ausgewaehlte'];

    mysql_select_db($database_conn_obertilliach, $conn_obertilliach);
          $Result1 = mysql_query($deleteSQL, $conn_obertilliach) or die(mysql_error());

    } //if is_numeric...
        } //foreach...

    } //if isset...

    Zu beachten ist, dass, wie von der-doktor erwähnt, das name-Attribut der Checkbox-Input-Elemente ein [] hintendran benötigt: <input type="checkbox" name="ausgewaehlte[]" ...

    echo "$verabschiedung $name";