2013-09-27 3 views
0

В моем скрипте я разбираю URL-адрес с JSON, а с помощью json_decode я создаю массив.PDO MSSQL - INSERT INTO для проверки дубликатов - с именами заполнителей

Что я хочу, используя PDO для 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), оно предотвращает размещение ЛЮБЫХ строк в БД и использование заполнителей doesn ' т.

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[07002]: [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error' in C:\xampp\htdocs\test-PDO.php:129 Stack trace: #0 C:\xampp\htdocs\test-PDO.php(129): PDOStatement->execute() #1 {main} thrown in C:\xampp\htdocs\test-PDO.php on line 129

UPDATE: При использовании

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

возвращается:

Warning: @'@'˜Ñ: in C:\xampp\htdocs\test-PDO.php on line 82 Warning: PDOStatement::execute(): SQLSTATE[07002]: COUNT field incorrect: 0 [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error in C:\xampp\htdocs\test-PDO.php on line 82

Любые идеи?

Спасибо заранее

ответ

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"; 
Смежные вопросы