为了账号安全,请及时绑定邮箱和手机立即绑定

这段代码冻结了我的电脑

这段代码冻结了我的电脑

PHP
森栏 2022-01-02 20:13:32
这部分代码应该输出提供给该问题的所有答案的数据。这段代码在运行时会冻结。我试过在没有成功的情况下改变功能。$sql2 = "SELECT answer.a_id, answer.u_id, answer.answer, answer.a_datetime, user.user_id, user.username FROM answer LEFT JOIN user ON answer.u_id = user.user_id WHERE q_id='$pid'";$result2 = mysqli_query($db, $sql2);$rows = mysqli_fetch_assoc($result2);while($rows) {        echo '<table border=2>';        echo '<tr>';                echo '<td>Answered by: '.$rows['username'].'</td>';                echo '</tr>';            echo '<tr>';                echo '<td>'.$rows['answer'].'</td>';            echo '</tr>';            echo '<tr>';                echo '<td>'.$rows['a_datetime'].'</td>';            echo '</tr>';        echo '</table>';    }
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

在你的循环中...


while($rows) {

因为您不会更改循环中的值 - 它始终是它开始的值,因此永远不会终止,认为您想使用...


$result2 = mysqli_query($db, $sql2);

while($rows = mysqli_fetch_assoc($result2)) {

这将依次获取每一行并在移动到下一行之前显示输出。


您可能还想将表定义移到循环之外,除非您希望每一行都在它自己的表中。


查看完整回答
反对 回复 2022-01-02
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

Nigel 确实提供了解决方案,但让我们讨论其他明显的问题。我已经重新编写了您的代码,进行了两个主要更改,您可能仍然需要进行一些调整,因为我不熟悉您的 db 或其他命名变量。


1 - 准备好的声明

它如何帮助以及有什么作用与其一百次重新回答这个问题,其他人在解释它方面做得更好:


准备好的语句如何防止 SQL 注入攻击?


辅助函数- 在您更好地了解准备好的语句的工作原理后,您将需要此功能。


https://phpdelusions.net/mysqli/simple


2 - 面向对象

我用面向对象的语法重写了这个。我发现它不那么冗长,而且通常更容易理解。你用语法改变你赢得了什么做准备好的语句,因为它们通常涉及更多的步骤(但为了更大的好处)


$sql2 = "SELECT a_id, u_id, answer, a_datetime, user_id, username FROM answer LEFT JOIN user ON answer.u_id = user.user_id WHERE q_id = ?";

$stmt -> $con -> prepare($sql2);

$stmt -> bind_param("s", $pid);

$stmt -> execute();

$stmt -> store_result();

$stmt -> bind_result($aid, $uid, $answer, $date, $userid, $username);


echo '<table border=2>';


while($stmt -> fetch()) {

      echo '<tr>';

        echo '<td>Answered by: '. $username .'</td>';

      echo '</tr>';

      echo '<tr>';

        echo '<td>'. $answer .'</td>';

      echo '</tr>';

      echo '<tr>';

        echo '<td>'. $date .'</td>';

      echo '</tr>';

    }


 echo '</table>';


$stmt -> free_result();

$stmt -> close();

$con -> close();



在我们挑选头发时,您应该尽量不要回显过多的 HTML。您可以在while循环内关闭 php ,它的工作方式相同。我还修复了您遇到的一些 HTML 问题。(应该使用<tbody>,只是为了好玩,我<thead>也在那里扔了一个


// after bind result in the code above

?>

<table>

  <thead>

    <th>Answered by</th>

    <th>Answer</th>

    <th>Date</th>

  </thead>

  <tbody>

    <?php

    while($stmt -> fetch()) {

    ?>

    <tr>

      <td><?php echo $username;?></td>

    </tr>

    <tr>

      <td><?php echo $answer;?></td>

    </tr>

    <tr>

      <td><?php echo $date;?></td>

    </tr>

    <?php

    }

    ?>

  </tbody>

</table>


查看完整回答
反对 回复 2022-01-02
  • 2 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信