【问题标题】:PHP is loading the same content endlesslyPHP 无休止地加载相同的内容
【发布时间】:2018-06-06 17:58:45
【问题描述】:

如何防止它再次加载同一个表格行并且永不停止?我的脑袋无法接受......我知道我以某种方式创建了一个无限循环,所以我在互联网上搜索,我看到人们在做几乎相同的事情,但不知何故它对他们有用。

include_once "additional_code/dbh.inc.php";

session_start();

$savedUsername = $_SESSION["username"];

if (!isset($savedUsername) || empty($savedUsername)) {
    header("location: login.php");
    exit;
}

$sql = "SELECT * FROM messages WHERE sender = $savedUsername";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);

if ($row > 0) {
    echo "it works";

    while($row) {
        echo htmlspecialchars($row["sender"] . ": " . $row["msg"]);
        echo "<br><br>";
    }
}
else {
    echo "It doesn't work";
}

?>

【问题讨论】:

    标签: php mysql sql mysqli infinite-loop


    【解决方案1】:

    当你使用时

    while($row) {
    

    您实际上是在创建一个无限循环。因为$row 是一个已定义的变量,所以它是一个 turthy 值——这使得它本质上变成了

    while (true) {
    

    您想要的是获取每一行,这意味着您必须提供mysqli_fetch_assoc() 作为while 的参数。您还想检查 行数,因为您现在正在获取第一行(并且它将在循环中不可见)。

    if (mysqli_num_rows($result)> 0) {
        echo "it works";
    
        while($row = mysqli_fetch_assoc($result)) {
            echo htmlspecialchars($row["sender"] . ": " . $row["msg"]);
            echo "<br><br>";
        }
    }
    else {
        echo "It doesn't work";
    }
    

    您还应该知道,您的代码容易受到 SQL 注入攻击,您应该使用 MySQLi 的准备好的语句并绑定您的值,而不是直接在查询中注入变量。

    【讨论】:

      【解决方案2】:

      改变这个:

      $row = mysqli_fetch_assoc($result);
      
      if ($row > 0)
      {
          echo "it works";
      
         while($row)
         {
            echo htmlspecialchars($row["sender"] . ": " . $row["msg"]);
            echo "<br><br>";
         }
      }
      

      到这里:

      if (mysqli_num_rows($result) > 0)
      {
      
          while($row = mysqli_fetch_assoc($result))
          {
              echo htmlspecialchars($row["sender"] . ": " . $row["msg"]);
              echo "<br><br>";
          }
      }
      

      【讨论】:

        【解决方案3】:

        如果您的查询是否包含任何记录,您可以先使用mysqli_num_rows 计数,然后如果有如下记录,则可以使用mysqli_fetch_assoc

        $sql = "SELECT * FROM messages WHERE sender = $savedUsername";
        $result = mysqli_query($conn, $sql);
        $count = mysqli_num_rows($result);
        
        if ($count > 0) {
            echo "it works";
            while($row = mysqli_fetch_assoc($result)) {
                echo htmlspecialchars($row["sender"] . ": " . $row["msg"]);
                echo "<br><br>";
            }
         }
        

        始终使用Prepared Statements使查询更加安全

        【讨论】:

          猜你喜欢
          • 2014-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-08
          • 2013-12-27
          • 2019-12-01
          • 1970-01-01
          相关资源
          最近更新 更多