операторы подготовки цикла, что нужно повторить?

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

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

Что-то не так с этим сводным кодом?

открытое соединение с базой данных

// connect to database   
$conn = connect('r');

запустить первый запрос

$sql = "SELECT ... FROM ... WHERE xxx = ?";

$stmt = $conn->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('i', $albumid);
$stmt->bind_result(..., ...);
$stmt->execute();
$stmt->store_result();
$num_rows = $stmt->num_rows;

if ($num_rows  > 0) {
   loop results...
}

$stmt->free_result();

второй запрос с повторами:

$sql = "SELECT ... FROM ... WHERE xxx = ?";

$stmt = $conn->stmt_init();
$stmt->prepare($sql); ///??????? inside or outside foreach loop ?????

foreach (... as $key => ...) {
    $stmt->bind_param('i', $key);
    $stmt->bind_result(...);
    $stmt->execute();
    $stmt->store_result();
    $num_rows = $stmt->num_rows;

    if ($num_rows  > 0) {
       loop results...
    }

   $stmt->free_result();
}

закрыть базу данных

// close database
$conn->close();

person Marco    schedule 11.09.2012    source источник
comment
prepare и bind_ * могут и должны быть вне цикла.   -  person knittl    schedule 12.09.2012
comment
хорошо спасибо. Я предполагаю, что '$ stmt = $ conn- ›stmt_init ();' не нужно звонить дважды, правда? мне не нужно инициализировать оператор дважды?   -  person Marco    schedule 12.09.2012


Ответы (1)


Вам не нужно готовить запрос несколько раз. Просто свяжите параметры и выполните это несколько раз.

Из руководства PHP:

Для запроса, который вам нужно выполнить несколько раз, вы получите лучшую производительность, если подготовите объект PDOStatement с помощью PDO :: prepare () и выполните оператор с несколькими вызовами PDOStatement :: execute ().

Надеюсь это поможет.

person mishmash    schedule 11.09.2012