2

私はこれにこだわっていますが、最近自分自身を学ぶために PDO に切り替えました。

/**
* update
* @param string $table A name of a table to update into
* @param string $data An associative array.
* @param string $where WHERE = ?.
*/
public function update($table, $dataArr, $where)
{
    $fieldDetails = NULL;

    foreach( $dataArr as $key => $value)
    {
        $fieldDetails .= "`$key` =:$value, ";
    }
    $fieldDetails = rtrim($fieldDetails,', ');

    echo "UPDATE $table SET ($fieldDetails) WHERE (`id`=:$where)";


    $stmt = $this->prepare("UPDATE $table SET ($fieldDetails) WHERE (`id`=:$where)");
    foreach($dataArr as $key => $value) 
    {
        //Binder key till värde.
        $stmt->bindValue(":$key", $value);
    }
    $stmt->bindValue(":$where", $where);
    $stmt->execute();

}

私の挿入機能は魔法のように機能しますが、この更新機能は機能しません。IDがバインドされていないことに関係していると思います。ドキュメントとスレッドを検索しましたが、解決策が見つかりません。

私の関数呼び出し。

public function update()
{
    $this->db->update(
    'testtable',
    array(
    'text' => 'exempel',
    'name' => 'exempel',
    ), 0);
}

警告: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: 無効なパラメーター番号: パラメーターが定義されていませんでした

関数で渡す整数値を正しくバインドして、ステートメントを実行できるようにするにはどうすればよいですか?

4

2 に答える 2

0

編集:
まあ、私はコードを見落としました、私の謝罪。
とにかく、コードはSQLインジェクションに対してオープンであり、PDOタグwikiのソリューションを使用することをお勧めします。

ちなみに、PDOのような石器時代のライブラリではなく、もっと便利なものを使用する場合は、簡単に記述できるため、update()関数はまったく必要ありません。

$db->query("UPDATE ?n SET ?u WHERE id=?i",$table, $dataArr, $id);

この後者のコードはあなたのコードよりもはるかに安全ですが、はるかに柔軟であることに注意してください。

  • テーブル名を保護します
  • フィールド名を保護します
  • IDベースのWHEREだけでなく、どのような条件でも使用できます。
  • 実際にはどんな構文(JOINでも)が可能です
于 2013-03-12T12:44:46.820 に答える
0
$fieldDetails .= "`$key` =:$key, ";

値ではなく、キー名をプレースホルダーとしてここに配置する必要があります。

于 2013-03-12T12:49:38.033 に答える