【问题标题】:How do I loop through a mysql query with php如何使用 php 循环遍历 mysql 查询
【发布时间】:2011-03-09 10:56:07
【问题描述】:

我尝试使用这个功能

        $conn = db_connect();
        while ($newsfeed = $conn->query("select info, username, time from newsfeed ORDER BY time DESC LIMIT 10"))
        {
                    (...)
                     echo "<p>User $newsfeed_username just registerted ".$minutes." min ago </p><br>";

但它只会一遍又一遍地显示最新的行。我想遍历来自

的所有查询
select info, username, time from newsfeed ORDER BY time DESC LIMIT 10

按降序排列。

【问题讨论】:

    标签: php mysql loops


    【解决方案1】:

    在进入循环之前,您需要将$conn-query() 的结果存储在一个变量中。现在,您在循环的每次迭代中一遍又一遍地运行查询,这将始终为您提供第一个结果。

    例子

    $conn = db_connect();
    $result = $conn->query("select info, username, time from newsfeed ORDER BY time DESC LIMIT 10");
            foreach ($result as $newsfeed)
            {
                        (...)
                         echo "<p>User $newsfeed_username just registerted ".$minutes." min ago </p><br>";
    

    【讨论】:

    • 然后得到下一个变量的问题致命错误:在下一行调用非对象上的成员函数 fetch_array():$newsfeed_info_array = $newsfeed-&gt;fetch_array(MYSQLI_NUM); $newsfeed_info = $newsfeed_info_array[0]; $newsfeed_username = $newsfeed_info_array[1]; $newsfeed_time = $newsfeed_info_array[2];
    • 那么问题出在哪里?错误清楚地解释了这一切。顺便说一句,如果您需要一些额外的帮助,您应该创建新问题或使用原始问题下方的一些文本和代码行更新现有问题。
    • 这可能意味着您的查询失败。您需要检查$conn-query()是否返回false,如果是,则可以通过$conn-&gt;error访问信息。
    【解决方案2】:

    首先,您不想循环查询。您想遍历查询将返回的记录。

    第二个你可以这样做,这样:

    $conn = db_connect();
    
    $query = mysql_query("SELECT info, username, time FROM newsfeed ORDER BY time DESC LIMIT 10");
    
    while(($row = mysql_fetch_assoc($query)) != NULL) {
    
        echo "<p>User {$row['username']} just registered {$minutes} min ago</p><br />";
    
    }
    

    注意!假设这个 db_connect() 建立了一个 mysql 连接。

    【讨论】:

    • 现在唯一显示的是:警告:mysql_fetch_assoc() 期望参数 1 是资源,布尔值给定当前代码:$con = db_connect2(); $sql = mysql_query("SELECT info, username, time FROM newsfeed ORDER BY time DESC LIMIT 10"); mysql_select_db('drug_empire',$con); $query = mysql_query($sql,$con); while(($row = mysql_fetch_assoc($query)) != NULL) { echo "

      用户 {$row['username']} 刚刚在 {$minutes} 分钟前注册


      "; ps:我发布cmets时如何获取code字段?
    • 退出使用mysql使用mysqli
    【解决方案3】:

    这是这类事情的基本模板,使用内置的 php 函数(假设是旧式 mysql,但使用其他数据库后端或更高级别的库类似)。在这个例子中,错误是通过抛出异常来处理的,但这只是一种方法。

    1. 连接到数据库
    2. 确保连接成功
    3. 运行查询
    4. 确保查询没有因某种原因失败(通常是 SQL 语法错误)。如果确实失败了,请找出原因并处理该错误
    5. 检查查询是否返回了至少一行(零行通常是一种特殊情况)
    6. 遍历返回的行,做任何你需要做的事情。

    需要定义异常类(它们是这里唯一的非内置语法,但您不应该抛出普通异常)。

    示例代码:

    <?PHP
    //try to connect to your database.
    $conn = mysql_connect(...);
    
    //handle errors if connection failed.
    if (! $conn){
        throw new Db_Connect_Error(..); 
    }   
    
    // (try to) run your query.
    $resultset = mysql_query('SELECT ...');
    
    //handle errors if query failed.  mysql_error() will give you some handy hints.
    if (! $resultset){ 
        // probably a syntax error in your SQL, 
        // but could be some other error
        throw new Db_Query_Exception("DB Error: " . mysql_error()); 
    }
    
    //so now we know we have a valid resultset
    
    //zero-length results are usually a a special case    
    if (mysql_num_rows($resultset) == 0){   
        //do something sensible, like tell the user no records match, etc....
    }else{
        // our query returned at least one result. loop over results and do stuff.
        while($row = mysql_fetch_assoc($resultset)){
            //do something with the contents of $row
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多