2012-08-24 90 views
0

可能重複:
Prevent Duplicate SQL entries防止在PHP重複SQL INSERT

我只是在尋找一種簡單的方法來告訴我,如果一個記錄已經存在,如果確實如此,不要將其插入表格中。下面的代碼插入,無論它是否存在或不......我只是不明白爲什麼。

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

編輯:

最終,改變sqlsrv_num_rows($dup) > 0sqlsrv_has_rows($dup)固定的問題。以下是我的更新代碼:

$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

嘗試'選擇*從聯繫人WHERE FirstName ='$ FirstName'AND LastName ='$ LastName''作爲檢查。 –

回答

1

首先,您需要確定您的主鍵。這通常是某種ID字段。我可能會建議不要使用名字姓氏的配對,因爲有很多很多人的名字和姓氏相同。 「Kevin Kline」是演員和SQL Server MVP的名稱(可能還有許多,甚至更多)。

如果你想只是盲目地插入名姓到一個表,然後一個RDBMS無關的查詢會更喜歡

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

(聲明:我知道按照你有什麼我沒有格式化在您的文章,這是由於以下)

但是:

您的代碼也容易受到SQL注入式攻擊。請閱讀PHP方法sqlsrv_query,特別注意「params」參數。

此外,回到「凱文克萊恩」的例子,這將只會插入第一個「凱文克萊恩」。如果您將「凱文克萊恩」添加爲星型架構中的維度,並與事實表中的職業等其他維度相關聯,那麼我認爲這很好。但是,如果這不是您的應用程序域,那麼我強烈建議您確定要用作桌面鍵的內容,以便準確跟蹤相應的數據。

+0

謝謝@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)指出我正確的方向。該表只包含幾十個人,所以我不期待任何具有相同名字的人的實例,但如果這樣做,我會使它更嚴格。就SQL注入漏洞而言,我的更新代碼是否受到更好的保護? – pbenemy