【问题标题】:MySql_fetch_array() error in PHP when using while使用while时PHP中的MySql_fetch_array()错误
【发布时间】:2012-07-31 00:13:00
【问题描述】:

好的,这是我的代码:

$select_status = 0;
$select_status = "<select name='status'>\n";
$select_status .= "<option value=''>SELECT ONE</option>\n";
$sdataset = mysql_query("SELECT id, name FROM phponly_category") or die(mysql_error());

while($srow=mysql_fetch_assoc($sdataset)) {
    echo implode(", ", $srow);
    echo "<br />";

    $select_status .= "<option value='".$srow['name']."'";
    $select_status .= ">".$srow['name']."</option>\n";


} // end while loop
echo "out of the loop";
$select_status .= "</select>\n";
// now insert the <select> list control into the page
echo $select_status;

代码工作正常,直到最后一行中断。我无法打印 echo $select_status。 我试图通过打印每一行来查看 SQL 查询结果发生了什么,但那里的一切看起来都很好。由于某种原因,在最后一行 while 循环 中断,甚至 while 循环 之后的代码也没有被执行。

【问题讨论】:

    标签: php mysql loops while-loop


    【解决方案1】:

    不要在 while 测试中执行 or die(mysql_error()) 部分...在此之前执行。

    if($sdataset==false) {
        die(mysql_error());
    }
    while($srow=mysql_fetch_array($sdataset)) {
        $select_status .= "<option value='".$srow['name']."'".">".$srow['name']."</option>\n";
    } // end while loop
    

    【讨论】:

    • 出于某种奇怪的原因,现在使用 echo implode(",", $srow);现在我看到我的列得到双值,如 1、1、计算机、计算机。我检查了我的sql,它看起来没问题。我不明白有什么问题。否则,我不会得到更好的结果,也不会出错。
    • 问一个新问题可能是个好主意,这样我们就可以相应地解决它。发布其余代码,以便我们了解一些上下文。
    • 双值部分已解决,但 while 循环仍然中断。
    【解决方案2】:

    当您读取结果集的末尾时,while() 循环中的 or die() 实际上会终止脚本。 mysql_fetch 将返回 false,触发or die()

    虽然在查询中检查错误很有用,但在获取部分你不能这样做,因为你会得到这样的误报。

    【讨论】:

    • 好吧,我后来添加了骰子,看看有什么问题。我现在移除了骰子,但我仍然没有得到任何输出,也没有错误。
    • @acaushi 你检查过像 $srow=mysql_fetch_array($sdataset); 这样的输出吗? print_r($srow);
    • 我使用 echo implode(",", $srow); 检查了 $srow 的输出,有一个问题。我得到每列的双倍值。例如 1、1、计算机、计算机。
    • @acaushi: RTFM: php.net/mysql_fetch_array 数组作为关联数组和索引数组获取。您可能想要 fetch_assoc 代替,它仅关联
    • 好的,关联解决了双栏的问题。尽管如此,我还是不明白为什么 while 循环会中断
    【解决方案3】:

    我个人不喜欢回显html代码,如果你的目标是验证查询是否有结果,你可以这样做

    <?php
        $sdataset = mysql_query("SELECT id, name FROM phponly_category");
        if (mysql_num_rows($sdataset) > 0) {
    ?>
        <select name='status'>
        <option value=''>SELECT ONE</option>
    <?php
        while($srow = mysql_fetch_array($sdataset)) {
    ?>
        <option value='<?php echo $srow['name'] ?>'><?php echo $srow['name'] ?></option>
    <?php } // end while loop ?>
        </select>
    <?php
        } // end of if
        else {
            // Whatever you wanna put here
        }
    ?>
    

    已编辑:mysql_num_rows 有错字,请再试一次

    【讨论】:

    • 好的,我尝试了没有回声的方法 :)。它对我来说效果很好。我可以说问题已经解决了。谢谢!
    • 您对回显 HTML 提出了一个很好的观点。然而,这实际上是一回事。我们仍在混合实现和逻辑。最好先进行处理,然后渲染。尽可能使用模板。更容易阅读/调试/维护。
    • @pyrospade 是的,echo 工作,我更喜欢这种方式,因为我认为它更清楚地呈现代码
    【解决方案4】:

    使用mysql_fetch_assoc,这样你就可以使用字段名作为key来获取数据。

    <?php
    
    $conn = mysql_connect('localhost', 'username', 'password');
    mysql_select_db('test');
    
    $select_status = "<select name='status'>\n";
    $select_status .= "<option value=''>SELECT ONE</option>\n";
    $sdataset = mysql_query("SELECT id, name FROM phponly_category") or die(mysql_error());
    
    while($srow=mysql_fetch_assoc($sdataset)) {
        $select_status .= "<option value='".$srow['name']."'".">".$srow['name']."</option>\n";
    
    } // end while loop
    
    $select_status .= "</select>\n";
    echo $select_status;
    ?>
    

    注意:不鼓励使用此扩展程序。看看mysqli或PDO。

    【讨论】:

    • 我改成了 mysql_fetch_assoc,while 循环仍然中断,我无法回显 $select_status;
    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 2012-02-29
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多