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() ステートメントを記述する必要があります。これはスケーリングが不十分です。