防止在php中重复的sql插入

时间:2012-08-24 22:15:06

标签: php sql

  

可能重复:
  Prevent Duplicate SQL entries

我只是想找一个简单的方法来告诉我记录是否已经存在,如果存在,则不要将其插入表中。无论是否存在,下面的代码都会插入......我只是想不出原因。

<?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) > 0更改为sqlsrv_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 );
}

1 个答案:

答案 0 :(得分:2)

首先,您需要确定主键。这通常是某种ID字段。我可能建议不要使用FirstName LastName的配对,因为有很多很多人具有相同的名字和姓氏。 “Kevin Kline”是演员和SQL Server MVP的名称(可能有很多甚至更多)。

如果你想盲目地将FirstName LastName插入表中,那么与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”参数。

此外,回到“Kevin Kline”的例子,这只会插入第一个“Kevin Kline”。我想如果您将“Kevin Kline”添加为星型模式中的维度,这将与事实表中的职业等其他维度相关联,我认为这很好。但是,如果那不是您的应用程序域,那么我强烈建议您确定将要用作表键的内容,以便准确跟踪相应的数据。