Смешивание функций доступа к данным mysqli в PHP?
Вопрос
За последние несколько дней я видел пару вопросов, которые использовали 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, который вы можете безопасно и по-настоящему игнорировать во втором примере. Р>