Description
Предлагаю заменить подготавливаемые выражения на
vsprintf($sql, array_filter($params, function ($param){
return $this->_mysqli->real_escape_string($param);
}));
например
public function query($sql, array $params = []) {
if ($params) {
$sql = vsprintf($sql, array_filter($params, function ($param){
return $this->_mysqli->real_escape_string($param);
}));
}
return $this->_mysqli>query($sql);
}
p.s.
Каждый подготавливаемый запрос использует ресурсы сервера. Если запрос больше не нужен, его необходимо сразу закрыть. Если не сделать этого явно, запрос закроется сам, но только когда PHP освободит его дескриптор, как правило это происходит при выходе запроса из области видимости или при завершении работы скрипта.
Использование подготавливаемых запросов не всегда приводит к повышению эффективности. Если параметризованный запрос запускается лишь раз, это приводит к большему количеству клиент-серверных обменов данными, нежели при выполнении простого запроса. Именно по этой причине в примере выше выражение SELECT выполнялось, как обычный запрос.
Также, имеет смысл рассмотреть SQL синтаксис вставки множества значений в выражении INSERT. В примере выше мультивставка (значения для вставки перечисляются через запятую) в предложении INSERT обошлась бы дешевле, чем подготовленный запрос.
http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php Пример №3