2012-01-24 1 views
2

Я использую while($stmt->fetch()), чтобы зацикливать результаты, полученные из MySQL Query, и при определенных условиях я получаю только один результат.
Я предполагаю, что это потому, что у меня есть 2 $stmt. но я подумал, что такая поддержка была поддержана. Наверное, я делаю ошибку новобранец, я слишком долго привык к незаготовленным заявлениям!

$db = mysqlConnect(); 
    $stmt = $db->stmt_init(); 
    $stmt->prepare("SELECT id, uploadtype FROM uploads ORDER BY displayorder DESC"); 
    $stmt->execute(); 
    $stmt->bind_result($id, $uploadtype); 
    while ($stmt->fetch()) { 
     echo 'ID = ' . $id . '<br />'; 
     if ($uploadtype == 'single') { 
      $stmt->prepare("SELECT title, description FROM singles WHERE id = ?"); 
      $stmt->bind_param('i', $id); 
      $stmt->execute(); 
      $stmt->bind_result($title, $description); 
      $stmt->fetch(); 
      ?> 
      Title: <? echo $title; ?><br /> 
      Description: <? echo $description; ?><br /> 
      <a href="edit.php?id=<? echo $id; ?>">Edit</a><br /> 
      <? 
     } 
    } 

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

$db = mysqlConnect(); 
$stmt = $db->stmt_init(); 
$stmt->prepare("SELECT id, uploadtype FROM uploads ORDER BY displayorder DESC"); 
$stmt->execute(); 
$stmt->bind_result($id, $uploadtype); 
while ($stmt->fetch()) { 
    echo 'ID = ' . $id . '<br />'; 
} 

Как я могу обойти эту проблему? Я думаю, что я не понимаю готовых заявлений совершенно правильно.
EDIT:
Теперь это изменено, но получение invalid object or resource mysqli_stmt on line start <error>.

$db = mysqlConnect(); 
    $stmt = $db->stmt_init(); 
    if (!$limit) { 
     $stmt->prepare("SELECT id FROM uploads WHERE uploadtype = 'youtube' ORDER BY displayorder DESC"); 
    } else { 
     $stmt->prepare("SELECT id FROM uploads WHERE uploadtype = 'youtube' ORDER BY displayorder DESC LIMIT 0, ?"); 
     $stmt->bind_param('i', $limit); 
    } 
    $stmt->execute(); 
    $stmt->bind_result($id); 
    while ($stmt->fetch()) { 
     $stmt2 = $db->stmt_init(); 
     $stmt2->prepare("SELECT title, description, url FROM youtube WHERE id = ?"); 
     <error>$stmt2->bind_param('i', $id); 
     <error>$stmt2->execute(); 
     <error>$stmt2->bind_result($title, $description, $url); 
     <error>while ($stmt2->fetch()) { 
      $title = stripslashes($title); 
      $description = stripslashes($description); 
      $url = stripslashes($url); 
      ?> 
      <class id="item"> 
       <? 
       if ($gettitle) echo 'Title: ' . $title . '<br/>'; 
       if ($getdescription) echo 'Description: ' . $description . '<br />'; 
       ?> 
       <iframe width="560" height="315" src="<? echo $url; ?>" frameborder="0" allowfullscreen></iframe> 
      </class><br /> 
      <? 
     } 
    } 

ответ

3

Вам нужна другая переменная оператора. Замените второе использование (SELECT title...) отдельной переменной (например, $stmt2 из-за отсутствия лучшего имени).

if ($uploadtype == 'single') { 
     $stmt2 = $db->stmt_init(); 
     $stmt2->prepare("SELECT title, description FROM singles WHERE id = ?"); 
     $stmt2->bind_param('i', $id); 
     ... 

В противном случае во внешнем контуре следующего fetch запускается против второго заявления.

+0

Согласовано. Ваш единственный цикл цикла один раз перед переписыванием содержимого $ stmt. – Kevin

+0

Думал, что это может быть что-то вроде этого. Он работает на одной странице, но я продолжаю получать недопустимый объект или ресурс mysqli_stmt' на определенных страницах. Я отредактирую его, появится еще один код и строки ошибок. –

+0

Также нужен новый '$ db' (называемый' $ db2'). Спасибо за помощь! –

1

Не используйте то же имя переменной ($stmt), если вы выполняете вложенные запросы, подобные этому. Назовите внутреннее утверждение чем-то другим.

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