發佈此問題MySQL update or insert or die query後我已更改爲使用PDO,但我在使用重複密鑰更新短語時遇到了一些問題。PDO在重複密鑰更新上插入
這裏是我的陣列數據
array(114) {
["fname"]=>
string(6) "Bryana"
["lname"]=>
string(6) "Greene"
["m080"]=>
string(1) "c"
["t080"]=>
string(1) "-"
["w080"]=>
string(1) "-"
["r080"]=>
["notes"]=>
string(4) "yoyo"}
在現實中的例子也有113場,但我不想浪費他們展示在這裏的所有空間。我目前正試圖通過下面的代碼
try {
$dbh = new PDO('login info here');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare(
'INSERT INTO fhours ('.implode(",", array_keys($faculty)).')'.
' VALUES (:'.implode(",:", array_keys($faculty)).')'.
' ON DUPLICATE KEY UPDATE :fieldlist');
$stmt->bindParam(':field_list', $field_list);
foreach($faculty as $key=>$val){
$stmt->bindParam(':'.$key, $val);
$fields[] = sprintf("%s = :%s", $key, $key);
}
$field_list = join(',', $fields);
//echo $stmt->debugDumpParams();
$stmt->execute();
}
catch(PDOException $e){
echo $e->getMessage();
exit();
}
,我發現了無效的參數號插入/更新到我的數據庫:參數沒有被定義的錯誤消息。我很確定我的問題在於ON DUPLICATE KEY UPDATE :fieldlist');
,但我做了很多不同的嘗試,但都沒有成功。我應該再使用ON DUPLICATE KEY UPDATE
了嗎?
而且,我是新來的:和::語法,並:name
意味着它是一個命名的變量有點像$name
和不PDOStatement::bindValue
種像PDOStatement->bindValue
?
編輯
針對前兩種意見在下面,我正是如此更新的代碼(但仍無濟於事,該debugDumpParams說我沒有PARAMS)。另外,爲什麼要創建$array_of_parameters
,當它變成與$faculty
開頭的完全相同的數組?
//grab form data
$faculty = $_POST;
$fname = $_POST['fname'];
$lname = $_POST['lname'];
//delete the submit button from array
unset($faculty['submit']);
$array_of_parameters = array();
foreach($faculty as $key=>$val){
$array_of_parameters[$key] = $val;
$fields[] = sprintf("%s=?", $key);
}
$field_list = join(',', $fields);
try {
$dbh = new PDO('mysql:host=localhost;dbname=kiosk', 'kiosk', 'K10$k');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$update = 'UPDATE fhours SET '.$field_list. 'WHERE fname="'.$fname.'" AND '.
'lname="'.$lname.'"';
$stmt = $dbh->prepare($update);
//echo $stmt->debugDumpParams();
$stmt->execute(array($array_of_parameters));
if($stmt->rowCount() == 0){
$insert = 'INSERT INTO fhours ('.implode(",", array_keys($faculty)).')'.
' VALUES (:'.implode(",:", array_keys($faculty)).')';
$stmt = $dbh->prepare($insert);
$stmt->execute(array($array_of_parameters));
}
}
catch(PDOException $e){
echo $e->getMessage();
exit();
}
$dbh=null;
之所以要創建'$ array_of_parameters'是因爲在你的第一次迭代中,您使用的約束PARAMS對於'ON DUPLICATE KEY'子句和'INSERT VALUES()'。它們都必須在傳遞給execute()的同一個數組中進行。第一次使用'$ array_of_parameters'調用execute()時,您的UPDATE語句中沒有使用任何參數。此外,你已經將數組包裹在另一個'array()'中,這是不必要的。 – 2011-06-03 20:42:24
你先用UPDATE語句做SQL字符串連接,然後傳遞給'prepare()',所以它仍然容易被注入。有關更多信息,請參閱我的答案中的編輯。 – 2011-06-03 20:43:14
您可能需要在'SET'子句中的逗號分隔字段之間留出空格 - 我不記得是否有效省略空格。使用逗號空格加入他們$ field_list = join(',',$ fields);' – 2011-06-03 20:49:18