Mic*_*ael 5 php parameters pdo insert
发布此问题MySQL更新或插入或死亡查询后我改为使用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"}
Run Code Online (Sandbox Code Playgroud)
实际上有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();
}
Run Code Online (Sandbox Code Playgroud)
我收到了无效的参数号:参数未定义错误消息.我很确定我的问题在于,ON DUPLICATE KEY UPDATE :fieldlist');但我做了很多不同的尝试,但没有一个有效.我应该再使用ON DUPLICATE KEY UPDATE了吗?
另外,我是:和:: syntax的新手,是否: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;
Run Code Online (Sandbox Code Playgroud)
您尝试做的是动态构建一个将被参数化的 SQL 字符串。这些:paramname参数应该是映射到列值、where 子句参数等的单个值。相反,您已经习惯了$fields[] = sprintf("%s = :%s", $key, $key);创建字段字符串:paramname以便插入查询中。这在参数化语句中不起作用。
您应该在ON DUPLICATE KEY UPDATE :fieldlist将整个 sql 字符串传递到prepare().
然后,bindParam()您可以使用替代语法来传递execute()一组预期参数值,而不是使用该方法单独绑定每个参数。它们的顺序必须正确,或者数组键的名称与:paramSQL 中的参数名称相同。 请参阅文档以获取更多信息和示例。
$array_of_parameters = array();
foreach($faculty as $key=>$val){
$array_of_parameters[$key] = $val);
}
$stmt->execute($array_of_parameters);
Run Code Online (Sandbox Code Playgroud)
编辑要在UPDATE语句中正确使用参数,请执行以下操作:
// Create your $field_list before attempting to create the SQL statement
$field_list = join(',', $fields);
$update = 'UPDATE fhours SET '.$field_list. 'WHERE fname=:fname AND lname=:lname';
// Here, echo out $update to make sure it looks correct
// Then add the fname and lname parameters onto your array of params
$array_of_parameters[] = $_POST['fname'];
$array_of_parameters[] = $_POST['lname'];
// Now that your parameters array includes all the faculty in the correct order and the fname & lname,
// you can execute it.
$stmt->prepare($update);
$stmt->execute($array_of_parameters);
Run Code Online (Sandbox Code Playgroud)