在我的脚本中,我使用JSON解析URL,并使用json_decode创建数组。
我想要的是,使用PDO for mssql,每次我解析这个脚本时,检查即将插入数据库的值是否已经存在,如果没有,请将它们插入到数据库中。我没有要检查的特定列,我只想检查我插入的内容(如每个列)是否与数据库中已存在的相同。
到目前为止我的样子是这样的:
$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} 第129行的C:\ xampp \ htdocs \ test-PDO.php
更新: 使用时
$ DBH-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_WARNING);
它返回:
警告:@'@'〜:在第82行的C:\ xampp \ htdocs \ test-PDO.php中 警告:PDOStatement :: execute():SQLSTATE [07002]:COUNT字段 不正确:0 [Microsoft] [SQL Server Native Client 11.0] COUNT字段 第82行C:\ xampp \ htdocs \ test-PDO.php中的错误或语法错误
有什么想法吗?
提前谢谢
答案 0 :(得分:1)
你必须将它们绑定并命名两次......你不能(重新)使用例如: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";