由于某种原因,当我将以下值传递给数据库记录更新函数时,我无法解决问题,它会为每列设置相同的值。
这是我传递的数据:
$_values = array(
'client_fname' => $_POST['client_fname'],
'client_lname' => $_POST['client_lname'],
'client_email' => $_POST['client_email']
);
$_args= array('client_id' => $_id);
$db->dbUpdate('client', $_values, $_args)
它将每个列(client_fname,client_lname,client_email)更新为$ _id值,而不是已发布的值。而我无法弄清楚我做错了什么:(
这是绑定参数之前创建的查询:
UPDATE client SET client_fname=:0, client_lname=:1, client_email=:2 WHERE client_id=:w0
这是函数
public function dbUpdate($_table, $_values, $_args) { //TODO: Fix Function
try {
$query = 'UPDATE '.$_table.' SET ';
$i = 0; foreach ($_values as $_field => $_value) {
if($i == 0) {
$query .= $_field.'=:'.$i;
} else {
$query .= ', '.$_field.'=:'.$i;
}
$i++;
}
$query .= ' WHERE ';
$i = 0; foreach ($_args as $_field => $_value) {
if($i == 0) {
$query .= $_field.'=:w'.$i;
} else {
$query .= ', '.$_field.'=:w'.$i;
}
$i++;
}
$sql = $this->db->prepare($query);
$i = 0; foreach ($_values as $_field => $_value) {
$sql->bindParam(':'.$i, $_value); $i++;
}
$i = 0; foreach ($_args as $_field => $_value) {
$sql->bindParam(':w'.$i, $_value); $i++;
}
if($sql->execute()) {
return true;
} else {
return false;
}
}
catch (PDOException $e) {
print_r($e->errorInfo);
die();
}
}
答案 0 :(得分:2)
之前我已经回答了几次,所以我将链接到之前的回答。
简而言之,bindParam需要引用。它将变量而不是值绑定到语句。由于foreach循环中的变量在每次迭代开始时被重置,因此只有最后一个引用保持不变,并且最终将所有占位符绑定到它。
此处有详细解释:PDO bindParam issue。
答案 1 :(得分:-1)
与无用的PDO不同,real database abstraction libraries会让你避免这样的混乱,使所有代码变为3行
$allowed = array('client_fname', 'client_lname', 'client_email');
$insert = $db->filterArray($_POST,$allowed);
$db->query("UPDATE client SET ?u WHERE client_id=?i",$insert, $_id);