Использовать PHP MySQLi подготовленные заявления без ссылок? - PullRequest
0 голосов
/ 03 апреля 2019

Есть ли способ использовать подготовленные MySQLi операторы без передачи ссылок?

[Справочная информация: я чрезвычайно новичок в PHP и MySQL, но я унаследовал частный плагин WordPress для поддержки и поэтому я учусьи то и другое.]

Я понимаю, что подготовленные операторы полезны для предотвращения SQL-инъекций и, возможно, также для ускорения запросов (если операторы сохраняются), но для необходимости использования ссылочных переменныхкажется страннымЯвляется ли идея, что каждый вызывает bind_param заранее, а затем при выполнении последующих запросов просто устанавливает данные в эти связанные переменные, а не взаимодействует с оператором вообще?

Прямо сейчас код IРефакторинг имеет 17 переменных, которые он передает в bind_param.Я создал класс, который будет содержать все данные, поэтому мне больше не нужно передавать 17 переменных из функции в функцию, но приведенное ниже, очевидно, дает сбой, поскольку мой класс не возвращает ссылки:

$stmt->bind_param('ssssssisssssssssi',
      $my_class->get(FIELD_ONE),
      $my_class->get(FIELD_TWO),
      /*...x15 more...*/)

Учитывая, чтокод в настоящее время отбрасывает $stmt сразу после $stmt->execute() (поэтому долгосрочные переменные не отслеживаются), есть ли способ использовать подготовленные операторы, не беспокоясь о создании временных переменных, просто чтобы я мог связать их?Есть ли альтернативный класс / интерфейс, который я мог бы или должен использовать?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Да, есть.

Некоторое время назад в PHP была добавлена ​​бесценная функция - оператор распаковки аргументов . У него миллиард использований, и помощь вам в этой ситуации входит в их число.

Просто добавьте ...[ перед списком значений и ] после - и вуаля, все работает!

$stmt->bind_param('ssssssisssssssssi', ...[
  $my_class->get(FIELD_ONE),
  $my_class->get(FIELD_TWO),
  /*...x15 more...*/
  ]);

Подсказка: этот полезный оператор может также использоваться для инкапсуляции этого скучного процесса подготовки / связывания / выполнения в простую функцию .

1 голос
/ 03 апреля 2019

Является ли идея, что сначала вызывается bind_param, а затем при выполнении последующих запросов просто устанавливает данные в эти связанные переменные, а не взаимодействует с оператором вообще?

Да.Типичная операция подготовленного оператора со связанными переменными будет:

prepare statement;
bind params;
for (some loop) {
    assign values to params;
    execute statement;
}

В MySQLi у вас есть только опция bind_param, поэтому ограниченыПроходящие ссылки.Если вы не возражаете против изменения интерфейсов, вы можете переключиться на PDO, которая имеет функцию bindValue, которая будет работать со значениями, а не со ссылками.PDO также позволит вам избежать вызова для привязки параметров / значений в целом, просто передав массив значений в оператор execute call.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...