Verifique se há duplicatas antes de inserir

Antes de inserir no database, estou usando o código a seguir para verificar se há duplicatas. Para mim, uma duplicata é considerada apenas uma duplicação quando o name , a description , o price , a city e a partida final.

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

Cada valor é definido antes de executar esta verificação, meu resultado sempre retorna como item já existe. Eu despejei “dupesql” e copiei / colou o comando em phpmyadmin que volta com a contagem 0.

Você quer fazer o seguinte:

 $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 ... } 

Veja aqui para mais informações

Como vejo, sua pergunta pode ser dividida em 2 partes. Por que meu código PHP não está funcionando? Eu não sei, não sei muito PHP e outras pessoas parecem ter respondido que :-). A segunda questão é como posso verificar por duplicatas? Você está verificando se as duplicatas são completamente erradas.

Crie uma chave index / primary exclusiva na sua tabela. Então, quando você tenta inserir o database, ele lançará um erro se houver uma duplicata. Pegue o erro e lide com ele como quiser. Contar o número de registros é definitivamente o caminho errado e será um prejuízo significativo para a velocidade do seu código.

Você ainda pode concorrer em condições de corrida, em que 2 usuários tentam inserir dups ao mesmo tempo, verificar se dups usando uma instrução select simultaneamente dá aos dois usuários a seguir para inserir seus registros. Eu prefiro definir índice exclusivo no database e, em seguida, pegue o erro que faz borbulhar do database.

Você não precisa verificar a singularidade em PHP, você pode simplesmente fazer todo o teste no 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 

Isso só irá inserir os valores se eles passarem o teste de singularidade.

Tente este:

 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) 

Em suma, você precisa fazer sua verificação através do PHP e você também precisa adicionar uma restrição única composta em sua tabela MySQL para obter o melhor dos dois mundos.

Seria bom que rompemos a sua pergunta em duas questões distintas.

1- Como faço para verificar duplicatas usando o PHP e notificar sobre o usuário antes de executar a consulta? 2- Como especificar uma restrição única composta no MySQL?

Primeiro, você precisa de uma function PHP simples para verificar se esse registro existe no DB ou não, como o que se segue:

 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; } 

Você deve chamar sua function PHP assim abaixo:

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

Desta forma, você pode evitar duplicatas antes de ir ao database MySql, mas para ter um database livre duplicado, você precisa adicionar uma restrição única composta em sua tabela MySQL.

Esse simples comando SQL pode fazer o truque:

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

Espero que isso ajude, se eu mexer qualquer coisa, me carregue.

Tente seguir

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