Смешивать PHP функции доступа к данным mysqli? - PullRequest
0 голосов
/ 09 марта 2009

За последние несколько дней я видел пару вопросов, в которых использовался 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 вместо этого!).

Ответы [ 3 ]

1 голос
/ 09 марта 2009

Альнитак,

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'] и т. Д.

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

1 голос
/ 09 марта 2009

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

0 голосов
/ 09 марта 2009

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

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