在发布了这个问题之后MySQL update or insert or die query,我已经改用PDO,但是在使用on duplicate key update短语时遇到了一些问题。
以下是我的数组数据示例。
我收到了“无效的参数号:未定义参数”错误消息。 我相信我的问题在于
此外,我对:name和::语法很陌生,
以下是我的数组数据示例。
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
是否意味着它是一种命名变量,就像$name
一样,并且PDOStatement::bindValue
类似于PDOStatement->bindValue
?
编辑
根据下面的前两条评论,我已经更新了代码(但仍然没有成功,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()
中。 - Michael Berkowskiprepare()
函数,因此仍然容易受到注入攻击。请参阅我的答案编辑获取更多信息。 - Michael BerkowskiSET
子句中,逗号分隔的字段之间可能需要加上空格 - 我不确定是否可以省略空格。使用逗号和空格连接它们:$field_list = join(',',$fields);
- Michael Berkowski