【问题标题】:PHP Foreach statement issue. Multiple rows are returnedPHP Foreach 语句问题。返回多行
【发布时间】:2012-12-07 22:57:48
【问题描述】:

我是 PHP 初学者,最近我的源代码出现问题。

这里是:

   <html>
    <head>
        <title>
            Bot
        </title>
        <link type="text/css" rel="stylesheet" href="main.css" />
    </head>
    <body>
        <form action="bot.php "method="post">
            <lable>You:<input type="text" name="intrebare"></lable>
            <input type="submit" name="introdu" value="Send">
        </form>
    </body>
</html>
<?php
//error_reporting(E_ALL & ~E_NOTICE);
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("robo") or die(mysql_error());

$intrebare=$_POST['intrebare'];
$query = "SELECT * FROM dialog where intrebare like '%$intrebare%'"; 
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_array($result) or die(mysql_error());
?>
<div id="history">
<?php       
        foreach($row as $rows){ 
            echo "<b>The robot says: </b><br />";
            echo $row['raspuns'];
            }
?>
</div>

它返回结果 6 次。

这个问题出现在我创建 foreach 的时候,因为我希望在每次 SQL 查询之后结果一个一个地停留在页面上。

你能告诉我似乎是什么问题吗?谢谢!

【问题讨论】:

    标签: php html mysql


    【解决方案1】:

    你做错了。 ;-)

    首先,您必须使用mysql_fetch_array 在这样的循环中获取结果:

    while (true == ($row = mysql_fetch_array($result))) {
        echo "<b>The robot says: </b><br />";
        echo $row['raspuns'];
    }
    

    其次,我想告诉你,所有的 mysql_* 函数都被标记为已弃用。如果你想学习 PHP,你应该尝试学习如何使用 PDO 连接到 mysql。

    【讨论】:

    • 我试过你的代码,它工作,谢谢。但它仍然返回结果,然后用下一个替换它。我想将所有结果保留在页面上。你能告诉我我该怎么做吗?
    【解决方案2】:

    mysql_fetch_array 每次调用获取一行。你会想要这样做:

    while ($row = mysql_fetch_array($result)) {
        echo "<b>The robot says:</b><br>";
        echo htmlentities($row['raspuns']);
    }
    

    并摆脱第一个mysql_fetch_array。

    (请注意,我正在对变量输出进行 HTML 转义。除非您知道自己在做什么,否则不应将原始数据输出到页面中。)

    顺便说一句,mysql_query 已被有效弃用。完全不推荐用于新代码。看看mysqli(替代品)或PDO(新热点)。使用新的 mysqli (objecty) 接口,PHP 部分看起来有点像这样:

    <?php
    
    //error_reporting(E_ALL & ~E_NOTICE);
    
    $db = new mysqli('localhost', 'root', '', 'robo');
    
    # turn into a wildcard
    $intrebare='%' . $_POST['intrebare'] . '%';
    
    $stmt = $db->prepare('SELECT * FROM dialog WHERE intrebare LIKE ?');
    $stmt->bind_param('s', $intrebare);
    $result = $stmt->execute();
    
    echo '<div id="history">';
    # 5.4 lets you do it like this; 
    # older versions, try `while ($row = $result->fetch_assoc())`
    foreach ($result as $row) {
        echo "<b>The robot says: </b><br />";
        echo htmlentities($row['raspuns']);
    }
    
    ?>
    

    【讨论】:

      【解决方案3】:

      你只会得到一个结果(只有一次调用 mysql_fetch_array())。我敢打赌,对话框中有六列。

      ...
      $result = mysql_query($query) or die(mysql_error());
      ?>
      <div id="history">
      <?php
      while($row = mysql_fetch_array($result))
      {
          echo "<b>The robot says: </b><br />";
          echo htmlentities($row['raspuns']);
      }
      ?>
      </div>
      

      另外,mysql_* 函数也被弃用了。切换到 mysqli_* 或 PDO。

      【讨论】:

        【解决方案4】:

        使用 while 获取所有数据并检查变量名称

                while($row = mysql_fetch_array($result)){ 
                echo "<b>The robot says: </b><br />";
                echo $row['raspuns']; // Here
                }
        

        【讨论】:

        • @BenjaminPaap - $row 是一个数组;它只设置了一次
        • @MTahir - 数数你的括号
        • @GlaciesofPacis:谢谢,我之前很仓促,错过了细节
        【解决方案5】:

        你正在尝试相反的方式:

            <?php     
        
            while($row = mysql_fetch_array($result,MYSQL_ASSOC)){ 
                echo '<strong>The robot says: </strong><br />', $row['raspuns'];
                }
            ?>
        

        立即尝试:)

        【讨论】:

        • 让我用简单的英语重新表述一下 foreach 循环。对于 $rows.... 中的每个 $row ,都回显一个 $row。有帮助吗?
        • 我是反对者; mysql_fetch_array($result) 一次只获取一行。因此,只需调用一次,您的 foreach 循环就只会遍历第一行。
        • 几乎;检查你的括号:)
        • 刚刚添加它虽然是可选的。谢谢!
        猜你喜欢
        • 2012-11-05
        • 2017-04-21
        • 2011-08-01
        • 1970-01-01
        • 2023-02-04
        • 1970-01-01
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多