mmofacts.com

Nachrichten System mit Checkboxen!

gepostet vor 16 Jahre, 9 Monate von Dorgo
Hallo,
also jeder kennt es, viele spiele haben es!
Ein Nachrichtensystem mit Checkboxen, was meine ich.
Also:
[] Betreff Von Datum
[] Betreff Von Datum
[x] Betreff Von Datum
und eben die, die mit [x] makiert sind werden gelöscht .
Ich habe derzeit irgend nen denk fehler und wüste ned wie ich das gscheid in php umsetzen könnte, sprich nur die Checkboxen zu löschen die ausgewählt sind.
Vielleicht könnt Ihr mir ja helfen, wäre echt toll .
Habe schon sehr viel Gegoogelt aber nix gfunden, leider.
mfg,
Dorgo
gepostet vor 16 Jahre, 9 Monate von Nuky
Gibt verschiedene Ansätze. Du könntest nach dem Submit z.B. die selben Datensätze erneut abrufen, und die Checkboxen mit der eindeutigen ID Datensätze versehen.
(z.B. )
Dann überprüfst du beim durchlaufen, ob z.B. $_POST["checkboxname_34"] auf "true" steht, dann löschst du.
gepostet vor 16 Jahre, 9 Monate von Kampfhoernchen
Du kannst den Checkboxen Namen wie ein Array zuweisen.
Also z.B.
checkbox[1]
checkbox[17]
checkbox[4711]
In HTML


Das enthaltene Element die z.B. die Nachricht-ID.
PHP macht daraus ein Array, auf das du mit $_REQUEST['checkbox'] zugreifen kannst.
Also zum Beispiel mit

foreach($_REQUEST['checkbox'] AS $zu_loeschen) {
...
$db->query('DELETE FROM nachrichten WHERE id = $zu_loeschen');
}
Natürlich mit den üblichen Sicherheits-Checks.
gepostet vor 16 Jahre, 9 Monate von Dorgo
Wow danke für eure Hilfe bin schon um einiges weiter .
Danke, danke, danke!
gepostet vor 16 Jahre, 9 Monate von Fobby
Original von Kampfhoernchen
Also zum Beispiel mit

foreach($_REQUEST['checkbox'] AS $zu_loeschen) {
...
$db->query('DELETE FROM nachrichten WHERE id = $zu_loeschen');
}
Natürlich mit den üblichen Sicherheits-Checks.

Und das von einem Admin?
Bei 10 Nachrichten wären das 10 Queries, obwohl es mit einer geht, und das sogar recht einfach:
Also nehmen wir wieder an, dass die Sicherheitschecks durch sind (in dem Fall sehr einfach: intval()) und im Array $zu_loeschen gespeichert.

$db->query('DELETE FROM nachrichten WHERE id IN ('.implode(",", $zu_loeschen).')');
Um noch zu verhindern, dass "böse User" fremde Nachrichten löschen wollen:

$db->query('DELETE FROM nachrichten WHERE id IN ('.implode(",", $zu_loeschen).') AND empfaengerID='.$userid);
o.ä.
Nichts gegen deine Lösungsidee, Kampfhörnchen, die funktioniert ja. Aber ich kann einfach nicht hinsehen, wenn eine DB-Query in einer Schleife steht, zumal es i diesem Fall derart einfach anders zu lösen geht
gepostet vor 16 Jahre, 9 Monate von knalli
Schleifen mit Queries sind grundsätzlich böse.
Des Weiteren ist deine Lösung auch nicht optimal - da wird mir zuwenig escaped
gepostet vor 16 Jahre, 9 Monate von Fobby
Ich habe ja angesprochen, dass ich den Sicherheitsaspekt nicht vollkommen durchziehe, zumal das oft individuelle Lösungen erfordert - aber wenn wir einmal dabei sind, wo bleibt deine verbesserte Variante, wir können ja nur draus lernen
gepostet vor 16 Jahre, 9 Monate von knalli
Original von Fobby
Ich habe ja angesprochen, dass ich den Sicherheitsaspekt nicht vollkommen durchziehe, zumal das oft individuelle Lösungen erfordert - aber wenn wir einmal dabei sind, wo bleibt deine verbesserte Variante, wir können ja nur draus lernen

Mittels mysql_real_escape_string jede Eingabe prüfen; man kann dafür aber gut einen Wrapper benutzen, nach dem Schema:
$sql = 'SELECT ... WHERE ' . $dbObj->getSQLCondition('field', $data);

wobei data sowohl ein String, als auch ein Integer, als auch ein Array von vorherigen sein kann.. und jedes einzelne sauber escaped wird.
Also, Singular:
$db->query(sprintf('DELETE FROM nachrichten WHERE id = "%s"', mysql_real_escape_string($zu_loeschen));

Im Plural dann eben eine Funktion, die extern die Funktion eines implode hat, aber intern natürlich mit einer For-Schleife arbeitet, um jeden einzelnen Wert zu checken.
edit: Die Alternative (hier) wäre,. jeweils ein Cast auf Int durchzuführen (und ggf. auf ">0" zu beschränken); dann braucht man kein zwingendes Escapen.
gepostet vor 16 Jahre, 9 Monate von HSINC
da wir hier schon beim klugscheissen sind und vom anfangsthema eigentlich nix mehr übrig ist, mach ich einfach mal mit und behaupte das ein einfaches "delete from xx where id in (".implode(",",array_unique(array_map('intval',array_slice(array_unique(is_array($_REQUEST[blubb])?$_REQUEST[blubb]:array(0)),0,10000))).") and userid=bla" genauso funzen würde und natuerlich viel schoener ausschaut, da deutlich mehr befehle benutzt werden
gepostet vor 16 Jahre, 9 Monate von duschendestroyer
wo wir bei schönheit sind
gelöst mit ruby-sequel..
DB[:messages].filter(:id => request[:chechbox], :recipient => session[:userid]).delete
wird der gleiche query und natürlich alles escaped
gepostet vor 16 Jahre, 9 Monate von Kampfhoernchen

Und das von einem Admin?
Bei 10 Nachrichten wären das 10 Queries, obwohl es mit einer geht, und das sogar recht einfach:

Ich sagte: Zum Beispiel ...
Ich wollte einfach nur deutlich machen wie man auf das Array zugreift.
gepostet vor 16 Jahre, 9 Monate von Fornax
Original von knalli
edit: Die Alternative (hier) wäre,. jeweils ein Cast auf Int durchzuführen (und ggf. auf ">0" zu beschränken); dann braucht man kein zwingendes Escapen.

hm.. kommt mir bekannt vor:
Original von Fobby

Also nehmen wir wieder an, dass die Sicherheitschecks durch sind (in dem Fall sehr einfach: intval()) und im Array $zu_loeschen gespeichert.
Dass ihr immer aneinander vorbeireden müsst *g*
Ich hoffe, wir haben jetzt Dorgo nicht zu sehr verwirrt, sondern ihm geholfen

Auf diese Diskussion antworten