|
|
|
| Всем привет, замучился удалять дубли, хотя их не должно быть.
Есть БД, куда добавляются записи. Параметр уникальности заключается в номере (id), который берется из того места, где беру обновления.
<?php
$nachat; // id с которого начать
$vsite; // id которым закончить
for($f=$nachat; $f<=$vsite; $f++){
$antipovtor = mysql_query("SELECT * FROM `obnovlenie` WHERE `idobnov` = '".$f."'");
if(mysql_num_rows($antipovtor) == 0)
{
mysql_query("INSERT INTO `obnovlenie` VALUES('', '".$parser."', '".$f."', '0')");
}
}
?>
|
Т.е. циклом прохожу по каким-то id, проверяю у себя в БД, есть ли такой id, если нет, то записываю запись. Но проскакивают дубли, причем дублируется не всегда...
Какие меры принять, чтобы избежать дублей? Как проводить проверку? В чем может быть проблема?
Заранее спасибо!! | |
|
|
|
|
|
|
|
для: grafen
(02.09.2011 в 08:55)
| | Если при работе с базой данных у вас есть цикл (тем более for) и внутри запрос к БД, то процентов 90 вы делаете что-то неправильно. Вы пытаетесь работать с БД с тем багажом знаний которые получили от РНР, это не совсем правильно. Не MySQL выступает тут помощником, а как раз наоборот РНР. Все должна делать БД, а РНР нужно использовать по возможности только для ввода и вывода информации
__
покажите таблицы и расскажите что и при каких условиях нужно обновлять
скорее всего задача решается одним запросом
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Valick
(02.09.2011 в 09:26)
| | Есть сторонние сайты, с которыми я договорился и беру информацию. Чтобы не напрягать админов (без экспорта с их стороны), разработал схему парсера стороннего сайта, в котором узнаю последний id на стороннем сайте. После чего, имея этот id, смотрю в свою базу (смотрю последний id, который был добавлен со стороннего сайта). И начинаю перебор страниц от последнего в моей базе до последнего id, который только что узнал на стороннем сайте. Таким образом, я добавляю нужную (новую) инфу со стороннего сайта, себе в базу. | |
|
|
|
|
|
|
|
для: grafen
(02.09.2011 в 08:55)
| | Мало пока информации... а $f как правило что из себя представляет? | |
|
|
|
|
|
|
|
для: cheops
(02.09.2011 в 13:49)
| | В $f список id, которые нужно пропарсить на стороннем сервере.
Мне Valick уже дал направление в строну "insert ignore", для начала это попробую :) | |
|
|
|
|
|
|
|
для: grafen
(02.09.2011 в 14:33)
| | Могу ошибаться, но скорее всего у вас порядок элементов не совпадают, поэтому запрашиваемое значение и содержимое в таблице могу не совпадать. Лучше пока не поздно нормировать таблицу, избавившись от всех последовательностей через запятую. СУБД - это мощное средство для работы со списками, однако, если их хранить в строках, а не с таблицах, приходится реализовывать все алгоритмы обработки списков самостоятельно. | |
|
|
|
|
|
|
|
для: cheops
(02.09.2011 в 16:08)
| | да оно там вроде и не через запятую, там же цикл, а в цикле запрос
другое дело зачем там ' ' раз id это по идее число | |
|
|
|
|
|
|
|
для: Valick
(02.09.2011 в 16:13)
| | Не важно есть запятые или нет, список - это список, он имеет порядок следования элементов, если не упорядоченного следования, при сравнении строк могут быть проблемы. | |
|
|
|