Зачем вам вызывать call_user_func_array (массив (оператор $, 'bind_param'), $ bind_arguments)? Потому что $ bind_arguments - это массив. Вы получаете одну функцию, которая связывает оператор с его запрашиваемыми параметрами, независимо от того, сколько параметров у вас было бы в противном случае.
Пример хорошего кода ...
<?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 () мог вызываться только в одной строке во всем вашем приложении. Это хорошо масштабируется.
Во втором примере: вы должны написать один оператор bind () для каждой возможной группы вставок для каждой возможной записи в вашей базе данных. Это плохо масштабируется.