发布此问题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