Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO MSSQL-插入检查重复项-命名占位符_Php_Sql_Sql Server_Pdo - Fatal编程技术网

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

Php PDO MSSQL-插入检查重复项-命名占位符,php,sql,sql-server,pdo,Php,Sql,Sql Server,Pdo,在我的脚本中,我用JSON解析URL,用JSON_decode创建数组 我想要的是,每次我解析这个脚本时,使用mssql的PDO来检查将要插入DB的值是否已经存在,如果不存在,则将它们插入DB。我没有要检查的特定列,我只想检查我插入的内容是否与每个列一样,与数据库中已经存在的内容相同 到目前为止,我得到的结果如下: $json = file_get_contents($jsonurl,0,null,null); $jsonArray = json_decode($json, true); //

在我的脚本中,我用JSON解析URL,用JSON_decode创建数组

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

到目前为止,我得到的结果如下:

$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本机客户端11.0]计数 C:\xampp\htdocs\test PDO.php中的字段不正确或语法错误:129 堆栈跟踪:#0c:\xampp\htdocs\test PDO.php(129): PDOStatement->execute()#1{main}抛出 C:\xampp\htdocs\test-PDO.php,第129行

更新: 使用时

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

它返回:

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

有什么想法吗


提前感谢您

您必须绑定并命名它们两次。。。您不能(重新)使用例如: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";