sql >> データベース >  >> RDS >> Mysql

call_user_func_array()を使用してプリペアドステートメントを動的に構築します

    あなたがどのように試したかわかりませんが、答えようとします:

    bind_param manualによると

    bind_paramの最初の引数 文字列です 、'ssss'のように 。

    2番目およびその他の引数-クエリに挿入される値です。

    つまり、$a_params 配列はないである必要があります

    0:"New Zealand"
    1:"Grey Lynn"
    2:"Auckland"
    3:"Auckland"
    4:array(4)
    0:"s"
    1:"s"
    2:"s"
    3:"s"
    

    しかし:

    0:"ssss"
    1:"New Zealand"
    2:"Grey Lynn"
    3:"Auckland"
    4:"Auckland"
    

    見る?すべての値は文字列です。そして、プレースホルダーのタイプが最初のものです。

    $a_paramsの引数の順序も考慮に入れてください bind_paramのパラメータの順序と同じである必要があります 。つまり、$a_params のように

    0:"New Zealand"
    1:"Grey Lynn"
    2:"Auckland"
    3:"Auckland"
    4:"ssss"
    

    間違っている。 $a_paramsの最初の要素が bind_paramの最初の引数になります この場合、それは"ssss"ではありません 文字列。

    つまり、これは、$a_paramsを入力した後であることを意味します 値を使用する場合、プレースホルダーの文字列を$a_paramsの先頭に追加する必要があります 、array_unshiftを使用 例:

    // make $a_param_type a string
    $str_param_type = implode('', $a_param_type);
    
    // add this string as a first element of array
    array_unshift($a_params, $str_param_type);
    
    // try to call
    call_user_func_array(array($stmt, 'bind_param'), $a_params);
    

    これが機能しなかった場合は、提供した回答 の一部を参照できます。 、ここで$a_paramsの値 別の配列$tmpへの参照によって渡されます 、あなたの場合、次のようなことを試すことができます:

    // make $a_param_type a string
    $str_param_type = implode('', $a_param_type);
    
    // add this string as a first element of array
    array_unshift($a_params, $str_param_type);
    
    $tmp = array();
    foreach ($a_params as $key => $value) {
        // each value of tmp is a reference to `$a_params` values
        $tmp[$key] = &$a_params[$key];  
    }
    
    // try to call, note - with $tmp, not with $a_params
    call_user_func_array(array($stmt, 'bind_param'), $tmp);
    


    1. PHP警告:mysqli_connect():(HY000 / 2002):接続が拒否されました

    2. 結果が1つしかないことがわかっている場合、MySQLクエリに「LIMIT1」を追加すると、クエリが高速になりますか?

    3. bashから.sqlスクリプトを実行する方法

    4. SQL Serverを使用して文字列を逆の順序で返す方法– REVERSE()