@VaVa_VooM

Как увеличивать инкремент, если есть поле unique ?

Есть таблица page(id, url). Пишу в бд из массива, где сами элементы уникальны, но они могут быть не уникальными относительно бд. В бд поле url уникально. Но делая следующий запрос
$sql = "INSERT IGNORE page (id, url, title) VALUES ";
			foreach ($links as $value) {
				$sql .= "(".$id.", '".$value[0]."', '".addslashes($value[1])."'), ";
				++$id;
			}
			$sql = rtrim($sql, ", ");
он увеличивает счетчик даже тогда, когда не добавил элемент. Как можно это исправить ?
  • Вопрос задан
  • 2393 просмотра
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg
Любые ответы на любые вопросы
Первая огромная проблема - вы строите запрос конкатенацией, а значит подвергаете себя риску SQL-инъекций. Используйте PDO.

Вторая огромная проблема - вы в наглую игнорируете возникающие ошибки при вставке, в результате у вас и растет номер ключа. Потому как БД сначала создает новый номер, потом пытается вставить, получает ошибку и идет дальше.

Если вы столь заинтересованы в отсутствии утечки номеров (хоть это и не верно с точки зрения архитектуры), вам придется (серьезно потеряв производительность) проверять перед вставкой каждой строки ее возможность наличия в БД.

Если же вы решите просто уменьшать счетчик при возникновении ошибки в момент попытки вставить дубль, вы совершите ошибку, так как можете испортить этот самый счетчик, создав гонку.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Первое, что надо узнать - ЗАЧЕМ тебе это нужно - " делать автоинкремент только тогда, когда он добавил реально запись"? Какая тебе разница, какое значение у этого поля?

Отвечать подробно
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
1) За addslashes() вместо mysql_real_escape_string() руки выкручивать надо
2) Что за $id? Используйте автоинкремент в таблице на уровне БД, БД будет сама его увеличивать при вставке
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы