PDA

View Full Version : php: unlink() only the files that are checked [dusty should know this, always does]



keith
March 21st, 2002, 15:54
i'm writing [at least trying to] a database script in php. people can enter info about themselves and create an account [if you want to call it that]

well, in the admin.php, i'm having trouble being able to delete more than one person at a time. it has a checkbox next to each account name, and i'd like it to be able to delete all accounts that are checked. right now it just deletes the lowest checked account:

here's the code i've written, but it's not quite working correctly, only deletes the most recently checked box. the main troublesome code is near the bottom, in $action == "member_remove"
<?php

if (file_exists("config.php")) {
include("config.php");
}
else {
?>
<html><body><font color="red">config.php</font> is absent.<br></body></html>
<?
exit;
}

if (!$action) {
ShowAdminHeader();
?>

<form action="<? echo("$PHP_SELF"); ?>" method="post">
<input type="hidden" name="action" value="member_remove">

<table width="100%" cellpadding="3" cellspacing="3" border="0">
<tr bgcolor="#dddddd">
<td>
<font size="1" face="verdana">
&nbsp;<br>
</font>
</td>
<td>
<font size="1" face="verdana">
<b>Account Name</b><br>
</font>
</td>
<td>
<font size="1" face="verdana">
<b>Email</b><br>
</font>
</td>
<td>
<font size="1" face="verdana">
<b>Password</b><br>
</font>
</td>
<td>
<font size="1" face="verdana">
<b>Created</b><br>
</font>
</td>
<td>
<font size="1" face="verdana">
<b>Last Modified</b><br>
</font>
</td>
</tr>

<?

$dir="$members";
$a=opendir("$dir");

while ($account_name = readdir($a)) {

$fp = fopen("$dir/$account_name", 'r');
$data = fread($fp, filesize("$dir/$account_name"));
list($epoch,$created,$modified,$email,$pass,$info) = explode("\n",$data);
fclose ($fp);

if(ereg("^\.",$domain)) continue;
echo "\n<tr>\n";
echo "<td bgcolor=\"#eeeeee\">";
echo "<input type=\"checkbox\" name=\"remove\" value=\"$account_name\">";
echo "</td>\n";
echo "<td>";
echo "<font size=\"1\" face=\"verdana\">$account_name</font>";
echo "</td>\n";
echo "<td bgcolor=\"#eeeeee\">";
echo "<font size=\"1\" face=\"verdana\"><a href=\"mailto:$email\">Send Email</a></font>";
echo "</td>\n";
echo "<td>";
echo "<font size=\"1\" face=\"verdana\">$pass</font>";
echo "</td>\n";
echo "<td bgcolor=\"#eeeeee\">";
echo "<font size=\"1\" face=\"verdana\">$created</font>";
echo "</td>\n";
echo "<td>";
echo "<font size=\"1\" face=\"verdana\">$created</font>";
echo "</td>\n";
echo "</tr>\n\n";
}

closedir($a);

?>
</table>

<br>
<input type="submit" value="Remove Selected Members"><br>
</form>
<?
ShowAdminFooter();
exit;
}

elseif (($action == "member_remove") && eregi("$PHP_SELF", $referer)) {

while ($remove) {

if ($remove) {
$delete = unlink("$members/$remove");
}

if ($delete) {
ShowAdminHeader();
?>
<font color="red"><? echo("$remove"); ?></font> was successfully removed.<br>
<?
ShowAdminFooter();
exit;
}
else {
ShowAdminHeader();
?>
<font color="red"><? echo("$remove"); ?></font> was not removed.<br>
<?
ShowAdminFooter();
exit;
}

}

}

else {
header("Location: http://$HTTP_HOST$PHP_SELF");
exit;
}
?>

Dusty
March 21st, 2002, 20:45
Wherever you've got a checkbox being printed out, i.e.:

echo "<input type=\"checkbox\" name=\"remove\" value=\"$account_name\">";

Change the name to "remove[]".

Dusty
March 21st, 2002, 21:03
Oh, I just noticed something else that won't work: You've got this:


while($remove){
...doing stuff with $remove, like unlink("$members/$remove");
}

Do this instead:


while(list($key,$element)=each($remove)){
...do stuff with $element, like unlink("$members/$element")
}

Or do this (this is actually better, it's faster running):


foreach($remove as $element){
...do stuff with $element, like unlink("$members/$element")
}

keith
March 22nd, 2002, 07:02
hey, thanks a lot! i'll make those changes.

keith
March 22nd, 2002, 07:11
with those changes, it tells me
"Array" was successfully removed.instead if the account name, and no changes are made [no accounts deleted.]

Dusty
March 22nd, 2002, 11:57
Did you do the foreach or the while/list/each loop?

keith
March 22nd, 2002, 14:44
i used the 'foreach'.

ok, i tweaked it a bit. here's the code i'm using, it still only deletes one account, but now it's the account nearest to the top of the list:
while ($account_name= readdir($a)) {

$fp = fopen("$members/$domain", 'r');
$data = fread($fp, filesize("$members/$domain"));
list($epoch,$created,$modified,$email,$pass,$info) = explode("\n",$data);
fclose ($fp);

if(ereg("^\.",$account_name)) continue;
echo "\n<tr>\n";
echo "<td bgcolor=\"#eeeeee\">";
echo "<input type=\"checkbox\" name=\"remove[]\" value=\"$account_name\">";
echo "</td>\n";
echo "<td>";
echo "<font size=\"1\" face=\"verdana\">$account_name</font>";
echo "</td>\n";
echo "<td bgcolor=\"#eeeeee\">";
echo "<font size=\"1\" face=\"verdana\"><a href=\"mailto:$email\">Send Email</a></font>";
echo "</td>\n";
echo "<td>";
echo "<font size=\"1\" face=\"verdana\">$pass</font>";
echo "</td>\n";
echo "<td bgcolor=\"#eeeeee\">";
echo "<font size=\"1\" face=\"verdana\">$created</font>";
echo "</td>\n";
echo "<td>";
echo "<font size=\"1\" face=\"verdana\">$modified</font>";
echo "</td>\n";
echo "<td bgcolor=\"#eeeeee\">";
echo "<font size=\"1\" face=\"verdana\"><a href=\"http://$url\" target=\"_blank\">View</a></font>";
echo "</td>\n";
echo "</tr>\n\n";
}
foreach($remove as $element){

unlink("$members/$element");

ShowAdminHeader();
?>
<font color="red"><? echo("$element"); ?></font> was successfully removed.<br>
<?
ShowAdminFooter();
exit;
}

Dusty
March 22nd, 2002, 15:13
foreach($remove as $element){
unlink("$members/$element");
ShowAdminHeader();
?>
<font color="red"><? echo("$element"); ?></font> was successfully removed.<br>
<?
ShowAdminFooter();
exit;
}
Remove the "exit;".

keith
March 22nd, 2002, 15:18
holy crap i'm an idiot... i'll give that a shot :cool:

keith adds: hey, it works! thanks a lot. i've been stuck at that spot for two days [well, not two days straight.. but you get the idea]

keith
March 27th, 2002, 21:24
hey, sorry to keep bugging you, but a small error on my end... if you hit submit without checking any boxes, it returns an error. what type of statement would i need to get around that?

megapuzik
March 27th, 2002, 21:45
if(!isset($checkbox))
{
no value
}

keith
March 27th, 2002, 22:57
you rock. so simple, yet so helpful.