15

私のコードの下を見てください。パラメーターの配列を準備済みステートメントにバインドしようとしています。私は Web を見回してきましたが、call_user_func_array を使用する必要があることがわかりましたが、動作させることができません。私が受け取るエラーは次のとおりです。「最初の引数は有効なコールバックであると予想されます。「配列」が指定されました」間違っている可能性がありますが、最初の引数は配列である可能性があり、おそらくこのエラーメッセージは誤解を招く可能性があります. 問題は、私のアレイに何らかの障害があることだと思います。誰かが私が間違っていることを見ることができますか? ありがとう。

$type = array("s", "s");
$param = array("string1","anotherstring");

$stmt = $SQLConnection->prepare("INSERT INTO mytable (comp, addl) VALUES (?,?)");

$params = array_merge($type, $param);

call_user_func_array(array(&$stmt, 'bind_param'), $params);
$SQLConnection->execute();
4

7 に答える 7

12

PHP 5.6以降、いじる必要はcall_user_func_array()もうありません。

それ以外の:

$stmt->bind_param($param_types, $my_params_array);

次のように、 splat operatorを使用できます。

$stmt->bind_param($param_types, ...$my_params_array); // exact code

于 2018-06-04T13:55:44.977 に答える
9

を使用する必要ある理由はわかりませんがcall_user_func_array、それは別の話です。

私の目に間違っている可能性がある唯一のことは、オブジェクトへの参照を使用していることです。PHP 5.* を使用していると仮定すると、それは必要ありません。

call_user_func_array(array($stmt, 'bind_param'), $params);
于 2009-12-16T11:05:41.920 に答える
0

call_user_func_array(array($statement, 'bind_param'), $bind_arguments) を呼び出す理由は何ですか? $bind_arguments は配列であるためです。クエリされたパラメーターにステートメントをバインドする 1 つの関数が得られます。

良いコードの例...

    <?php
            # link
        $dblink = new mysqli('HOSTNAME','USERNAME','PASSWORD','DATABASENAME');

            # example data
        $statement = $dblink->prepare("SELECT * from Person WHERE FirstName = ? AND MiddleName = ? AND LastName = ? and Age = ?");
        $recordvalues = ['John', 'H.', 'Smith', 25];
        $sqlbindstring = "sssi";    # String, String, String, Integer example

            # make the references
        $bind_arguments = [];
        $bind_arguments[] = $sqlbindstring;
        foreach ($recordvalues as $recordkey => $recordvalue)
        {
            $bind_arguments[] = & $recordvalues[$recordkey];    # bind to array ref, not to the temporary $recordvalue
        }

            # query the db
        call_user_func_array(array($statement, 'bind_param'), $bind_arguments);     # bind arguments
        $statement->execute();  # run statement
        $result = $statement->get_result(); # get results

            # get the results
        if($result) {
            while ($row = $result->fetch_assoc()) {
                print("\n\nMy row is...");
                print_r($row);
            }
        }
    ?>

悪いコードの例...

    <?php

            # Same setup as above..

        $statement->prepare("SELECT * from Person WHERE FirstName = ? AND MiddleName = ? AND LastName = ? and Age = ?");
        $statement->bind('John', 'H.", 'Smith', 25);

    ?>

最初の例: アプリケーション全体で bind() が 1 行だけで呼び出されるように、実行するバインディングにいくらでも渡すことができます。これはうまくスケーリングします。

2 番目の例: データベース内の可能なすべてのレコードについて、可能な挿入グループごとに 1 つの bind() ステートメントを記述する必要があります。これはスケーリングが不十分です。

于 2016-02-21T21:38:56.543 に答える