Php 准备部分准备语句失败-直接在另一个准备语句下

Php 准备部分准备语句失败-直接在另一个准备语句下,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,我准备了一份失败的声明,如下所示 $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: ' . htmlspecialcha

我准备了一份失败的声明,如下所示

$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>";
}
$con=mysqli_connect(“localhost”、“root”、“db”);
if(mysqli\u connect\u errno()){
printf(“连接失败:%s\n”,mysqli_Connect_error());
退出();
}
$cid=$_GET['cid'];
$tid=$_GET['tid'];
$userid=(isset($\u会话['user'])?$\u会话['user']:“”);
//准备好选择stmt以获取论坛主题
$stmt=$con->prepare(“从论坛主题中选择*,其中'category\u id`=?和id=?LIMIT 1');
如果(!$stmt | |$con->error){
die('selecttopics prepare()失败:'.htmlspecialchars($con->error));
}
if(!$stmt->bind_参数('ii',$cid,$tid)){
die('Select topics bind_param()失败:'.htmlspecialchars($stmt->error));
}
如果(!$stmt->execute()){
die('Select topics execute()失败:'.htmlspecialchars($stmt->error));
}
$stmt->store_result();
$numrows=$stmt->num_行;
如果($numrows==1){
回声“;
如果($_会话['user']){
回声“
”; }否则{ echo“请登录添加您的回复”


”; } foreach($stmt作为$row){ //准备选择stmt以获取论坛帖子 $stmt2=$con->prepare(“从论坛帖子中选择*,其中`category\u id`=?和`topic\u id`=?”; //var_dump($stmt2); 如果(!$stmt2 | |!空($con->error)){ die('Select forum posts prepare()失败:'.htmlspecialchars($con->error)); } //变量转储($con->error); if(!$stmt2->bind_参数('ii',$cid,$tid)){ die('Select forum posts bind_param()失败:'.htmlspecialchars($stmt2->error)); } 如果(!$stmt2->execute()){ die('Select forum posts execute()失败:'.htmlspecialchars($stmt2->error)); } //而($row2=mysqli\u fetch\u assoc($stmt2)){ foreach($stmt2作为$row2){ 回声“ “$row['topic_title']。”
通过“$row2['post_creator']”引用-“$row2['post_date']”,
“$row2['post_content']” 用户信息在这里!
; } } }否则{ echo“此主题不存在。

”; }
更新-可能的内部连接,像这样

//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> 
//准备好选择stmt以获取论坛主题
$stmt=$con->prepare(“从论坛主题中选择*作为内部加入论坛帖子作为p
f、 category_id=p.category_id ON f.id=p.topic_id,其中s.category_id=?和s.id=?LIMIT 1”);
如果(!$stmt | |$con->error){
die('selecttopics prepare()失败:'.htmlspecialchars($con->error));
}
if(!$stmt->bind_参数('ii',$cid,$tid)){
die('Select topics bind_param()失败:'.htmlspecialchars($stmt->error));
}
如果(!$stmt->execute()){
die('Select topics execute()失败:'.htmlspecialchars($stmt->error));
}
$stmt->store_result();
$numrows=$stmt->num_行;
如果($numrows==1){
回声“;
如果($_会话['user']){
回声“
”; }否则{ echo“请登录添加您的回复”


”; } foreach($stmt作为$row){ 回声“ “$row['topic_title']。”
通过“$row2['post_creator']”引用-“$row2['post_date']”,
“$row2['post_content']” 用户信息在这里!
; } } }否则{ echo“此主题不存在。

”; } }*/ /*$stmt=$con->prepare(“从论坛主题、论坛帖子中选择主题标题、帖子内容 其中forum\u topics.category\u id=forum\u posts.category\u id 和论坛主题。类别id=?”*/ //$stmt=$con->prepare(“选择主题标题,从论坛帖子中选择主题创建者作为f左加入论坛主题作为f.category\u id=p.category\u id,其中f.category\u id=?”; $stmt=$con->prepare(“从论坛帖子中选择主题标题,主题创建者作为p,论坛主题作为f,其中f.category\u id=?和p.topic\u id=?限制1”); 如果(!$stmt | |$con->error){ die('Select forum prepare()失败:'.htmlspecialchars($con->error)); } 如果(!$stmt->bind_param('ii',$cid,$tid)){ die('Select forum bind_param()失败:'.htmlspecialchars($stmt->error)); } 如果(!$stmt->execute()){ die('Select forum execute()失败:'.htmlspecialchars($stmt->error)); } mysqli_stmt_bind_result($stmt、$post_content、$topic_title); $stmt->store_result(); echo$stmt->store_result(); $numrows=$stmt->num_行; 如果($stmt->num_rows>0){ 回声“; if($\会话['user']){ 回声“
”; }否则{ echo“请登录添加您的回复”


”; } while(mysqli_stmt_fetch($stmt)){ 回声“ “$topic\u title。”
通过“$post_内容” 用户信息在这里!
; } mysqli_stmt_close($stmt); }否则{ echo“此主题不存在。

”; } ?>
在聊天中花5个小时与OP聊天后,最终解决问题

问题

  • 第二次查询失败
  • 第一个查询结果未显示
没有必要

  • 不需要连接表
  • 不需要第二次选择查询
  • 不必费事
解决方案

//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>";
}
//准备好选择stmt以获取论坛主题
$stmt=$con->prepare(“选择主题标题、主题创建者、发布日期、论坛发布的内容作为p、论坛主题作为f,其中f.category\u id=?和p.topic\u id=?”;
如果(!$stmt | |$con->error){
die('Select forum prepare()失败:'.htmlspecialchars($con->error));
}
if(!$stmt->bind_参数('ii',$cid,$tid)){
die('Select forum bind_param()失败:'.htmlspecialchars($stmt->error));
}
如果(!$stmt->execute()){
die('Select forum execute()失败:'.htmlspecialchars($stmt->