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