Mehrere Dateien mittels array und unlink löschen

Hallo redlama,

ja, habe ich. MySQL-Query funktioniert ja auch. Wenn ich die unlink-Funktion mit echo tausche, dann wird, egal welche Dateien ich auswähle, immer alles ab der ersten angezeigt. Die Anzahl der ausgewählten Dateien stimmt jedoch.
 
Hm... das ist ja echt doof... hier sind mal ein paar Zeilen Code, wie ich es nachgebaut habe. Da funktioniert es einwandfrei... ich kann mir nur vorstellen, das es an dem value von del liegt. Fängt $i in Deiner Schleife wirklich bei 0 an?
Code:
<?php		 
if ($action == "delete") {
  print_r($del);
  echo "<br>";
  
  for ($i = 0; $i < count($del); $i++) {
    echo "../../files/".$maincategory[$del[$i]]."/".$subcategory[$del[$i]]."/".$file_name[$del[$i]]."<br>";
  }
} 

?> 
<form action="test.php" method="POST">

<? 
for ($i = 0; $i < 3; $i++) {
    echo $i + 1;
?> 
  <input name="del[]" type="checkbox" id="del[]" value="<? echo $i; ?>">
  <input name="maincategory[]" type="hidden" id="maincategory[]" value="maincategory">
  <input name="subcategory[]" type="hidden" id="subcategory[]" value="subcategory">
  <input name="file_name[]" type="hidden" id="file_name[]" value="file_name<? echo $i+1; ?>">
<?
}
?>
  <input name="action" type="hidden"  value="delete">
  <input name="submit" type="submit"  value="submit">
</form>
 
Hallo Clemens,

danke für deine Hilfe, bin leider erst gerade dazu gekommen. Ich zeige dir einfach mal das Script, so wie ich es verwende.

Die Auswertung/Anzeige:
PHP:
	<?php
for ($i=0;$i<mysql_num_rows($query1);$i++) {
$array[$i] = mysql_fetch_array($query1);
}
for ($i=0;$i<count ($array);$i++) { 
echo "
	<tr>
<a href=\"admin_files_edit.php?id=".$array[$i][id]."\"><td align=\"left\" bgcolor=\"#EDF2FA\" onMouseOver=\"NavRollOver(this)\" onMouseOut=\"NavRollOut(this)\" style=\"cursor: hand\"><strong>".$array[$i][file_subject]."</strong></td></a>
<td align=\"left\" bgcolor=\"#EDF2FA\">".(strlen ($array[$i][file_description]) > 70 ? substr ($array[$i][file_description], 0, 70) . '...' : $array[$i][file_description])."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_name]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_size]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_extension]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_date]."</td>
<td align=\"center\" bgcolor=\"#EDF2FA\"><input name=\"del[]\" type=\"checkbox\" id=\"del[]\" value=\"".$array[$i][id]."\">
<input name=\"maincategory[]\" type=\"hidden\" id=\"maincategory[]\" value=\"".$array[$i][maincategory]."\">
<input name=\"subcategory[]\" type=\"hidden\" id=\"subcategory[]\" value=\"".$array[$i][subcategory]."\">
<input name=\"file_name[]\" type=\"hidden\" id=\"file_name[]\" value=\"".$array[$i][file_name]."\"></td>
</tr>"; 
}
?>
Und hier die Löschfunktion
PHP:
if ($action == "delete") {
for ($i = 0; $i < count($del); $i++) {
unlink ("../../files/".$maincategory[$i]."/".$subcategory[$i]."/".$file_name[$i]."");
$sql3 = "DELETE FROM `$dbtable5` WHERE `id` = '".$del[$i]."'";
mysql_query ($sql3, $dbconnect);
$info_fd_output = "$delete_success";
}
}
else {
$info_fd_output = "$delete_error";
}

Ich gebe im HTML-Teil einem Hidden-Field (action) natürlich noch den Wert delete mit.
 
Hi

Im ersten Block machst du das ganze ein bissel Umständlich. Du benutzt 2 Schleifen brauchst aber nur eine.

PHP:
$result = mysql_query('SELECT id, maincat, subcat FROM table');
while ($row = mysql_fetch_array($result))
{
         echo '<input name="maincategory[' . $row['id'] . ']" value="' . $row[maincat] .'">';
         echo '<input name="subcategory[' . $row['id'] . ']" value="' . $row[subcat] .'">';

}
Bei dem Code im 2.Block würde ich eine foreach Schleife verwenden weil du da den wirklichen-Index hast.

PHP:
foreach ($del as $index => $value)
{
             unlink ("../../files/".$_POST['maincategory'][$index] . "/" . $_POST['subcategory'][$index] . "/" . $_POST['file_name'][$index]);
;
}

Mfg Akkie
 
Zuletzt bearbeitet:
Danke, das ist natürlich besser. Habe es jetzt angepasst. Allerdings ist der Fehler der gleiche. Wenn ich Dateien auswähle, wird immer ab dem ersten Datensatz gelöscht, egal welche ich auswähle. Die Anzahl der ausgewählten Dateien stimmt.

Die Abfrage/Anzeige:
PHP:
	<?php
 
while ($row = mysql_fetch_array ($query1)) {
echo "
	<tr>
<a href=\"admin_files_edit.php?id=".$row[id]."\"><td align=\"left\" bgcolor=\"#EDF2FA\" onMouseOver=\"NavRollOver(this)\" onMouseOut=\"NavRollOut(this)\" style=\"cursor: hand\"><strong>".$row[file_subject]."</strong></td></a>
<td align=\"left\" bgcolor=\"#EDF2FA\">".(strlen ($row[file_description]) > 70 ? substr ($row[file_description], 0, 70) . '...' : $row[file_description])."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$row[file_name]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$row[file_size]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$row[file_extension]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$row[file_date]."</td>
<td align=\"center\" bgcolor=\"#EDF2FA\"><input name=\"del[]\" type=\"checkbox\" id=\"del[]\" value=\"".$row[id]."\">
<input name=\"maincategory[]\" type=\"hidden\" id=\"maincategory[]\" value=\"".$row[maincategory]."\">
<input name=\"subcategory[]\" type=\"hidden\" id=\"subcategory[]\" value=\"".$row[subcategory]."\">
<input name=\"file_name[]\" type=\"hidden\" id=\"file_name[]\" value=\"".$row[file_name]."\"></td>
</tr>"; 
}
?>
Und hier die Löschfunktion:
PHP:
if ($action == "delete") {
foreach ($del as $index => $value) {
unlink ("../../files/".$_POST['maincategory'][$index] . "/" . $_POST['subcategory'][$index] . "/" . $_POST['file_name'][$index]);
$sql3 = "DELETE FROM `$dbtable5` WHERE `id` = '".$_POST['id'][$index]."'";
mysql_query ($sql3, $dbconnect);
$info_fd_output = "$delete_success";
}
}
else {
$info_fd_output = "$delete_error";
}
Was ebenfall noch nicht funktioniert, ist das Löschen in der Datenbank. Das liegt daran, dass ich mir nicht sicher bin wie ich die ID(s) in dieser Zeile richtig mitgebe:
PHP:
$sql3 = "DELETE FROM `$dbtable5` WHERE `id` = '".$_POST['id'][$index]."'";
Würde mich freuen, wenn mir nochmal jemand helfen könnte.
 
Hallo nochmal!
Eine kurze Antwort vorne weg...
qsrs hat gesagt.:
Was ebenfall noch nicht funktioniert, ist das Löschen in der Datenbank. Das liegt daran, dass ich mir nicht sicher bin wie ich die ID(s) in dieser Zeile richtig mitgebe:
PHP:
$sql3 = "DELETE FROM `$dbtable5` WHERE `id` = '".$_POST['id'][$index]."'";
Die POST Variable [id] ist nirgends deklariert, darum kann er da auch nix rauslöschen...
da würde ich in das Formular halt noch ein hidden field einbauen...

Zu dem Ausgabeproblem, hast Du Dir mal den Quellcode den ich gepostet habe kopiert und mal ausprobiert? Denn musst Du doch nur mit Deiner MySql Ausgabe füllen...
 
Hallo Clemens,

danke. Habe es jetzt mit deinem Script noch mal versucht - funktioniert. Allerdings werden nur 3 Datensätze ausgegeben. Das liegt wohl an dieser Schleife:
PHP:
<? 
for ($i = 0; $i < 3; $i++) {
	echo $i + 1;
?>
Ich kann statt dem Wert 3 auch 100 eingeben, dann werden aber bei z.B. 5 Datensätzen 100 Spalten ausgegeben, dabei sollten nur die ausgegeben werden, die tatsächlich Daten enthalten. Ich hoffe, Du kannst mir nochmals helfen. Meine Ausgabe sieht jetzt so aus:
PHP:
	<?
for ($i=0;$i<mysql_num_rows($query1);$i++) {
$array[$i] = mysql_fetch_array($query1);
}
for ($i = 0; $i < 3; $i++) {
	$i + 1;
echo "
	<tr>
<a href=\"admin_files_edit.php?id=".$array[$i][id]."\"><td align=\"left\" bgcolor=\"#EDF2FA\" onMouseOver=\"NavRollOver(this)\" onMouseOut=\"NavRollOut(this)\" style=\"cursor: hand\"><strong>".$array[$i][file_subject]."</strong></td></a>
<td align=\"left\" bgcolor=\"#EDF2FA\">".(strlen ($array[$i][file_description]) > 70 ? substr ($array[$i][file_description], 0, 70) . '...' : $array[$i][file_description])."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_name]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_size]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_extension]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_date]."</td>
<td align=\"center\" bgcolor=\"#EDF2FA\"><input name=\"del[]\" type=\"checkbox\" id=\"del[]\" value=\"$i\">
<input name=\"maincategory[]\" type=\"hidden\" id=\"maincategory[]\" value=\"".$array[$i][maincategory]."\">
<input name=\"subcategory[]\" type=\"hidden\" id=\"subcategory[]\" value=\"".$array[$i][subcategory]."\">
<input name=\"file_name[]\" type=\"hidden\" id=\"file_name[]\" value=\"".$array[$i][file_name]."\"></td>
</tr>"; 
}
?>
 
Warum rufst Du denn nur 3 Datensätze ab? Du kannst das ganze doch für die Menge der Einträge in $array machen!
Und wieso hast Du $i + 1; in der Schleife stehen?
Und was meinst Du damit, dass nur die Datensätze ausgegeben werden sollen, die tatsächlich Daten enthalten? Meinst Du das für jede Spalte oder für einen kompletten Datensatz oder wie?

redlama
 
Hat sich erledigt. Das Ganze sollte natürlich so aussehen:
PHP:
	<?
for ($i = 0; $i < mysql_num_rows($query1); $i++) {
$array[$i] = mysql_fetch_array($query1);
echo "
	<tr>
<a href=\"admin_files_edit.php?id=".$array[$i][id]."\"><td align=\"left\" bgcolor=\"#EDF2FA\" onMouseOver=\"NavRollOver(this)\" onMouseOut=\"NavRollOut(this)\" style=\"cursor: hand\"><strong>".$array[$i][file_subject]."</strong></td></a>
<td align=\"left\" bgcolor=\"#EDF2FA\">".(strlen ($array[$i][file_description]) > 70 ? substr ($array[$i][file_description], 0, 70) . '...' : $array[$i][file_description])."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_name]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_size]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_extension]."</td>
<td align=\"left\" bgcolor=\"#EDF2FA\">".$array[$i][file_date]."</td>
<td align=\"center\" bgcolor=\"#EDF2FA\"><input name=\"del[]\" type=\"checkbox\" id=\"del[]\" value=\"$i\">
<input name=\"maincategory[]\" type=\"hidden\" id=\"maincategory[]\" value=\"".$array[$i][maincategory]."\">
<input name=\"subcategory[]\" type=\"hidden\" id=\"subcategory[]\" value=\"".$array[$i][subcategory]."\">
<input name=\"file_name[]\" type=\"hidden\" id=\"file_name[]\" value=\"".$array[$i][file_name]."\"></td>
</tr>"; 
}
?>
So funktioniert es jedenfalls. Falls ihr noch etwas entdeckt, wäre ich für eine Info dankbar. Erstmal vielen Dank an alle.
 
Zurück