2015-07-20 148 views
0

我有以下幾點是失敗的一份聲明的準備......準備準備好的聲明中失敗的一部分 - 直接在另一個準備好的聲明

$stmt2 = $con->prepare("SELECT * FROM forum_posts WHERE `category_id`=? AND `topic_id`=?"); 
    //var_dump($stmt2); 
    if (!$stmt2 || !empty($con->error)) { 
     die('Select forum posts prepare() failed: ' . htmlspecialchars($con->error)); 
    } 

我有我的第一個準備好的聲明幾乎完全一樣的準備和它經歷得很好。我不知道,如果我有兩個準備好的聲明,如果這導致問題或情況可能是正確的事實?

現在我得到這個錯誤...

- 選擇論壇帖子準備()失敗: -

這使得自上面的代碼準備失敗的錯誤。

有沒有人看到任何會導致此失敗?

$con = mysqli_connect("localhost", "root", "", "db"); 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
$cid = $_GET['cid']; 
$tid = $_GET['tid']; 
$userid = (isset($_SESSION['user']) ? $_SESSION['user'] : ""); 

//Prepared SELECT stmt to get forum topics 
$stmt = $con->prepare("SELECT * FROM forum_topics WHERE `category_id`=? AND id=? LIMIT 1"); 
if (!$stmt || $con->error) { 
    die('Select topics prepare() failed: ' . htmlspecialchars($con->error)); 
} 
if(!$stmt->bind_param('ii', $cid, $tid)) { 
    die('Select topics bind_param() failed: ' . htmlspecialchars($stmt->error)); 
} 
if(!$stmt->execute()) { 
    die('Select topics execute() failed: ' . htmlspecialchars($stmt->error)); 
} 
$stmt->store_result(); 
$numrows = $stmt->num_rows; 
if($numrows == 1){ 
    echo "<table width='100%'>"; 
    if ($_SESSION['user']) { 
     echo "<tr><td colspan='2'><input type='submit' value='Add Reply' onClick=\"window.location = 
    'forum_post_reply.php?cid=".$cid."$tid=".$tid."'\"> <hr />"; 
    } else { 
     echo "<tr><td colspan='2'><p>Please log in to add your reply</p><hr /></td></tr>"; 
    } 
    foreach($stmt as $row) { 

     //Prepared SELECT stmt to get forum posts 
     $stmt2 = $con->prepare("SELECT * FROM forum_posts WHERE `category_id`=? AND `topic_id`=?"); 
     //var_dump($stmt2); 
     if (!$stmt2 || !empty($con->error)) { 
      die('Select forum posts prepare() failed: ' . htmlspecialchars($con->error)); 
     } 
     //var_dump($con->error); 
     if(!$stmt2->bind_param('ii', $cid, $tid)) { 
      die('Select forum posts bind_param() failed: ' . htmlspecialchars($stmt2->error)); 
     } 
     if(!$stmt2->execute()) { 
      die('Select forum posts execute() failed: ' . htmlspecialchars($stmt2->error)); 
     } 
     //while($row2 = mysqli_fetch_assoc($stmt2)){ 
     foreach($stmt2 as $row2) { 
      echo "<tr><td valign='top' style='border: 1px solid #000000;'> 
      <div style='min-height: 125px;'>".$row['topic_title']."<br /> 
      by ".$row2['post_creator']." - " .$row2['post_date']. "<hr />" . $row2['post_content'] ."</div></td> 
      <td width='200' valign='top' align='center' style='border: 1px solid #000000;'>User Info Here!</td></tr> 
      <tr><td colspan='2'><hr /></td></tr>"; 
     } 
    } 
} else { 
    echo "<p>This topic does not exist.</p>"; 
} 

更新 - 可能的INNER JOIN,像這樣?

//Prepared SELECT stmt to get forum topics 
$stmt = $con->prepare("SELECT * FROM forum_topics AS f INNER JOIN forum_posts AS p ON 
f.category_id=p.category_id ON f.id=p.topic_id WHERE s.category_id=? AND s.id=? LIMIT 1"); 
if (!$stmt || $con->error) { 
    die('Select topics prepare() failed: ' . htmlspecialchars($con->error)); 
} 
if(!$stmt->bind_param('ii', $cid, $tid)) { 
    die('Select topics bind_param() failed: ' . htmlspecialchars($stmt->error)); 
} 
if(!$stmt->execute()) { 
    die('Select topics execute() failed: ' . htmlspecialchars($stmt->error)); 
} 
$stmt->store_result(); 
$numrows = $stmt->num_rows; 
if($numrows == 1){ 
    echo "<table width='100%'>"; 
    if ($_SESSION['user']) { 
     echo "<tr><td colspan='2'><input type='submit' value='Add Reply' onClick=\"window.location = 
    'forum_post_reply.php?cid=".$cid."$tid=".$tid."'\"> <hr />"; 
    } else { 
     echo "<tr><td colspan='2'><p>Please log in to add your reply</p><hr /></td></tr>"; 
    } 
    foreach($stmt as $row) { 
      echo "<tr><td valign='top' style='border: 1px solid #000000;'> 
      <div style='min-height: 125px;'>".$row['topic_title']."<br /> 
      by ".$row2['post_creator']." - " .$row2['post_date']. "<hr />" . $row2['post_content'] ."</div></td> 
      <td width='200' valign='top' align='center' style='border: 1px solid #000000;'>User Info Here!</td></tr> 
      <tr><td colspan='2'><hr /></td></tr>"; 
     } 
    } 
} else { 
    echo "<p>This topic does not exist.</p>"; 
} 

}*/ 
/*$stmt = $con->prepare("SELECT topic_title, post_content FROM forum_topics, forum_posts 
WHERE forum_topics.category_id=forum_posts.category_id 
AND forum_topics.category_id=?");*/ 
//$stmt = $con->prepare("SELECT topic_title, topic_creator FROM forum_posts AS f LEFT JOIN forum_topics AS p ON f.category_id=p.category_id WHERE f.category_id=?"); 
$stmt = $con->prepare("SELECT topic_title, topic_creator FROM forum_posts AS p, forum_topics AS f WHERE f.category_id=? AND p.topic_id=? LIMIT 1"); 
if (!$stmt || $con->error) { 
die('Select forum prepare() failed: ' . htmlspecialchars($con->error)); 
} 
if(!$stmt->bind_param('ii', $cid, $tid)) { 
die('Select forum bind_param() failed: ' . htmlspecialchars($stmt->error)); 
} 
if(!$stmt->execute()) { 
die('Select forum execute() failed: ' . htmlspecialchars($stmt->error)); 
} 
mysqli_stmt_bind_result($stmt, $post_content, $topic_title); 
$stmt->store_result(); 
echo $stmt->store_result(); 
$numrows = $stmt->num_rows; 
if($stmt->num_rows > 0){ 
echo "<table width='100%'>"; 
if ($_SESSION['user']) { 
    echo "<tr><td colspan='2'><input type='submit' value='Add Reply' onClick=\"window.location = 
'forum_post_reply.php?cid=".$cid."$tid=".$tid."'\"> <hr />"; 
} else { 
    echo "<tr><td colspan='2'><p>Please log in to add your reply</p><hr /></td></tr>"; 
} 
while (mysqli_stmt_fetch($stmt)) { 
echo "<tr><td valign='top' style='border: 1px solid #000000;'> 
<div style='min-height: 125px;'>".$topic_title."<br /> 
by " . $post_content ."</div></td> 
<td width='200' valign='top' align='center' style='border: 1px solid #000000;'>User Info Here!</td></tr> 
<tr><td colspan='2'><hr /></td></tr>"; 
} 
mysqli_stmt_close($stmt); 
} else { 
echo "<p>This topic does not exist.</p>"; 
} 

?> 
    </body> 
</html> 
+0

評論是不適合擴展討論;這個談話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/83776/discussion-on-question-by-paul-prepare-part-of-prepared-statement-failing-dire)。 –

回答

2

花5小時在聊天OP後,終於解決了問題

問題;

  • 第二查詢失敗
  • 與1查詢結果沒有顯示

沒有需要;

  • 沒有必要加入表
  • 無需第二個選擇查詢的
  • 沒有的foreach

解決方案;

//bind the result 
mysqli_stmt_bind_result($stmt, $topic_title, $topic_creator, $postDate, $postcontent); 
//use while loop instead foreach 
while (mysqli_stmt_fetch($stmt)) 

工作代碼;

//Prepared SELECT stmt to get forum topics 
$stmt = $con->prepare("SELECT topic_title, topic_creator, post_date, post_content FROM forum_posts AS p, forum_topics AS f WHERE f.category_id=? AND p.topic_id=?"); 
if (!$stmt || $con->error) { 
    die('Select forum prepare() failed: ' . htmlspecialchars($con->error)); 
} 
if(!$stmt->bind_param('ii', $cid, $tid)) { 
    die('Select forum bind_param() failed: ' . htmlspecialchars($stmt->error)); 
} 
if(!$stmt->execute()) { 
    die('Select forum execute() failed: ' . htmlspecialchars($stmt->error)); 
} 
mysqli_stmt_bind_result($stmt, $topic_title, $topic_creator, $postDate, $postcontent); 
$stmt->store_result(); 
if($stmt->num_rows > 0){ 

    echo "<table width='100%'>"; 
    if ($_SESSION['user']) { 
     echo "<tr><td colspan='2'><input type='submit' value='Add Reply' onClick=\"window.location = 
    'forum_post_reply.php?cid=".$cid."$tid=".$tid."'\"> <hr />"; 
    } else { 
     echo "<tr><td colspan='2'><p>Please log in to add your reply</p><hr /></td></tr>"; 
    } 
    while (mysqli_stmt_fetch($stmt)) { 
     echo "<tr><td valign='top' style='border: 1px solid #000000;'> 
     <div style='min-height: 125px;'>".$topic_title."<br /> 
     by ".$topic_creator." - " .$postDate. "<hr />" . $postcontent ."</div></td> 
     <td width='200' valign='top' align='center' style='border: 1px solid #000000;'>User Info Here!</td></tr> 
     <tr><td colspan='2'><hr /></td></tr>"; 
     } 
     mysqli_stmt_close($stmt); 
} else { 
    echo "<p>This topic does not exist.</p>"; 
} 

忘記提及,這是我第一次與mysqli,我讀過它,但從來沒有嘗試過。

+0

我回到家後,真的看着它,它仍然是不正確的。它沒有得到正確的職位。它只顯示循環中的第一篇文章。我加回了'LIMIT'。 \ – Paul

+0

不知道我希望如此。我只是將我的代碼添加到底部的原始問題中。這非常混亂,但我評論了我沒有使用的東西。 – Paul

+0

是的,它看起來像,但我很擔心得到的東西輸出我沒有把兩個和兩個在一起。如果我點擊主題,我會獲得所有帖子,而不僅僅是與該主題相關的帖子。 – Paul