4

パラメータを使用して更新クエリを実行しようとすると、エラーが発生することがわかりました

パラメーターに対して推定される型に矛盾があります

おそらくそれは、ターゲット フィールドのタイプ (文字が異なる) が原因で、すべてがテキスト列タイプで正常に機能します。しかし、この理由だけで列タイプを変更したくありません。次に、params配列をexecuteメソッドに送信する代わりに、paramsを直接渡す必要があると言われました(bindValueまたはbindParamを使用して、各値のタイプを決定します) 。

しかし、そうするとエラーが発生します

エラー: バインド メッセージには 0 個のパラメーターが指定されていますが、準備済みステートメント "pdo_stmt_00000001" には 1 個が必要です

テストコードは

$Stmt = $DB->prepare("SELECT * FROM test_table WHERE test_field=:test_field");
$Stmt->bindValue(':test_field', 'test', PDO::PARAM_STR);
$Stmt->execute();
var_dump($DB->errorInfo());

したがって、理解する限り、バインディングはまったく機能しません。または、私はそれを間違っています。でも、もしかしたら解決する方法はあるのでしょうか?

PHP 5.4.12 を PostgreSQL 9.2.3、libpq 8.4.16 で実行しています。

4

2 に答える 2

5

唯一の解決策は、すべてのテキスト値を次のようにテキストにキャストすることです。

update test_table set test_field = :test_field::text

そうしないと、型の不一致に関するエラーが発生します。

于 2013-02-28T13:08:04.483 に答える
0

私はそれをこのようにします:

$stmt = $DB->prepare("SELECT * FROM test_table WHERE test_field=:test_field");
$stmt->execute(array(":test_field" => 'test'));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if($result)
{
    return $result['id'];
    // Or whatever you're trying to get.
}
return null;

execute関数にパラメーターの配列を投入するだけで、バインディング用に特別な行を追加する必要はありません。

それがあなたのために働くかどうか(またはそうでないかどうか)教えてください。

于 2013-02-28T12:17:00.420 に答える