2011-07-21 21 views
0

SQL文を準備し、与えられたパラメータで実行する関数を構築しました。だからここにそれがどのように見えるか:PDO Mysql SQLSTATE [42000]

function go($statement) { 
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

    for($i = 1; $i < func_num_args(); $i++) { 
     $arg_to_pass = func_get_arg($i); 
     $q->bindParam($i, $arg_to_pass, PDO::PARAM_INT); 
    } 
    $q->execute(); 
} 

しかし、私はそれを呼び出すとき、それは私に次のエラーを与える:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;

しかし、この二つの変形は完全に作業している:

function go($statement) { 
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

    for($i = 1; $i < func_num_args(); $i++) { 
     $q->bindValue($i, func_get_arg($i), PDO::PARAM_INT); 
    } 
    $q->execute(); 
} 

(これは愚かですが、テストのためだけです)

function go($statement) { 
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

    $arg_to_pass = func_get_arg(1); 
    $q->bindParam(1, $arg_to_pass, PDO::PARAM_INT); 

    $arg_to_pass2 = func_get_arg(2); 
    $q->bindParam(2, $arg_to_pass2, PDO::PARAM_INT); 

    $q->execute(); 
} 

なぜ、bindParamがループ内で動作しないのですか?

答えて

1

私はそれがあなたがバインディングを破っているためだと思っています - あなたは$arg_to_passに引数を取り出してからバインドします。次の反復では、別のargを同じ変数(これは現在パラメータ#1としてバインドされています)にフェッチし、パラメータ#2として再バインドしようとします。他のバージョンはすべて一意の引数名(func_get_argsからの直接戻り値、異なるvar名など)を使用します。

0

なぜメッセージが表示されているのかわかりませんが、PDOStatement :: bindParam()を使用しようとしていますが、これは参照としてバインドされ、 PDOStatement :: execute()を呼び出すと、元の変数は新しい値で上書きされます。

PDOStatement :: bindValue()を使用すると、値がループ内でコピーされるか、bindParamで一意の変数参照が使用されます。

関連する問題