fetch() не возвращает первую строку

Я пытаюсь обновить код, написанный с использованием подготовленных операторов. Я использую их впервые, и мне трудно получить все результаты. Когда я использую прямой оператор SQL, он работает, поэтому я не думаю, что это проблема.

Код не вернет никаких результатов, пока не будет хотя бы двух, соответствующих запросу, тогда он вернет все, кроме первой строки. Я пытался использовать fetchAll, но это дает другую ошибку о вызове неопределенного метода.

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

function html_competitive_make_gallery ($init) {
global $USER;
    $user_id     = $USER->id;
    $page_name = 'competitive';
    $base_name = $init['base_name'];

    global $link;
     $sql_pre = "SELECT form_id, community_id FROM frm_root WHERE user_id = ? 
AND page_name = ? ORDER BY last_modified_date DESC LIMIT 1";
     $stmt = $link->prepare($sql_pre);
     $stmt->bind_param('is', $user_id, $page_name);
     $stmt->execute();
     $stmt->bind_result($form_id,$community_id);
     $stmt->fetch();
     $stmt->close();
$sql = "SELECT data FROM tester WHERE type= '".$base_name."' 
AND form_id= '".$form_id ."' AND community_id= '". $community_id ."' LIMIT 5";
$stmt = $link->prepare($sql);
$stmt->execute();
$stmt->bind_result($data);
$stmt->fetch();

$html[]='<div class="gallery" style ="width:100%;height:30%;overflow:hidden;">';


while ($stmt->fetch()){

                   echo $data;

                }
$stmt->close();

$html[]='</div>';

return implode ( $html);
}

person Community    schedule 25.02.2013    source источник
comment
Удалить вызов $stmt->fetch() после bind_result   -  person hank    schedule 25.02.2013
comment
@hank, это исправило.   -  person    schedule 25.02.2013
comment
Ваш код крайне противоречив. Он содержит заглушки и фрагменты из другого кода. Можешь почистить? из этого невозможно написать рабочую версию.   -  person Your Common Sense    schedule 25.02.2013
comment
@Alvaro, спасибо за отзыв   -  person    schedule 25.02.2013
comment
@IamDominic - пожалуйста, проигнорируйте мой комментарий (который я уже удалил). Я думал о другом.   -  person Álvaro González    schedule 25.02.2013
comment
@ Здравый смысл, я пытаюсь. Я унаследовал этот код на работе, которую только что начал. Весь сценарий написан так, это кошмар.   -  person    schedule 25.02.2013


Ответы (3)


Вы запускаете fetch() перед входом в цикл, поэтому первая строка результатов удаляется:

$stmt->execute();
$stmt->bind_result($data);
$stmt->fetch();                    // <<< THIS LINE SHOULD NOT BE HERE

$html[]='<div class="gallery" style ="width:100%;height:30%;overflow:hidden;">';

while ($stmt->fetch()){
       echo $data;
}
$stmt->close();
person Nils Werner    schedule 25.02.2013

Попробуй это:

while ($data = $stmt->fetch()){

               echo $data;

            }
$stmt->close();
person Tschallacka    schedule 25.02.2013
comment
Это возвращает число 1. Похоже, что в массиве есть оба результата теста, но возвращается только второй. - person ; 25.02.2013
comment
Обратите внимание, что fetch() возвращает логическое значение. Из описания в руководстве: «Выбрать результаты из подготовленного оператора в связанные переменные» - person Álvaro González; 25.02.2013

Ваша основная проблема называется "mysqli".
Вы будете сталкиваться с такими проблемами до тех пор, пока используете mysqli с подготовленными операторами.

Просто выйдите из него и используйте PDO:

function html_competitive_make_gallery ($init) {
    global $USER;
    global $link;

    $sql_pre = "SELECT form_id, community_id FROM frm_root WHERE user_id = ? 
                AND page_name = ? ORDER BY last_modified_date DESC LIMIT 1";
    $stmt = $link->prepare($sql_pre);
    $stmt->execute(array($USER->id, 'competitive'));
    return $stmt->fetch();
}
person Your Common Sense    schedule 25.02.2013
comment
Мне самому очень не нравится API mysqli, но его функции подготовленных операторов не нарушены, как предполагает ваш ответ. - person Álvaro González; 25.02.2013