2012-08-24 3 views
0

Possible en double:
Prevent Duplicate SQL entriesempêcher insertion sql double en php

Je suis à la recherche d'un moyen simple de me dire si un enregistrement existe déjà, et si elle le fait, ne pas l'insérer dans la table. Le code ci-dessous insère indépendamment du fait qu'il existe ou non ... et je ne peux pas comprendre pourquoi.

<?php 
$FirstName = $_POST["FirstName"]; 
$LastName = $_POST["LastName"]; 

$conn = sqlsrv_connect($hostname, $connectionInfo) 

$dup = sqlsrv_query($conn, "SELECT * FROM contact WHERE (FirstName='$FirstName') AND (LastName='$LastName')"); 
if(sqlsrv_num_rows($dup) > 0) 
{ 
    echo "Already Exists"; 
} 
else 
{ 
    $query = "INSERT INTO contact (FirstName, LastName) VALUES ('$FirstName', '$LastName')"; 
    sqlsrv_query($conn, $query); 
} 

EDIT:

En fin de compte, le changement sqlsrv_num_rows($dup) > 0-sqlsrv_has_rows($dup) a résolu le problème. Voici mon code mis à jour:

$params = array($_POST['FirstName'], $_POST['LastName']); 
$conn = sqlsrv_connect($hostname, $connectionInfo) 
$sql = "SELECT * FROM contact WHERE FirstName = ? AND LastName = ?"; 
$dup = sqlsrv_query($conn, $sql, $params); 
if(sqlsrv_has_rows($dup)) 
{ 
    echo "Already Exists"; 
} 
else 
{ 
    $query = "INSERT INTO contact (FirstName, LastName) VALUES (?, ?)"; 
    sqlsrv_query($conn, $query, $params); 
} 
+0

Essayez 'SELECT * FROM contact WHERE Prénom = '$ Prénom' AND Nom = '$ Nom' pour la vérification. –

Répondre

1

D'abord, vous devez identifier votre clé primaire. C'est généralement une sorte de champ d'identification. Je recommanderais probablement de ne pas utiliser l'appariement de FirstName LastName car il existe de nombreuses instances de personnes ayant le même prénom et le même nom. "Kevin Kline" est le nom d'un acteur et d'un MVP SQL Server (et il y en a probablement beaucoup, beaucoup plus).

Si vous voulez simplement insérer aveuglément FirstName LastName dans une table, puis une requête SGBDR agnostique serait plus comme

INSERT INTO contact (FirstName, LastName) VALUES ($FirstName, $LastName) WHERE NOT EXISTS 
(SELECT 1 FROM contact where FirstName = $FirstName and LastName = $LastName); 

(disclaimer: Je sais que je ne l'ai pas formater en fonction de ce que vous aviez dans votre poste, cela est dû à ce qui suit)

CEPENDANT:

votre code est également vulnérable aux attaques par injection SQL. S'il vous plaît lire sur la méthode PHP sqlsrv_query en accordant une attention particulière à l'argument "params".

De plus, en retournant à l'exemple de "Kevin Kline", cela n'insèrera que le premier "Kevin Kline". Je suppose que c'est bien si vous ajoutez "Kevin Kline" comme une dimension dans un schéma en étoile qui sera associé à d'autres dimensions comme Profession dans une table de faits. Cependant, si ce n'est pas votre domaine d'application, je vous recommande fortement de déterminer ce que vous allez utiliser comme clés de votre table afin de pouvoir suivre avec précision les données appropriées.

+0

Merci @swasheck, [this] (http://blogs.msdn.com/b/brian_swan/archive/2010/03/04/what_2700_s-the-right-way-to-avoid-sql-injection-in-php -scripts_3f00_.aspx) m'a orienté dans la bonne direction. La table ne contiendra qu'une douzaine de personnes, donc je ne m'attends pas à des instances de personnes avec le même nom, mais si c'est le cas je le rendrai plus strict. En ce qui concerne la vulnérabilité d'injection SQL, mon code mis à jour est-il mieux protégé? – pbenemy

Questions connexes