PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Über eine foreach-schleife, oder eine while-schleife auslesen?


maiskolben
04.08.2006, 14:59:37
Hallo!
Ich stoße auch sogleich auf das nächste Problem, da ich erst vergessen hatte meine Checkboxen in das FORM-Tag zu packen, und ich dachte hey, es geht so einfach die ausgewählten Bilder über diesen Weg zu löschen, möchte ich natürlich jetzt das löschen der Bilder dem Nutzer auch anzeigen lassen...

Das habe ich bisher so geregelt:

foreach ($_POST['loeschen'] as $key => $value) {

while($l < $key):
$l++;
unlink ("Galerie/" . $value);
endwhile;
}
if (unlink ($value)) {
echo "<p>Alls Klah! Die Bilder</p><br />\n";
echo "<p><strong>$value</strong></p><br />\n";
echo "<p>wurden gelöscht! :-)</p>";
}

Doch so zeigt er mir nur den ersten Key des Array an, und somit natürlich auch den Value (den Bildnamen)...

Das Löschen klappt wohl!
Doch das Problem hier leigt glaube ich in der letzten If-Anweisung...

Hat jemand eine Idee?
LG maiskolben

MatMel
04.08.2006, 16:15:04
Ich hab deinen Code mal etwas aufgeräumt um ihn besser zu verstehen:

foreach ($_POST['loeschen'] as $key => $value) {
while($l < $key){
$l++;
unlink ("Galerie/" . $value);
}
}

if (unlink ($value)) {
echo "<p>Alls Klah! Die Bilder</p><br />\n";
echo "<p><strong>$value</strong></p><br />\n";
echo "<p>wurden gelöscht! :-)</p>";
}

Da sind ein paar Sachen die ich nicht verstehe:
- warum hast du innerhalb dine foreach Schleife noch eine while Schleife und führst somit das Löschen mehrmals aus?
- was für einen Startwert hat $l und was ist der Sinn von dem ganzen
- warum steht das if hinter der foreach Schleife?

Also ich würde es so machen:

foreach ($_POST['loeschen'] as $key => $value) {
if( unlink ("Galerie/" . $value) ){
$del_bilder .= $value . " ";
}
else{
$del_error = true;
$err_bilder .= $value . " ";
}
}

echo "<p>Alls Klah! Die Bilder</p><br />\n";
echo "<p><strong>$del_bilder</strong></p><br />\n";
echo "<p>wurden gelöscht! :-)</p>";

if($del_error){
echo "<p>Die Bilder</p><br />\n";
echo "<p><strong>$err_bilder</strong></p><br />\n";
echo "<p>konnten leider nicht gel&ouml;scht werden :-(</p>";
}

maiskolben
04.08.2006, 16:38:35
- warum hast du innerhalb dine foreach Schleife noch eine while Schleife und führst somit das Löschen mehrmals aus?Tja, das liegt am mangelden Wissen... Klingt aber logisch das es Schwachsinn ist!

was für einen Startwert hat $l und was ist der Sinn von dem ganzenStartwert wäre 0 gewesen... (Array => key = 0 value = bildname) usw. und der SInn des Ganzen ist, mir mit echo "$value"."<br />\n"; die Auflistung der gelöschten Bildnamen zu ebschaffen... so dachte ich! :-) Aber falsch gedacht!

Für mich ist Deine Lösung interessant, weil innerhalb der foreachschleife kein expilziter Befehl zum löschen da ist, der ist ja in der if Anweisung! Das war mir neu... Ich glaubte immer, dass der Befehl dann sofort folgen muss...

Vielen Dank für Deine Antwort!
Es klappt jetzt, und ich hab' mir den Aufbau Deines verbesserten Scripts (und seine Logik) jetzt verinnerlicht!

LG maiskoben

MatMel
04.08.2006, 16:54:36
Also damit du das mit dem unlink verstehst:

unlink() an sich ist ja eine Funktion mit einem Rückgabewert (entweder true, wenn gelöscht wurde oder false, wenn nicht gelöscht wurde).

Man könnte also schreiben:

$ret = unlink($datei);

Dann würde nach der Ausführung in $ret entweder true oder false drinstehen.

Will ich jetzt überprüfen ob es geklappt hat oder nicht frage ich mit einer if Bedingung die Variable $ret ab:

if($ret){
mach irgendwas
}

Da ich aber meistens später nie wieder auf die Variable $ret zurückgreifen muss, kann ich mir auch eine Zeile sparen indem ich einfach die Funktion selber als Bedingung setze:

Aus $ret = unlink($datei); und if($ret){
wird if( unlink($datei) ){.

Hoffe das war verständlich ;)

Gruß,
Matze

maiskolben
04.08.2006, 17:48:16
Ja! Das war verständlich! :-)
Für mich war es nur komisch, weil ich bisher immer dachte:

[..]
>lösche ($var)
[..]
wenn ($var = gelöscht) {
sag' "alles klar!";
} [..]

Ich dachte es muss irgendwo deutlich angegeben werden...

Nochn Beispiel:

[..]
if( unlink($datei) ){
[..]

Da steht halt nicht direkt unlink($bild)...
Deswegen bin ich gar nicht auf die Idee gekommen!

Ist es denn so, dass in einer If-Anweisung in der Klammer die Befehle ausgeführt werden?

LG maiskolben

MatMel
04.08.2006, 19:32:30
[..]
>lösche ($var)
[..]
wenn ($var = gelöscht) {
sag' "alles klar!";
} [..]
In dem Beispiel würde in jedem Fall "alles klar" gesagt werden, da das "=" ein Zuweisungsoperator ist. Es würde also der Variable $var der Wert gelöscht zugewiesen werden. Und da das zuweisen (fast) immer erfolgreich ist, würde er auch die Bedingung für erfüllt halten.

Was du meintest war warscheinlich ($var == gelöscht).
Also was du "gelöscht" genannt hast, ist beim programmieren meist true. fehler wäre dann false.

Der if Befehl schaut im Grunde genommen nur, ob das was in der Klammer steht true ist. Ob das eine einzelne Variable ist, ein Vergleich oder eine Funktion ist dem vollkommen egal.
Wenn halt ne Funktion drinsteht, wird die zuerst ausgeführt.

Und einen Vergleich kann man auch so schreiben:

$blubb = 5;
$var = $blubb == 5;
if($var) ...

#Anstelle von:
$blubb = 5;
if($blubb == 5) ...

Man kann die Vergleichsoperatoren auch so wie eine Funktion sehen:
Bei == wäre die dann: wenn vorne und hinten das gleiche steht, dann gib true zurück.
Denn das $var oben, wäre nach der Zeile $var = $blubb == 5; auch true.