21

これを行う関数があります:

function registerUser($firstName, $lastName, $address, $postcode, $email, $password)
{
    $params = array($firstName, $lastName, $address, $postcode, $email, $password);
    $result = $this->db->bind("INSERT INTO Users VALUES (?, ?, ?, ?, ?, ?)", 'ssssss', $params);
}

これは、これを行うデータベース クラスに送信されます。

public function bind($query, $type, $params)
{
    $this->query = $query;
    $stmt = $this->mysqli->prepare($this->query);
    $stmt->bind_param($type, $param);
    $stmt->execute;
}

問題は、これが機能しないことです。

私が望んでいたのは、$paramsリストを取得して の後にリストすることでした$type。これにより、クエリは次のようになります。

$stmt->bind_param('ssssss', $firstName, $lastName, $address, $postcode, $email, $password);

しかし、明らかに私はそれについて間違った方法で進んでいます。

bind_param配列を作成する方法はありますか...いわば、クエリ段階で印刷されるリストに変換しますか?

4

7 に答える 7

0

mysqli_stmt_bind_param()パラメータを参照渡しする必要があるため、 のパラメータは参照でなければならないことに注意しcall_user_func_array()てください。クラス コンテキストからの例:

function execute( string $query, string $type, array $params )
{
    if ( !$stmt = $this->mysqli->prepare( $query ) ) 
        throw new \Exception( 'Prepare failed: ' . $query . PHP_EOL . $this->mysqli->error );

    // call stmt->bind_param() with variables to bind passed as a reference 
    call_user_func_array( 
        array( $stmt, 'bind_param' ), 
        array_merge( 
            array( $type ), 
            array_map( function( &$item ) { return $item; }, $params ) 
        ) 
    );

    if ( !$stmt->execute() ) 
        throw new \Exception( 'Execute failed: ' . PHP_EOL . $stmt->error );

}

}
于 2016-06-19T23:43:00.667 に答える
0

今日、準備ステートメントを使用するより短い方法を作成するために、私は自分でいくつかの調査を行いました。回答@bwoebiは非常に役立ちますが、不明な量のパラメーターでは機能しないため、これは彼の回答への追加です。

例えば:

public function bind($query, $type, &...$params)
    {

        $this->query = $query;
        $stmt = $this->mysqli->prepare($this->query);
        call_user_func_array(array($stmt, "bind_param"), array_merge([$type], $params));
        $stmt->execute();
    }

このスレッドを使用: PHP: 参照による可変長引数リスト?

クラス内のバインド関数に不明な量のパラメーターを渡すことができました。次に、call_user_func_array(...) を使用して、$type 変数の配列マージを使用して bind param 関数を呼び出します... (マージのために配列内に配置する必要があります)

これで、$email と $password を参照してこの関数を呼び出すことができます。

$myClass->bind($query, "ss", $email, $password);
于 2018-07-16T13:11:18.237 に答える