PDO MSSQL - 插入到检查重复项 - 命名占位符


PDO MSSQL - INSERT INTO check for duplicates - named placeholders

在我的脚本中,我正在使用 JSON 解析一个 URL,并使用json_decode创建一个数组。

我想要的是,每次解析此脚本时,使用 MSSQL 的 PDO 来检查即将插入数据库的值是否已经存在,如果没有,请将它们插入数据库中。我没有要检查的特定列,我只想检查我插入的内容是否与数据库中已经存在的内容相同

到目前为止,我所拥有的看起来像这样:

$json = file_get_contents($jsonurl,0,null,null);
$jsonArray = json_decode($json, true);
// Connection code goes here of course... $DBH = new PDO ... etc.
$query = "IF NOT EXISTS (SELECT * FROM dbo.table
        WHERE
        FirstName = :fn
        AND LastName = :ln
        AND Address = :addr
        )
    BEGIN
        INSERT INTO dbo.table 
        (FirstName, LastName, Address)
        VALUES
        (:fn, :ln, :addr)
    END";

$STH = $DBH->prepare($query);
// assign variables to each place holder
$STH->bindParam(':fn', $firstname);
$STH->bindParam(':ln', $lastname);
$STH->bindParam(':addr', $address);    
// Loop through every contacts in the array and grab the following values
foreach($jsonArray['contacts'] as $key => $val){    
    $firstname  = $val["properties"]["firstname"]["value"];
    $lastname       = $val["properties"]["lastname"]["value"];
    $address        = $val["properties"]["address"]["value"];
    $STH->execute();
}

$jsonArray可能包含一些空值,不确定这是否会导致任何问题。

因此,在上面的查询中,如果我手动输入一个不存在的 FirstName 值,那么它可以工作,但是当我输入一个存在于 bindParam 数组 ($firstname( 中的值时,它会阻止将任何行放入数据库中并且使用占位符也不起作用。

致命错误:未捕获的异常"PDOException",并显示消息 'SQLSTATE[07002]: [Microsoft][SQL Server Native Client 11.0]COUNT 字段不正确或语法错误' 在 C:''xampp''htdocs''test-PDO.php:129 堆栈跟踪: #0 C:''xampp''htdocs''test-PDO.php(129(: PDOStatement->execute(( #1 {main} throw in C:''xampp''htdocs''test-PDO.php 在第 129 行

更新:使用时

$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING(;

它返回:

警告:@'@' ̃Ñ: 在 C:''xampp''htdocs''test-PDO.php 第 82 行 警告:PDOStatement::execute((: SQLSTATE[07002]: COUNT 字段 不正确: 0 [Microsoft][SQL Server 本机客户端 11.0]COUNT 字段 C:''xampp''htdocs''test-PDO.php 第 82 行中的错误或语法错误

有什么想法吗?

提前谢谢你

您必须

绑定并命名它们两次...您不能(重新(使用例如 :fn两次。

$STH->bindParam(':fn', $firstname);
$STH->bindParam(':ln', $lastname);
$STH->bindParam(':addr', $address);    
$STH->bindParam(':fn2', $firstname);
$STH->bindParam(':ln2', $lastname);
$STH->bindParam(':addr2', $address);    

$query = "IF NOT EXISTS (SELECT * FROM dbo.table
    WHERE
    FirstName = :fn
    AND LastName = :ln
    AND Address = :addr
    )
BEGIN
    INSERT INTO dbo.table 
    (FirstName, LastName, Address)
    VALUES
    (:fn2, :ln2, :addr2)
END";