Я пытаюсь передать переменное количество аргументов методу класса. Вот функция класса, который я пытаюсь вызвать:
class DbHelper{ .... public function Execute($query, $params){ $this->open(); $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error); call_user_func_array(array($stmt, 'bind_param'), $params); // 1 return $stmt->execute() ? $stmt->num_rows : 'ERROR'; } .... }
Вот код, который я использую для вызова функции:
.... $conn = new DbHelper(); $params = array('ss', $ID, $i); $conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', $params); ....
Это дает ошибку:
Предупреждение: Параметр 2 для mysqli_stmt :: bind_param () ожидается как ссылка, значение указано в ..mypath .. \ dbhelper.php on line
В моем другом сообщении (нажмите здесь ) по той же проблеме несколько месяцев назад, некоторые из них предложили мне использовать следующий код:
call_user_func_array(array($stmt, 'bind_param'), refValues($params)); function refValues($arr){ if (strnatcmp(phpversion(),'5.3') >= 0){ //Reference is required for PHP 5.3+ $refs = array(); foreach($arr as $key => $value) $refs[$key] = &$arr[$key]; return $refs; } return $arr; }
Повторное использование этого параметра дает ту же ошибку. Если я вызываю такую функцию (добавление и перед параметрами $):
$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', &$params); // 2
Я получаю эту ошибку:
Устаревший: переадресация вызова по времени устарела в ..mypath .. \ save.php on line
В качестве альтернативы, я пробовал это определение для функции DbHelper::Execute
:
public function Execute($query, $params){ $this->open(); $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error); $stmt->{'bind_param'}($params); // 3 return $stmt->execute() ? $stmt->num_rows : 'ERROR'; }
Вызов этого показывает ошибку как:
Предупреждение: неверный счетчик параметров для mysqli_stmt :: bind_param () в ..mypath .. \ dbhelper.php on line
Где as, счетчик параметров является правильным для bind_param, если функция вызывается правильно.
Версия PHP – 5.3.8.
Любая помощь, пожалуйста?
Функция, предложенная вам, также должна принимать $params
через ссылку. Вот немного обновленная версия:
function refValues(&$arr) { //Reference is required for PHP 5.3+ if (strnatcmp(phpversion(),'5.3') >= 0) { $refs = array(); foreach(array_keys($arr) as $key) { $refs[$key] = &$arr[$key]; } return $refs; } return $arr; }