Очередной костыль экранирования mysqli запросов - Комментарии
Сначала подготавливаем запрос
Затем привязываем параметры
К примеру:
Затем привязываем параметры
К примеру:
<?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); $select = $mysqli->prepare("SELECT * FROM users WHERE login=?"); $select->bind_param("s", 'admin'); $result = $select->fetch();
Башка,
да и влом столько писать
Каждый подготавливаемый запрос использует ресурсы сервера. Если запрос больше не нужен, его необходимо сразу закрыть. Если не сделать этого явно, запрос закроется сам, но только когда PHP освободит его дескриптор, как правило это происходит при выходе запроса из области видимости или при завершении работы скрипта.
Использование подготавливаемых запросов не всегда приводит к повышению эффективности. Если параметризованный запрос запускается лишь раз, это приводит к большему количеству клиент-серверных обменов данными, нежели при выполнении простого запроса. Именно по этой причине в примере выше выражение SELECT выполнялось, как обычный запрос.
Также, имеет смысл рассмотреть SQL синтаксис вставки множества значений в выражении INSERT. В примере выше мультивставка (значения для вставки перечисляются через запятую) в предложении INSERT обошлась бы дешевле, чем подготовленный запрос.
да и влом столько писать
Экономия через кэширование гораздо более эффективный способ повышения производительности, чем подобные рекомендации ;)
Писать не многим больше, достаточно обернуть стандартный класс mysqli и поправить семантику на подходящую.
Писать не многим больше, достаточно обернуть стандартный класс mysqli и поправить семантику на подходящую.
Башка (Сегодня / 22:22)например? через foreach? тут не в экономии дело. много кто не любит подготовленные запросы (взять тот же пдо клас в роторе) а $db->query('sql', ['params']) как то лаконичние вашего выше
Экономия через кэширование гораздо более эффективный способ повышения производительности, чем подобные рекомендации ;)
Писать не многим больше, достаточно обернуть стандартный класс mysqli и поправить семантику на подходящую.
например? через foreach?Через Redis
много кто не любит подготовленные запросы (взять тот же пдо клас в роторе)ротор было дело и БД не любил
как то лаконичние
<?php class MyMysqli extends mysqli{ public function myQuery($query, $params){ $stmt = $this->prepare($query); $p = array_values($params); array_unshift($p, array_keys($params)); call_user_func_array([$stmt, 'bind_param'], $p); return $stmt->execute(); } } $mysql = new MyMysqli("localhost", "my_user", "my_password", "world"); $mysql->myQuery('SELECT * FROM users WHERE login = ?', ['s' => 'admin']);
Башка (Сегодня / 22:42)я не про кэширование а про
Через Redis
ротор было дело и БД не любил
Писать не многим больше, достаточно обернуть стандартный класс mysqli и поправить семантику на подходящую.
Башка (Сегодня / 22:43)
<?php class MyMysqli extends mysqli{ public function myQuery($query, $params){ $stmt = $this->prepare($query); $p = array_values($params); array_unshift($p, array_keys($params)); call_user_func_array([$stmt, 'bind_param'], $p); $result = $stmt->execute(); $stmt->close(); return $result; } } $mysql = new MyMysqli("localhost", "my_user", "my_password", "world"); $mysql->myQuery('SELECT * FROM users WHERE login = ?', ['s' => 'admin']);А то забудут закрыть
Ну тут спорно. Лучше сделать некий кеш, в который будут добавляться stmt как то так:
<?php public function myQuery($query, $params, $isClean = true){ if(!isset($this->statements[$query])){ $this->statements[$query] = $this->prepare($query); } $stmt = $this->statements[$query]; $p = array_values($params); array_unshift($p, array_keys($params)); call_user_func_array([$stmt, 'bind_param'], $p); $result = $stmt->execute(); if($isClean){ $stmt->close(); unset($this->statments[$query]); } return $result; }
Для выполнения действия необходимо авторизоваться!