[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Глючит проверка на существование записи в таблице
Страницы: 1, 2
KeiGreSC
Во общем написал код для проверки, вот проблемный кусок кода:
if(!mysql_fetch_row(mysql_query("SELECT 1 FROM `DataBase` WHERE `Address`='{$randomKeys[2]}' LIMIT 1"))){ //Если не false(т.е свободно), тогда..
$u++;
$tu++;
if($u>=$totu){
continue 2; //Вылет из этого цикла и новая итерация в верхнем
}
continue; // Новая итерация текущего цикла
}else{ //иначе, свободно - вылетаем текущего из цикла
break;
}

/*Когда проверка прошла успешно(т.е свободно) идёт запись в БД*/
mysql_query("INSERT INTO `DataBase`(`collum1`, `collum2`, `Address`, `collum3`, `collum4`, `collum5`, `collum6`) VALUES('{$randomKeys[4]}','{$randomKeys[5]}','{$randomKeys[2]}','{$randomKeys[0]}','{$randomKeys[3]}','{$randomKeys[1]}','{$randomKeys[6]}')") or die ('Error in db INSERT: ' .mysql_error());

$i++;


Ну и собственно проблема заключается в том, что проверка тупо иногда не проходит, идёт запрос на запись данных в БД и происходит вылет с ошибкой дубликата ячейки в базе(ячейка, кстати, с атрибутом "UNIQUE").

В чом может быть причина такого?

p.s. Пробовал проверять через разные варианты реализации, и оно проверяет, но тоже иногда не проходит в любом варианте...
Так же пробовал просто записывать сразу в базу и если ошибка, тогда типа проверку не прошло и продолжал цикл, но это: 1-Не правельно, 2-В базе всё равно идёт автоинкремент ID.
Ещё пробовал ставить задержку usleep(); на пол секунды, ничего не помогло тоже...


И я даже во обще в ступоре, в чом проблема и как решить... Помогите пол может кто увидит ошибку или что подскажет.. Очень жду подсказок.
Valick
объясните смысл $randomKeys[2], генерация уникального идентификатора это сложная задача, и чем нагруженнее проект, тем сложнее.
Например при слабом алгоритме генерации и малом количестве посетителей все работает хорошо, а при увеличении количества происходят "глюки" (что на самом деле является вполне закономерным процессом)

почему нельзя использовать табличный примари кей в данной ситуации?

_____________
Стимулятор ~yoomoney - 41001303250491
KeiGreSC
Обьясню детальние. Этот код это кусок от скрипта, который читает строки их файла и записывает их в базу. Строки должны быть разные все в базе, вот для этого и нужно что б работала проверка.

$randomKeys[2] - это рандомный ключ, значение которого просто содержит строку прочитаную из файла, которая записывается в базу.


Цитата
почему нельзя использовать табличный примари кей в данной ситуации?


А вот с этим не понял... поподробние плз.
killer8080
`Address` уникальное поле (UNIQUE)?
KeiGreSC
Цитата
`Address` уникальное поле (UNIQUE)?

Да уникальное, именно для этого всё и делаю ибо оно и должно быть только уникальное.
killer8080
тогда смотри в сторону INSERT ... ON DUPLICATE KEY UPDATE
http://dev.mysql.com/doc/refman/5.0/en/ins...-duplicate.html
KeiGreSC
Нене, так я знаю что можно, но исходя из проверки на валидность записи в базе, ещё выполняется запись в файл. т.е если в базе уже есть то не пишется никуда, а если нету, то пишется в базу и в файл.

Ну там же нельзя что б послать запрос записи в таблицу, он вернул false, проверка прошла неудачно с этого в файл не записалось но в базе вместо новой записи и увеличения автоинкрементируемого поля просто апдейтнулся адрес?
killer8080
KeiGreSC
можно после запроса вызвать mysql_affected_rows ()
http://php.net/manual/ru/function.mysql-affected-rows.php
Цитата
Возвращаемые значения

Возвращает количество измененных записей в случае успеха, и -1 в случае если последний запрос не удался.

Если последний запрос был DELETE без указания WHERE и, соответственно, таблица была очищена, функция вернёт ноль во всех версиях MySQL до 4.1.2.

При использовании UPDATE, MySQL не обновит колонки, уже содержащие новое значение. Вследствие этого, функция mysql_affected_rows() не всегда возвращает количество рядов, подошедших под условия, только количество рядов, обновлённых запросом.

Запрос REPLACE сначала удаляет запись с указанным первичным ключом, а потом вставляет новую. Данная функция возвращает количество удаленных записей вместе с количеством вставленных.

В случае использования запросов типа "INSERT ... ON DUPLICATE KEY UPDATE", возвращаемое значение будет равно 1 в случае, если была произведена вставка, или 2 при обновлении существующего ряда.
KeiGreSC
Ну вроде похоже на решение, счас затестю и отпишусь..
killer8080
mysql_query("

INSERT INTO `DataBase`
(`collum1`, `collum2`, `Address`, `collum3`, `collum4`, `collum5`, `collum6`)
VALUES
('
{$randomKeys[4]}','{$randomKeys[5]}','{$randomKeys[2]}','{$randomKeys[0]}',
'
{$randomKeys[3]}','{$randomKeys[1]}','{$randomKeys[6]}')
ON DUPLICATE KEY UPDATE `id`=`id`

"
) or die ('Error in db INSERT: ' .mysql_error());

if(!mysql_affected_rows()){
// запись в файл
}
KeiGreSC
Цитата
ON DUPLICATE KEY UPDATE `id`=`id`

Это на сколько я понял обновит ID текущего поля тем же ID и не тронит другие столбцы?
killer8080
Цитата (KeiGreSC @ 1.12.2012 - 23:23)
Это на сколько я понял обновит ID текущего поля тем же ID и не тронит другие столбцы?

Это потому что мы должны что то обновить по условию запроса, просто так пропустить нельзя, для этого и делается пустышка. Поскольку поле id обновляется тем же самым значением, реальной перезаписи не произойдет, и функция mysql_affected_rows() вернет 0
KeiGreSC
Нене, это как раз меня устраевает, просто переспросил наверняка что б знать что будет происходить..

И на будущее, ф-ция mysql_affected_rows() возвращает 0 только при апдейте теми же данными что было до апдейта, а если данные будут другие то вернёт 2, всё првильно я понял?


Короче работает, но не верно обновляет ID, идут пропускания, типа:
78
79
81
82
83
85

Это точно так же как и при простом запросе на запись с ошибкой перезаписи уникального значения в столбе...

На сколько я понял оно сначала посылает запрос на запись, потом идёт ошибка, потом индикатор инкремента повышается на +1, ну и потом идёт обновление текущего ID..
но следующий ID уже идёт не по порядку(((
Valick
id - это не порядковый номер, это идентификатор строки, и как говорил один мудрый человек "не трогайте его, он не ваш".

вам нужно переписать из файла в базу чтобы строки не повторялись?
покажите формат строки файла и расскажите в какие поля это нужно сохранить

_____________
Стимулятор ~yoomoney - 41001303250491
KeiGreSC
Что уже хотите мне посоветовать разбить строки файла на подстроки и сделать из этого всего один SQL запрос?
Сразу скажу такое мне не катит... мне нужно что б в базу и в файл паралельно писало и что б в конце они были идентичны.
Так что надо реализовать именно так и никак не иначе... Но вот как это сделать я просто в ступоре раз база тупо глючит, бред просто какой то...
Быстрый ответ:

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