1

次の値をデータベース レコード更新関数に渡すと、何らかの理由で解決できません。すべての列に同じ値が設定されます。

渡すデータは次のとおりです。

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

2 に答える 2

2

以前に何度か回答したことがあるので、以前の回答にリンクします。

つまり、bindParam には参照が必要です。値ではなく変数をステートメントにバインドします。foreach ループ内の変数は各反復の開始時にリセットされるため、最後の参照のみがそのまま残り、すべてのプレースホルダーをそれにバインドすることになります。

ここでの詳細な説明: PDO bindParam issue .

于 2013-03-08T12:36:41.360 に答える
-1

役に立たない 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);
于 2013-03-08T12:28:38.203 に答える