Checkbox per Submit Problem

StrongSoul

Grünschnabel
Guten Abend,

in den letzten Tagen habe ich ein "Postfach" auf die Beine gestellt.
Jedoch bin ich jetzt an einem großen Problem angekommen.

Ich möchte per Checkboxen Nachrichten auswählen die ich dann Lösche.
Ich bin mir gerade nicht so im klaren wie ich per Submit die IDs der einzelnen Nachrichten übertrage und sie dann auswerte, um die Nachrichten dann aus der Datenbank zu entfernen.

kann mir da jemande einen tipp geben?

Vielen Dank
 
Ganz einfach:

In der Schleife in der die Nachrichten geschrieben werden, fügst du im name Attribut der Checkbox "pntd['".$id."']" ein


PHP:
foreach($_POST['pntd'] as $key => $value) { $ids[] = $key;}
                           
for($i = 0; $i < count($ids); $i++) {
                           
 $sqlcmd = sprintf('DELETE FROM pn WHERE id = %d',
                            mysql_real_escape_string($ids[$i])
                              );
 mysql_query($sqlcmd);
}

Oder du könntest auch die for schleife weglassen und in der foreach schleife schon alles löschen, ist dir überlassen.
 
Zuletzt bearbeitet:
müste es dann nicht:

name=<?php echo"pntd['".$row[id]."']";?> heissen im HTML Tag der Chekcbox?

Könntest du mir die foreach schleife bitte noch näher erläutern?

Ne, wenn dann lass ich das mit der for Schleife ;)
 
Ja genau so mein ich es :)

Mit foreach:
PHP:
foreach($_POST['pntd'] as $key => $value) { 

$sqlcmd = sprintf('DELETE FROM pn WHERE id = %d',
                            mysql_real_escape_string($key)
                              );
mysql_query($sqlcmd);

}
 
Habe mich jetzt mal ein wenig wegen dem foreach und sprintf schlau gelesen;)

Aber es will immer noch nicht funktionieren:/

Hier mal mein Code:

PHP:
<FORM method="POST" action="index.php?section=mail">
<?php

$delmail		= $_POST['erase'];

include("includes/config.inc.php");

if($delmail){

	$delmail = false;

	foreach($_POST['pntd'] as $key => $value){
		$sql = sprintf('DELETE FROM loe_mails WHERE ID = %d', mysql_real_escape_string($key));
		mysql_query($sql);
	}
}

include("includes/tables/table_mail.inc.php");

?>
</form>

So, die Checkbox sieht jetzt so aus:

PHP:
<input type="checkbox" name="<?php echo"pntd[".$row['ID']."]";?>"></input>

liegt es eventuell daran das die checkbox per include eingebunden wird?

Hätte nie gedacht dass das Löschen von ingame Post so schwer sein kann :/
 
Mit den Grundkenntnissen in PHP sollte man es locker schon selbst schaffen können, aber egal.

Die Daten werden über ein Formular geschickt. Dieses Formular schickt ein weiteres Array (pntd). Aber die einzelnen Array-Elemente werden überhaupt gesetzt wenn eine Nachricht "ausgewählt" wurde. Deswegen muss man den Wert des Arrays-Elements nicht erst überprüfen ob es ausgewählt wurde oder nicht.

PHP:
<?php
if(isset($_POST)) {

include("includes/config.inc.php");

    foreach($_POST['pntd'] as $key => $value){
        $sql = sprintf('DELETE FROM loe_mails WHERE ID = %d', mysql_real_escape_string($key));
        mysql_query($sql);
    }
}
?>
<form method="post" action="index.php?section=mail">
<?php include("includes/tables/table_mail.inc.php"); ?>
</form>

So müsste es ungefähr aussehen.
 
So, bin jetzt erst dazu gekommen es aus zu Probieren.

Funktioniert leider immer noch nicht -.-* ich habe so das Gefühl, dass des Array nicht richtig erkannt wird:/

Zu den Grundkenntnissen: Also, ich mach das nur nebenbei zur Arbeit und das eher als so ne art learning by doing.
Mein ganzes Grundwissen beruht auf PHP Büchern und dem Quaknet Tutorial.
Wenn ich dann halt mal nicht weiterweiss versuche ich mir in den Foren hilfe zu holen

Gruss
 
Hallo @StrongSoul

Learning by Doing dauert zwar länger, aber man versteht es dann wenigstens auch, wenn man sich etwas dahinter klemmt.
Ich mach es auch nur nebenbei und nur zum Spaß, aber je mehr ich gemacht hab, desto mehr verstand ich das.
Das ist auch der Grund warum ich hier immer helfen will und die Leute auch dazu animiere, dass sie es selbst versuchen und eher erkläre, als zu coden.
Ich erinnere mich auch noch, wie ich in den Foren belehrt wurde. Es hat was gebracht ;)


Nun zu deinem Problem:

Was du haben willst ist ein Array mit den Werten, die von checkboxes markiert wurden.

Das ist eigentlich ganz einfach, da du mit checkboxes ein "HTML Array" erzeugen kannst und zwar einfach mit einem [] nach dem Namen.
Meine Vorgänger lagen schon richtig, aber es ist einfacher, wenn du einfach die Keys lässt und nur die Werte füllst.
Also jeder checkbox einfach das Namensattribut "name[]" geben.

Wenn du das Formular jetzt abschickst, dann solltest du, wenn du $_REQUEST['name'] ausgibst ein Array mit den Werten erhalten, welches du durchgehen kannst.

Versuch mal ein Formular mit mehreren Checkboxes mit den Namen "name[]" zu machen und bau in die PHP Datei das ein:

PHP:
<?php
echo "<pre>". print_r($_REQUEST['name'], true) ."</pre>";
?>

Jetzt sind foreach und mysql_query deine Freunde ;)

Was auch eine sehr gute Idee wäre:
Oben zeigt dir ein Kollege wie du die Datensätze dann löscht. Mach es aber bitte nicht so, dass du den mysql_query Befehl in die Schleife einbaust.
Es funktioniert. Aber es ist sehr perfomance lastig, wenn diese 50 mal ausgeführt wird.

Mach lieber einen String rein und ergänze ihn immer um einen Teilpart:

PHP:
$sql_str = "";
...
foreach($_REQUEST['name'] as $n)
 {
   $sql_str .= " OR ID = '". mysql_real_escape_string($n) ."'";
 }
..
mysql_query("DELETE FROM table WHERE ". substr($sql_str, 4));


So das war ausführlich, aber ich hoffe zu verstehen. Ansonsten einfach immer fragen ;)


Grüße SimonErich
 
Zuletzt bearbeitet:
Hallo SimonErich,

der Vorschlag mit dem String fürs msql_query gefällt mir sehr gut, hätte man auch selber drauf kommen können ;)
Allerdings fiel mir auf, dass in dem Query - Befehl nach dem "WHER" bestimmt nicht ein "OR ID =" kommen kann;) Aber das lässt sich leicht anpassen;) Oder macht das nix aus?

Vielen dank das du dir die Mühe gemacht hast mir das mit dem HTML Tag zu erklären;)
Jetzt hab ich die Lösung!

Und dann hätte ich auch noch zum Abschluss eine Frage, was bewirkt mysql_real_escape_string, also was mysql_real_escape_string bringt weiss ich, aber warum has du davor eine URL gesetzt?

Schönen Gruss
StrongSoul
 
Und dann hätte ich auch noch zum Abschluss eine Frage, was bewirkt mysql_real_escape_string, also was mysql_real_escape_string bringt weiss ich, aber warum has du davor eine URL gesetzt?

Ich hab vergessen, dass in einem code Tag BBCode nicht geparsed wird und wollte dich gleich auf die richtigen Informationsseiten zu diesen Funktionen leiten ;)
Bei mysql_real_escape_string und substr


Allerdings fiel mir auf, dass in dem Query - Befehl nach dem "WHER" bestimmt nicht ein "OR ID =" kommen kann Aber das lässt sich leicht anpassen Oder macht das nix aus?

Jo, leider wurde auch dies von der URL zerfetzt.
Schau es dir nochmal an, ich hab es geändert.
Ich hab gleich die Funktion substr eingebaut, welche die ersten 4 Zeichen des Strings löscht. (Also " OR ") ;)


Grüße SimonErich
 
Zurück