Смешивание функций доступа к данным mysqli в PHP?

StackOverflow https://stackoverflow.com/questions/627197

  •  06-07-2019
  •  | 
  •  

Вопрос

За последние несколько дней я видел пару вопросов, которые использовали mysqli но там, где ответы, по-видимому, не распознали разницы между $stmt->execute() и $db->query().

Насколько я понимаю, существуют две разные модели доступа к результатам в mysqli.

Этот использует необработанный SQL и требует, чтобы программист экранировал входные данные для предотвращения атак SQL-инъекций, но позволяет программисту извлекать ассоциативный массив (или обычный массив), содержащий column => value сопоставления:

$result_set = $db->query("SAFE SQL QUERY HERE");
while ($row = $result_set->fetch_assoc()) {
     # do something with $row['fieldname'];
}  

В качестве альтернативы, вы можете сделать это, что позволяет хорошо привязывать параметры и результаты, но не может (AFAIK) дать вам какой-либо простой результат массива:

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
$stmt->bind_param("s", $input_variable);
$stmt->execute();
$stmt->bind_results($output_col1, $output_col2);
while ($stmt->fetch()) {
     # do something with $output_col1 and $output_col2
}

Мой вопрос в том, есть ли какой-нибудь способ с mysqli чтобы получить простой вывод массива, показанный в первом шаблоне, но при этом все еще используя безопасно привязанные входные параметры в соответствии со вторым шаблоном?

Я все равно не могу найти, как это сделать (кроме использования PDO вместо этого!).

Это было полезно?

Решение

В комментариях на этой странице руководства по php есть несколько реализаций функции, которая делает подобные вещи: mysqli_stmt :: fetch

Другие советы

Алнитак,

AFAIK, вы не можете автоматически привязать весь массив к полученным результатам.К сожалению.Однако, если вы ищете поведение массива вне его (предположительно, чтобы было проще передавать результаты), вы могли бы попробовать это:

<?php
 $dbh = new mysqli( ... );
 $arr = array();
 if( $stmt = $dbh->prepare( 'SELECT id, email FROM email_list' );
 {
  $stmt->execute();
  $stmt->bind_result( $arr['id'], $arr['email'] );

  while( $stmt->fetch() )
   DoSomething( $arr );
 }
?>

Это даст вам поведение, о котором вы просили выше.Однако это не будет динамически привязывать поля массива к ассоциативным индексам в массиве - то есть вы должны указать, что id должен быть привязан к $arr['id'] и т.д.

Если динамическая привязка к ассоциативным индексам действительно требуется вашим сценарием, вы всегда можете написать простой класс, который сначала проанализирует запрос для выбранных полей, затем настроит индексы ассоциативного массива, а затем выполнит запрос.

Я бы сказал нет. Несмотря на то, что я не работал с mysqli или готовил заявления на тонну, я считаю, что каждый шаг в вашем втором примере является дискретным и необходимым. Единственное утешение, которое я могу вам дать, это то, что в вашем первом примере скрыт некоторый выход SQL, который вы можете безопасно и по-настоящему игнорировать во втором примере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top