PHP, подготовленные MySQL операторы - можете ли вы использовать результаты выполнения более одного раза, вызывая data_seek (0)? - PullRequest
0 голосов
/ 20 мая 2010

У меня есть случай, когда я хочу использовать результаты подготовленного оператора более одного раза во вложенном цикле. Внешний цикл обрабатывает результаты другого запроса, а внутренний цикл - результаты подготовленного запроса оператора. Таким образом, код будет выглядеть примерно так (просто «псевдо» для демонстрации концепции):

// not showing the outer query, it is just a basic SELECT, not prepared statement
// we'll call it $outer_query

$obj_array = array();   // going to save objects in this
$ids = array(18,19,20); // just example id numbers

$query = "SELECT field1, field2 FROM table1 WHERE id=?";
$stmt = $db->prepare($query);

foreach ($ids as $id) {
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->bind_result($var1, $var2);
    $stmt->store_result(); // I think I need this for data_seek

    while ($q1 = $outer_query->fetch_object()) {
        while ($stmt->fetch()) {
            if ($q1->field1 == $var1) { // looking for a match
               $obj = new stdClass();
               $obj->var1 = $var1;
               $obj->var2 = $var2;

               $obj_array[] = $obj;
               $stmt->data_seek(0); // reset for outer loop
               break;               // found match, so leave inner                
            }
        }
    }
}

Проблема, с которой я, похоже, сталкиваюсь, заключается в том, что значения не привязываются к переменным, как я ожидаю после первого использования fetch во внутреннем цикле. В частности, в одном примере я использовал 3 идентификатора для foreach, первый идентификатор был обработан правильно, второй обработан неправильно (совпадения не были найдены во внутреннем цикле, даже если они существовали), а затем третий был обработан правильно. 1004 *

Что-то не так с подготовленными вызовами функции статистики в последовательности, которую я делаю выше, или это неверный способ использования результатов подготовленного оператора?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 20 мая 2010

Преобразуйте результат mysql в массив, и затем вы можете использовать функции массива для навигации по массиву. Data_seek не очень элегантный, ИМО.

0 голосов
/ 20 мая 2010

Я нашел, где этот код идет не так. Это не имело никакого отношения к моему использованию подготовленных функций оператора, а только к размещению data_seek. Я слишком рано искал помощи у ТАК:)

Код цикла, который теперь работает именно так, как я хотел, выглядит следующим образом:

while ($q1 = $outer_query->fetch_object()) {
    while ($stmt->fetch()) {
        if ($q1->field1 == $var1) { // looking for a match
            $obj = new stdClass();
            $obj->var1 = $var1;
            $obj->var2 = $var2;
            $obj_array[] = $obj;
            break;               // found match, so leave inner                
        }
    }
    $stmt->data_seek(0); // reset for outer loop
}
// this was always here, forgot it in original post
$outer_query->data_seek(0) // reset for next iteration of foreach

Когда я вызывал data_seek внутри условия для сброса подготовленных результатов оценки, сброс происходил только в том случае, если совпадение было найдено. Это привело к тому, что внешний цикл запустился в определенных ситуациях, а подготовленный оператор не сбрасывал результат. Иногда лес скрыт за деревьями;)

Так что, очевидно, вы можете легко обработать подготовленные результаты оператора несколько раз, используя data_seek, как я и надеялся.

Спасибо.

0 голосов
/ 20 мая 2010

Вам лучше использовать JOIN, чтобы сделать это с одним запросом и без циклов

И вам все равно не нужен data_seek.

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