2009-03-09 2 views
0

Я видел пару вопросов за последние несколько дней, которые использовали mysqli, но где ответы, похоже, не распознали разницу между $stmt->execute() и $db->query().Смешивание функций доступа к данным MySQL mysqli?

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

+0

Олафур - Я откатить ваши изменения правописания. «признанный» - это стандартное английское правописание. – Alnitak

ответ

1

Есть множество реализаций функции, чтобы сделать такого рода вещи в комментариях на этой странице инструкции PHP: mysqli_stmt::fetch

0

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

1

Альнитак,

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); 
} 
?> 

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

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

+0

интересен, но не позволяет (AIUI) разрешать $ results [] = $ arr, что является общим шаблоном для получения двумерного массива результатов, поскольку он использует каждый раз вокруг цикла один и тот же $ arr. Я думаю, вам придется взять глубокую копию $ arr, прежде чем добавить ее в $ results [] – Alnitak

+0

Прост достаточно, чтобы проверить, и вы правы! Если вы хотите создать многомерный массив, вам нужно будет выполнить глубокую копию связанного массива. В цикле while вы можете сделать что-то вроде $ multi [] ['id'] = $ arr ['id']; (для каждого индексного индекса в $ arr). Это даст вам то, что вам нужно. –

Смежные вопросы