Очередной костыль экранирования mysqli запросов - Комментарии

RSS
А

Оранжевые штаны
Сначала подготавливаем запрос
Затем привязываем параметры

К примеру:
<?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 и поправить семантику на подходящую.

Пацак
Башка (Сегодня / 22:22)
Экономия через кэширование гораздо более эффективный способ повышения производительности, чем подобные рекомендации ;)

Писать не многим больше, достаточно обернуть стандартный класс mysqli и поправить семантику на подходящую.
например? через foreach? тут не в экономии дело. много кто не любит подготовленные запросы (взять тот же пдо клас в роторе) а $db->query('sql', ['params']) как то лаконичние вашего выше
А

Оранжевые штаны
например? через 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;
  }

Пацак
Башка, довольно сомнительный кэш