Проверяйте дубликаты перед вставкой

Перед вставкой в ​​базу данных я использую следующий код для проверки дубликатов. Для меня дубликат рассматривается только как дубликат, когда name , description , price , city и enddate .

 foreach($states_to_add as $item) { $dupesql = "SELECT COUNT(*) FROM table WHERE ( name = '$name' AND description = '$description' AND manufacturer = '$manufacturer' AND city ='$city' AND price = '$price' AND enddate = '$end_date' )"; $duperaw = mysql_query($dupesql); if($duperaw > 0) { echo nl2br("$name already exists in $city \n"); } else { $sql = "INSERT INTO table (..... (here go the values to be inserted) .... 

Каждое значение определяется до выполнения этой проверки, мой результат всегда возвращается, поскольку элемент уже существует. Я сбросил «dupesql» и скопировал / вставлял команду в phpmyadmin, который возвращается с count 0.

Вы хотите сделать следующее:

 $dupesql = "SELECT * FROM table where (name = '$name' AND description = '$description' AND manufacturer = '$manufacturer' AND city ='$city' AND price = '$price' AND enddate = '$end_date')"; $duperaw = mysql_query($dupesql); if (mysql_num_rows($duberaw) > 0) { //your code ... } 

См. Здесь для получения дополнительной информации

Как я вижу, ваш вопрос можно разбить на две части. Почему мой PHP-код не работает? Я не знаю, не знаю много PHP, и другие люди, похоже, только что ответили так :-). Второй вопрос: как проверить дубликаты? Вы проверяете дубликаты совершенно неправильным способом.

Создайте уникальный индекс / первичный ключ в таблице. Затем, когда вы пытаетесь вставить БД, выдается ошибка, если есть дубликат. Поймайте ошибку и обработайте ее, как вы хотите. Подсчет количества записей, безусловно, является неправильным способом, и это будет значительным ущербом для скорости вашего кода.

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

Вам не нужно проверять уникальность в PHP, вы можете просто выполнить весь тест в MySQL:

 INSERT INTO table1 (name, description, ......) SELECT name1, description1, manufacturer1, city1, price1, enddate1 FROM (SELECT * FROM ( SELECT @name:= '$name' as name1 ,@description:= '$description' as description1 ,..... FROM DUAL as d1 LEFT JOIN table1 t1 ON (t1.name = d1.name1 AND t1.description = d1.description1 AND ......) WHERE t1.name IS NULL) s1) s2 

Это будет только вставлять значения, если они пройдут тест уникальности.

Попробуй это:

 foreach($states_to_add as $item) { $dupesql = "SELECT name FROM table WHERE (name = '$name' AND description = '$description' AND manufacturer = '$manufacturer' AND city ='$city' AND price = '$price' AND enddate = '$end_date' )"; $duperaw = mysql_query($dupesql); if( mysql_num_rows($duperaw) ) { echo nl2br("$name already exists in $city \n"); } else { $sql = "INSERT INTO table (..... (here go the values to be inserted) 

Короче, вам нужно выполнить проверку через PHP, и вам также нужно добавить составное уникальное ограничение в таблице MySQL, чтобы получить лучшее из обоих миров.

было бы хорошо, если бы мы нарушили ваш вопрос на два отдельных вопроса.

1- Как проверить дубликаты с помощью PHP и сообщить об этом пользователю перед выполнением запроса? 2- Как указать составное уникальное ограничение в MySQL?

Во-первых, вам нужна простая функция PHP, чтобы проверить, существует ли эта запись в БД или нет, например:

 function is_exist($table, $data){ $sql = "SELECT * FROM `" . $table . "` WHERE "; foreach ($data as $key => $val) : $sql .= "`$key`='" . $val . "' AND "; endforeach; $sql = substr($sql,0, -5); $result = $mysql_query($sql); $count = $mysql_num_rows($result); return ($count > 0) ? true: false; } 

Вы должны вызвать свою функцию PHP следующим образом:

  $data = array('column1'=>$_POST['value'],'column2'=>$_POST['value'], ...); if(is_exist($data)){ // Print your error message }else{ // Run your insert query } 

Таким образом, вы можете предотвратить дублирование перед тем, как перейти в базу данных MySql, но чтобы иметь дублируемую бесплатную базу данных, вам нужно добавить составное уникальное ограничение в таблицу MySQL.

Эта простая команда SQL может сделать трюк:

 alter table `tablename` add unique index(name, description, manufacturer, city, price, enddate); 

Надеюсь, что это поможет, если я все испортил, обременяй меня.

Попробуйте следовать

  INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas');