26

原因がわかりません。mysqli_stmt::bind_param() へのエラーパラメータ 3 の原因は参照であると予想され、指定された値は...

PDO
$query = "INSERT INTO test (id,row1,row2,row3) VALUES (?,?,?,?)";
$params = array(1,"2","3","4");
$param_type = "isss";
$sql_stmt = mysqli_prepare ($mysqli, $query);
call_user_func_array('mysqli_stmt_bind_param', array_merge(array($sql_stmt, $param_type), $params));
mysqli_stmt_execute($sql_stmt);

OOPも試しました

OOP
$insert_stmt = $mysqli->prepare($query);
array_unshift($params, $param_type);
call_user_func_array(array($insert_stmt, 'bind_param'), $params);
$insert_stmt->execute();

しかし、同じエラーで、現在はパラメーター 2 が問題を引き起こしています。

では、$params の何が問題なのですか? $params を値の配列にする必要があります。

4

3 に答える 3

57

アップデート

この回答は時代遅れです。Stacky の回答のように、新しい PHP バージョンではスプレッド演算子を使用してください。

PHPドキュメントから:

mysqli_stmt_bind_param() を call_user_func_array() と組み合わせて使用​​する場合は注意が必要です。mysqli_stmt_bind_param() はパラメーターを参照渡しする必要があるのに対し、call_user_func_array() は参照または値を表すことができる変数のリストをパラメーターとして受け入れることができることに注意してください。

そしてページmysqli-stmt.bind-paramには、さまざまな解決策があります。

例えば:

call_user_func_array(array($stmt, 'bind_param'), refValues($params));

function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}
于 2013-04-20T13:30:49.640 に答える
1

コードに「PDO」という単語が含まれている理由はわかりませんが、それが唯一の正しい単語です。PDOを使用すると、mysqli の準備済みステートメントに関する問題に直面することはありません。

$query = "INSERT INTO test (id,row1,row2,row3) VALUES (?,?,?,?)";
$params = array(1,"2","3","4");
$stmt = $pdo->prepare($query);
$stmt->execute($params);

このクリーンで簡潔なコードを見て、必要な mysqli 準備済みステートメントと比較してください。

于 2013-04-20T13:25:41.883 に答える