PDO更新函数为每个列设置相同的值-循环错误


PDO Update Function sets same value to every column - loop error

由于某些原因,我无法确定当我将以下值传递给数据库记录更新函数时,它为每列设置相同的值。

这是我传递给它的数据:

  $_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();
    }
}

这个问题我以前已经回答过几次了,所以我将链接到我以前的答案。

简而言之,bindParam需要引用。它将变量(而不是值)绑定到语句。由于foreach循环中的变量在每次迭代开始时被重置,因此只有最后一个引用是完整的,并且最终将所有占位符绑定到它。

详细解释在这里:PDO bindParam问题

与无用的PDO不同,真正的数据库抽象库将使您避免这种混乱,使所有代码变成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);