0

任意のテーブル内の任意のエントリを任意の文字列値 (1 つまたは複数) で更新できるようにする php 関数を作成しました。スクリプトは動作していないように見えますが、PDO はエラーをスローしません! データベース、テーブル、フィールドの名前を何度も確認しました。それはすべて正しいです。これは、私の関数で機能しない唯一のクエリです。SQL ステートメントと PDO->bindParam() 関数に渡す配列と関係があると思います。

コード:

public function updateTableDetail($table, $id, $params) {

    include($this->doc_root . 'config/config.php');

    if (is_array($params)) {
        foreach ($params as $param) {
            $param = Utilities::escapeString($param);
        }
    } else {
        throw new InvalidInputException(InputErrors::NOTANARRAY);
    }
    if (is_nan($id)) throw new InvalidInputException(InputErrors::NOTANUMBER);
    $table = Utilities::escapeString($table);

    $sql = "UPDATE " . $table . "
            SET " . $config['table_field_updated'] . " = :updated";
    while (current($params)) {
        $sql .= "," . key($params) . " = :" . key($params);
        next($params);
    }
    reset($params);
    $sql .= " WHERE id = :id 
             AND " . $config['userId'] . " = :userId";

    if ($this->serverConnector == null) {
        $this->serverConnector = new ServerConnector();
    }
    if ($this->db == null) {
        $this->db = $this->serverConnector->openConnectionOnUserDb($this->dbname);
    }
    $stmt = $this->db->prepare($sql);
    $updated = date("Y-m-d H:i:s");
    $stmt->bindParam(':updated',$updated);
    $stmt->bindParam(':id',$id);
    $stmt->bindParam(':userId',$this->userId);
    while ($param = current($params)) {
        $stmt->bindParam(":".key($params),$param);
        next($params);
    }
    reset($params);
    $stmt->execute();
}

編集: include ステートメント、$config[]-array、およびクラス変数について心配する必要はありません。それもすべて機能しています。それらの値はすでにテストされています。

4

1 に答える 1

0

この部分を変更します。

while ($param = current($params)) {
        $stmt->bindParam(":".key($params),$param);
        next($params);
    }

に:

foreach($params as $key => &value){
$stmt->bindParam(":$key",$value);
}

PHPマニュアルによると: PDOStatement::bindParam

ステートメントの準備に使用された SQL ステートメント内の対応する名前付きプレースホルダーまたは疑問符プレースホルダーに PHP 変数をバインドします。PDOStatement::bindValue() とは異なり、変数は参照としてバインドされ、PDOStatement::execute() が呼び出されたときにのみ評価されます。

于 2013-08-15T19:25:46.770 に答える