Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: PHP, как проверять перез записью на дублирование в файле?
цитата
06/04/12 в 17:24
 Yabuti
Всем привет!

Подскажите пожалуйста, как сделать так, чтобы не записывать в базу дубли уже существующих строк?

Т.е. у меня этот код записывает одну строку в файл-базу:

Код:
$zapis = "http://memino.ru/img/".$filename."|".$overtext."|".$overtext2."|"."\r\n";
$fh = fopen("baza.txt", "a");
fwrite($fh, $zapis);
fclose($fh);


Пробовал добавлять
Код:
$fh = array_map('trim', $fh);
if (array_search($zapis, $fh) !== false)
die('Уже в каталоге!');

- вообще перестает работать.

При обновлении страницы с кодом - она записывает очередную копию в файл-базу, а это не нужно.

Если не тяжело, подскажите пожалуйста механизм проверки на дублирование перед записью.

Заранее большое спасибо! smail04.gif
цитата
06/04/12 в 17:34
 Ailk
Попробуй использовать это:
http://www.php.net/manual/en/function.in-array.php
цитата
06/04/12 в 17:35
 Pentarh
Открой для себя sqlite
цитата
06/04/12 в 17:36
 FXIX
читаешь файл в массив. потом
array_search ( mixed $needle , array $haystack)

если true то не пишешь.

ты запись(строку) хочешь найти в $fh(ресурсе)...
цитата
06/04/12 в 19:36
 Stek
Советую писать в файл как есть и не заморачиватся над дублями. А дубли фильтровать уже при извлечении данных из файла. Весьма внушительно сэкономишь нагрузку на процессор.
цитата
06/04/12 в 22:33
 idk2045
если производительность не важна, т.е. файл маленький, или запускается скрипт редко, то сойдет такое:
Код:
$zapis = 'hello world';
$lines = file('baza.txt');
$lines = array_map('trim', $lines);
if (!in_array($zapis, $lines))
  file_put_contents('baza.txt', $zapis."\n", FILE_APPEND);

иначе надо оптимизировать, либо как Stek сказал, либо читать построчно, сравнивать и если нашел дубль, то сразу выходить.
цитата
06/04/12 в 23:22
 kodek
Pentarh писал:
Открой для себя sqlite

+1
Очень удобно для небольших проектов.
По сути - SQL (со всеми его прелестями), но база в одном файле (как с текстовыми БД).
цитата
06/04/12 в 23:29
 Nux
вполне может подойти очень простая конструкция при небольшой базе, а вобще большие базы в таком формате не совсем правильно держать...

if(stristr($zapis, $fh)) {
echo dubl;
}else{
........
}

или

stripos($fh, $zapis);
.....
или

для более сложных задач preg_match

я думаю это будет проще и быстрее чем загонять в массив а потом перебирать

но все зависит от того какая у тебя база и данные
цитата
07/04/12 в 00:18
 idk2045
вы тока человека не путайте таким использованием $fh
в исходном примере это просто указатель на файл, а не содержимое.
а так вариант выше я думаю действительно самый простой.

Код:
$zapis = 'hello world';
if (stristr(file_get_contents('baza.txt'), $zapis) === false)
  file_put_contents('baza.txt', $zapis."\n", FILE_APPEND);
цитата
07/04/12 в 03:05
 Yabuti
Блин, вот я туплю:
Цитата:
При каждом обновлении - создается картинка с новым именем (стаб+текущее время). Конечно они все разные будут trollface.png

Большое спасибо за помощь, работает, тестил на "123" smail54.gif

Буду думать теперь, как бы теперь файлы называть, чтобы при каждом обновлении не создавался новый icon_biggrin.gif
цитата
07/04/12 в 03:09
 Pentarh
Ты мазохист чтоле? SQLite юзай тебе говорят.
цитата
07/04/12 в 03:25
 idk2045
Pentarh писал:
SQLite юзай тебе говорят.

нафига тут sqlite.. человек даже не сказал объем базы, там может макс тыща записей. зачем усложнять код.
цитата
07/04/12 в 04:12
 Yabuti
Pentarh: не умею я trollface.png

grozny: не могу сказать, т.к. все от трафа зависит
цитата
07/04/12 в 15:41
 idk2045
Yabuti писал:
grozny: не могу сказать, т.к. все от трафа зависит

ну если просто зависит, т.е. на данный момент нету большого трафа, то надо юзать самое простое решение. будет траф переделаешь на базу.
цитата
07/04/12 в 16:00
 FXIX
Pentarh писал:
Ты мазохист чтоле? SQLite юзай тебе говорят.

ага. пока с файлами не наебутся - не поймут что база - единственно верное решение вообще под все связанное с программингом.
ее боятся. и бегают от нее. пока за шкирку силой не притащишь - буду с файлами плюхаться...до потери сознания



таблица логов. поля field1,field2 уникальные. дата вставляется автоматом при записи строки. в коде 1 строка INSERT с аттрибутом IGNORE(не пропустит дубли по уникальным полям) или INSERT ловящий ошибку базы при вставке. любой вариант
цитата
07/04/12 в 16:17
 Stek
FXIX писал:
пока с файлами не наебутся - не поймут что база - единственно верное решение вообще под все связанное с программингом.
ее боятся. и бегают от нее.


А потом возникает вторая стадия, когда в базу пихают все подряд и обращаются туда по любому чиху. В результате страница вордпресса с плагинами генерит по 100-300 запросов в базу icon_surprised.gif

Кстати столкнулся с ситуацией, что sqlite на многих дедикейтах банально отсутствует. Его админы выпиливают по принципу "все равно мускуль будет".

p.s. а логи все равно удобнее в текстовый файл писать. Потом уже кроном извлечь в базу и строить любые выборки.
цитата
07/04/12 в 16:59
 Yabuti
Будет база, но попозже, когда научусь.

Я вообще в php как-то разочаровался, очень легко поломали скрипт trollface.png Да и код сложно оставлять читабельным, после 50 строк стало сложно ориентироваться в нем (возможно, из-за нулевого опыта).

Засел на Интуите за курс Питона, перепишу под него, как смогу кодить и базу прикручу icon_cool.gif
цитата
07/04/12 в 17:38
 idk2045
Yabuti писал:
Да и код сложно оставлять читабельным, после 50 строк стало сложно ориентироваться в нем (возможно, из-за нулевого опыта).

не ленись давать переменным длинные но интуитивные имена, отступай больше строк между логическими блоками smail101.gif
цитата
07/04/12 в 19:43
 Stek
Yabuti писал:
Засел на Интуите за курс Питона, перепишу под него, как смогу кодить и базу прикручу


На питоне другие буквы используются ? icon_smile.gif
цитата
07/04/12 в 20:17
 FXIX
Stek писал:
p.s. а логи все равно удобнее в текстовый файл писать. Потом уже кроном извлечь в базу и строить любые выборки.


ну смотря какие логи. логи ошибок - можно в файл. в парсере курл не открыл страницу - допизды. в следующий заход откроет. страница в базе висит как не распарсенная.

а логи с данными только в базу. тут вроде логи с данными )
цитата
08/04/12 в 06:32
 Yabuti
Stek: да icon_neutral.gif
цитата
08/04/12 в 14:28
 begemot
Откройте для себя сериализацию icon_smile.gif
цитата
08/04/12 в 15:05
 idk2045
begemot писал:
Откройте для себя сериализацию

так она нихуйова тормозит на больших объемах данных
цитата
08/04/12 в 17:41
 begemot
grozny вывод - на больших не использовать


Эта страница в полной версии