PHP - Удаление строки из файла

12
E2
На сайте с 26.03.2009
Offline
65
3776

Здравствуйте.

Мне необходимо из файла удалить определенную запись - строку.

То есть, есть форма, в ней input, там вводится имя пользователя и далее жмется сабмит.

В файл delete.php передается переменная $username.

Как сделать, чтобы скрипт искал юзера ($username) в файле passwd и при обнаружении строки удалял ее?

passwd - файл паролей, внутри содержатся записи вида:

root:42dsfggf809238dl

Надо чтобы скрипт нашел имя (символы до ":") и удалил строку.

Спасибо.

D
На сайте с 25.09.2008
Offline
16
#1

через функцию file читаешь построчно файл. дальше каждую строку сплитишь по : и сравниваешь пользователя с эталонным. Если совпадает, то удаляешь из массива строк эту строку и оставшееся записываешь назад в файл. Тока права доступа на файл проверь.

[umka]
На сайте с 25.05.2008
Offline
456
#2

<?

if ($_POST['username']) {
if (preg_match('/^[a-z0-9]$/i',$_POST['username']) {
$f=file('users.dat');
for ($i=0; $i<@count($f); $i++) {
list($login,$pass)=explode(':',$f[$i]);
if ($login==$_POST['username']) {
unset($f[$i]);
break;
}
}
fileputcontents('users.dat',implode("\n",$f));
}
}
?>
<form method="post">
Username: <input type="text" name="username"> <input type="submit" value="Delete!">
</form>

?! :)

Лог в помощь!
E2
На сайте с 26.03.2009
Offline
65
#3

Премного благодарен 🚬

Enforcer25 добавил 01.02.2010 в 13:43

Странно, но почему-то не работает (((

Никаких ошибок, вроде все ок, но в файле строка не удаляется.

J
На сайте с 02.02.2009
Offline
53
#4


<?
$file_with_passwords = '123';
if(!empty($_POST['login']) && preg_match('|^[a-z0-9]+$|i', $_POST['login'])){
if(!is_writable($file_with_passwords)){
die("Файл ".$file_with_passwords." недоступен для записи");
}
$file_contents = file($file_with_passwords);
foreach($file_contents as $k=>$v){
if(preg_match("|^$_POST['login']:|",$v)){
unset($file_contents[$k]);
}
}
file_put_contents($file_with_passwords,implode("\n",$file_contents));
}
?>

Файл-то доступен для записи?

E2
На сайте с 26.03.2009
Offline
65
#5

Я на денвере теперь пробую.

Выдало:

111.txt111.txt недоступен для записи

Создал вручную файл и уже не ругается. Но и в файле строку не удаляет.

Зато пробелы между строк вставил.

<?

$file_with_passwords = '111.txt';
if(!empty($_POST['login']) && preg_match('|^[a-z0-9]+$|i', $_POST['login'])){
if(!is_writable($file_with_passwords)){
die("111.txt".$file_with_passwords." недоступен для записи");
}
$file_contents = file($file_with_passwords);
foreach($file_contents as $k=>$v){
if(preg_match("|^$v:|",$v)){
unset($file_contents[$k]);
}
}
file_put_contents($file_with_passwords,implode("\n",$file_contents));
}

?>
<form method="post">
Username: <input type="text" name="login"> <input type="submit" value="Delete!">
</form>
J
На сайте с 02.02.2009
Offline
53
#6

Ну продебажьте теперь - посмотрите, - находит ли вообще такой логин.

Пробелы можно убрать заменив implode("\n",..) на implode("",...)

E2
На сайте с 26.03.2009
Offline
65
#7
jumash:
Ну продебажьте теперь - посмотрите, - находит ли вообще такой логин.

Сорри, но как это сделать?

J
На сайте с 02.02.2009
Offline
53
#8

if(preg_match("|^$v:|",$v)){

unset($file_contents[$k]);

}

заменить на

if(preg_match("|^$_POST['login']:|",$v)){

echo "НАШЛИ ЛОГИН ".$_POST['login'];

unset($file_contents[$k]);

}

E2
На сайте с 26.03.2009
Offline
65
#9
jumash:
if(preg_match("|^$v:|",$v)){
unset($file_contents[$k]);
}

заменить на

if(preg_match("|^$_POST['login']:|",$v)){
echo "НАШЛИ ЛОГИН ".$_POST['login'];
unset($file_contents[$k]);
}

О! Большое вам спасибо, теперь заработало все.

Пишет Нашли логин и строка удалилась. Супер! :)

Enforcer25 добавил 02.02.2010 в 14:47

Ребята, выручите еще раз плиз.

На основе последнего кода, как сделать чтобы помимо удаляемой строки, удалялась бы еще строка следующая?

J
На сайте с 02.02.2009
Offline
53
#10

unset($file_contents[$k]);

добавить

unset($file_contents[$k+1]);

break;

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий