2012-01-24 14 views
2

私はwhile($stmt->fetch())を使用していますが、結果はMySQLクエリから得られますが、特定の条件では1つの結果しか得られません。
私はこれが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 /> 
      <? 
     } 
    } 

これはエコーの1つのIDだけです。私はこれを問題にしていると推測しています。なぜなら、私が次のものを使うと、すべてのIDがエコーされるからです。

$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をオンラインで開始すると、<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

別のステートメント変数が必要です。 2番目の使用法(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が2番目のステートメントに対して実行されます。

+0

合意。 $ stmtの内容を書き換える前にループを1回だけ実行します。 – Kevin

+0

それはそれのようなものかもしれないと思った。これは1ページで動作しますが、特定のページで 'invalid object or resource mysqli_stmt'を取得し続けます。私はいくつかのコードとエラーラインを編集します。 –

+0

新しい '$ db'(' $ db2'と呼ばれます)も必要です。助けてくれてありがとう! –

1

このようなネストされたクエリを実行している場合は、同じ変数名($stmt)を使用しないでください。内部ステートメントには何か異なる名前を付けます。

関連する問題