【发布时间】:2011-09-08 00:56:20
【问题描述】:
在发布此问题MySQL update or insert or die query 后,我已更改为使用 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();
}
我收到 Invalid parameter number: parameter was not defined 错误消息。我很确定我的问题在于ON DUPLICATE KEY UPDATE :fieldlist');,但我做了很多不同的尝试,但都没有奏效。我应该再使用ON DUPLICATE KEY UPDATE 吗?
另外,我是 : 和 :: 语法的新手,:name 是否意味着它是类似于 $name 的命名变量,而 PDOStatement::bindValue 是否类似于 PDOStatement->bindValue?
编辑
为了响应下面的前两个 cmets,我已经更新了代码(但仍然无济于事,debugDumpParams 说我没有参数)。另外,当$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的原因是因为在您的第一次迭代中,您对ON DUPLICATE KEY子句和INSERT VALUES()都使用了绑定参数。所有这些都必须放在传递给execute()的同一个数组中。第一次使用$array_of_parameters调用execute()是在未使用任何参数的UPDATE 语句中。此外,您已将数组包装在另一个array()中,这是不必要的。 -
您的第一个 UPDATE 语句执行 SQL 字符串连接,然后传递给
prepare(),因此它仍然容易受到注入。有关更多信息,请参阅我的答案中的编辑。 -
SET子句中的逗号分隔字段之间可能需要一个空格 - 我不记得省略空格是否有效。用逗号加入他们$field_list = join(', ', $fields);
标签: php parameters insert pdo