0

可能的重复:
防止重复的 SQL 条目

我只是在寻找一种简单的方法来告诉我记录是否已经存在,如果存在,则不要将其插入表中。无论它是否存在,下面的代码都会插入......我只是不知道为什么。

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

1 回答 1

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”添加为星型模式中的维度,该维度将与事实表中的专业等其他维度相关联,我想这很好。但是,如果这不是您的应用程序域,那么我强烈建议您确定要用作表键的内容,以便准确跟踪适当的数据。

于 2012-08-24T22:40:28.087 回答