[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сценарий удаления строк из базы по запросу.
linf
Итак, существует база 01.CSV примерно вид:
Имя1^vvvvv@mail.ru^123456^#тра та та#
Имя2^qqqqq@mail.ru^123456^#тра та та#
Имя3^vvvvv@mail.ru^123456^#тра та та#
Имя4^qqqqq@mail.ru^123456^#тра та та#
Имя5^vvvvv@mail.ru^123456^#тра та та#

итд..
Файл out.php выводит по заданному условию только строки содержащие определенный е-майл.
напротив каждой такой строки стоит checkbox, выделев который мы выбираем те строки которые хотим удалить. (как мне кажеться номера этих строк можно собрать в массив).
Вот его код: (// - так обозначено без кода то, что неполучиось сделать)

PHP
<?php
header
("Content-Type: text/html; charset=utf-8");

//открываем файл 
$file File("01.csv"FILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);

$mail'vvvvv@mail.ru'// по этому емайлу ищится
echo "объявления содержащих E-mail: "$mail"<BR>";
echo 
"объявления выведены в порядке вашего размещения";
// хочеться сюда вставить $stat
echo "<BR><BR>";
    
//цикл сканирования базы данных
for ($i =0$i <= count($file); $i++) {
$out explode('^'$file[$i]);
if (
$mail == $out[1]) {
    echo 
$out[0], " "$out[1], " "$out[2], " "str_replace("#"""$out[3]), " в строке "$i"<BR>" ;
    
$stat += 1// суммируем общее кол-во строк !!!
    
$line $i+1// делаем нулевую строку - первой.
    // - записываем в массив последовательно номера строк удоволетворяющие поставленному условию.
    // - создаем форму напротив каждой строки делаем checkbox
}


}
echo 
"<BR>всего найдено "$stat" объявлений"// общее количество найденых строк (можно ли это вставить до цикла?)

// - создаем новый массив, в который перезаписываем только те данные, которые выделены с помощью checkbox
// - отправляем данные нового массива на файл del.php



Файл del.php перезаписывает только те строки, номера которых указаны в массиве. Вот он:

PHP
<?php
header
("Content-Type: text/html; charset=utf-8");

$fl "01.csv"// файл из которого удаляем строку

$line=4// вместо значения надо как то подставить массив

$file file($fl); //загоняем файл в массив $file
$count count($file); //подсчитываем количество строк
$fp fopen($fl,"w");//очищаем файл
for($i=0;$i<$count;$i++) //создаём цикл, кол-во оборотов равно количиству строк в файле
{
if(
$i!=$line-1//если номер оборота не равен строке перезаписываем
{
fwrite($fp,$file[$i]);
}
else 
//если равен ничего не делаем
{
// - перенаправление на ok.php, Выбранные вами объявления удалены
}
}
fclose($fp); //закончили работать с файлом



-------------
P.S. так же интересует, как заблокировать файл на время перезаписи, а во всех других местах где используется эта же база написать "обратитесь к базе позже"



Спустя 35 минут, 36 секунд (7.07.2009 - 03:52) kirik написал(а):
Цитата (linf @ 6.07.2009 - 19:16)
как заблокировать файл на время перезаписи, а во всех других местах где используется эта же база написать "обратитесь к базе позже"

Использовать file_put_contents c флагом LOCK_EX или лочить при помощи flock.

По коду:
"// суммируем общее кол-во строк !!!" - зачем? У тебя есть подсчитанные строки через count().
"// делаем нулевую строку - первой." - это зачем? у тебя эта переменная нигде не участвует ведь..
"// - записываем в массив последовательно номера строк удоволетворяющие поставленному условию." - через fwrite и записывай..
"$i <= count($file)" - почему "<=" ?

Почему ты сначала explode'ишь каждую строку, и потом оперируешь с нужными данными, а не производишь сначала проверку на содержание подстроки в строке с помошью strpos, и только потом экплодить? Быстрее ведь будет..

"// - создаем форму напротив каждой строки делаем checkbox" - по какому признаку ты будешь удалять строки? У строк есть свой ID? По номерам строк нельзя удалять, вдруг соседний скрипт дописал что-то..

Почему у твоей базы такой странный вид ("Имя1^vvvvv@mail.ru^123456^#тра та та#")? Может проще воспользоваться функцией serialize/unserialize? Разбирать данные будет намного проще.

Спустя 4 часа, 43 минуты, 13 секунд (7.07.2009 - 08:35) sergeiss написал(а):
Цитата (linf @ 7.07.2009 - 04:16)
Итак, существует база 01.CSV примерно вид:
Имя1^vvvvv@mail.ru^123456^#тра та та#
Имя2^qqqqq@mail.ru^123456^#тра та та#


Цитата (linf @ 7.07.2009 - 04:16)
P.S. так же интересует, как заблокировать файл на время перезаписи, а во всех других местах где используется эта же база написать "обратитесь к базе позже"


Встречный вопрос (я его уже раз 500 задавал тут на форуме): ежели это именно база данных, в которой постоянно происходят изменения, то почему ты не используешь нормальную БД??? Там эти вопросы уже все проработаны умными людьми. Остаётся только взять и пользоваться. Время, затраченное на изучение основ работы с БД (целых полчаса-час smile.gif) окупится очень быстро. Потому что ты будешь думать не о всякой фигне типа ограничения одновременного доступа к файлу, а о содержании.

Спустя 1 час, 3 минуты, 25 секунд (7.07.2009 - 09:38) kirik написал(а):
Цитата (sergeiss @ 7.07.2009 - 00:35)
почему ты не используешь нормальную БД???

Тоже хотел спросить, а потом вспомнил как сам начинал smile.gif Это только ради практики. Точно также как сначала все пишут свои CMS, блоги, а потом уже пишут с использованием фрэймворков. Пусть тренится smile.gif

Спустя 4 часа, 44 минуты, 58 секунд (7.07.2009 - 14:23) linf написал(а):
Цитата
"// делаем нулевую строку - первой." - это зачем? у тебя эта переменная нигде не участвует ведь..


Так должна участвовать, их последовательность при цикле должна записаться в массив!

Цитата
"// суммируем общее кол-во строк !!!" - зачем? У тебя есть подсчитанные строки через count().


Для того, что бы подсчитать не общее количество строк, а только лишь тех, которые удовлетворяют условию.

Цитата
"// - создаем форму напротив каждой строки делаем checkbox" - по какому признаку ты будешь удалять строки? У строк есть свой ID? По номерам строк нельзя удалять, вдруг соседний скрипт дописал что-то..


То есть совсем совсем не как? Логически ведь можно сгенерить код чекбоксов, около каждого знаничения массива составленного на основе условий выборки циклом? А отмеченные чекбоксом, переписать в другой массив, а его передать в файл который удаляет...

......
Если есть идеи как произвести выборку лушче, и удаление по условию, то я готов услышать... Или можно хотя бы словами, тока с указанием операторов PHP

Спустя 3 часа, 22 минуты, 6 секунд (7.07.2009 - 17:45) linf написал(а):
Стоп, придумал более простой алгоритм, щас поробую реализовать... если не получится, тогда спрошу тут...

Спустя 3 дня, 8 часов, 27 минут, 5 секунд (11.07.2009 - 02:12) linf написал(а):
В общем все сделано, все работает идеально, но остался один вопросик: "КУда вставить код, что бы при удалении (тоесть выполнения процедуры) перенаправило на одну страничку,а при НЕудалении, тоесть если условие не соблюдено, на другую?"

КОД:

PHP
<?php
header
("Content-Type: text/html; charset=utf-8");

// уточняем переменные
$region = basename($_POST['region']);
$mail = isset($_POST['mail'])?$_POST['mail']:null;
$code = isset($_POST['code'])?$_POST['code']:null;

$file = File("base/$region.csv", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    for ($i =0; $i <= count($file); $i++) {

    $out = explode('^', $file[$i]);

    //удаляем лишние символы
    $out = str_replace("#", "", $out);

    if (($mail == $out[7]) and ($code == $out[8])) { $line = $i+1;  break;}}

// блок удаления.

$file = "base/$region.csv"; // файл из которого удаляем строку
$fule = file($file); //загоняем файл в массив $fule
$count = count($fule); //подсчитываем количество строк до удаления
$fp = fopen($file,"w");//очищаем файл
for($i=0;$i<$count;$i++) //создаём цикл, кол-во оборотов равно количиству строк в файле
{
if(
$i!=$line-1) //если номер оборота не равен строке перезаписываем
{
fwrite($fp,$fule[$i]);
}
else {} //если равен ничего не делаем
}
fclose($fp);



А ВОТ ЭТО НАДО КУДА ТО ВСТАВИТЬ:
PHP
// удалилось или нет?
header('Location: /ok.php?ok=2'); // все ок.
header('Location: /error.php?error=53'); //не удалено.


_____________
Live in new format =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.