Проверьте наличие дубликатов перед вставкой - PullRequest
8 голосов
/ 11 октября 2011

Перед вставкой в ​​базу данных я использую следующий код для проверки на наличие дубликатов. Для меня дубликат считается дубликатом только тогда, когда 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, который возвращается со счетчиком 0.

Ответы [ 7 ]

15 голосов
/ 11 октября 2011

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

$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($duperaw) > 0) {
  //your code ...
}

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

6 голосов
/ 11 октября 2011

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

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

1 голос
/ 11 октября 2011

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

0 голосов
/ 04 сентября 2013

Попробуйте подписку

  INSERT IGNORE INTO person_tbl (last_name, first_name) 
  -> VALUES( 'Jay', 'Thomas');
0 голосов
/ 26 августа 2012

Короче говоря, вам нужно выполнить проверку с помощью 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);

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

0 голосов
/ 11 октября 2011

Вам не нужно проверять уникальность в 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

При этом значения будут вставляться только в том случае, если они проходят тест на уникальность.

0 голосов
/ 11 октября 2011

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

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)
...