【问题标题】:PHP: SQL ticks that don't make any sense [duplicate]PHP:没有任何意义的SQL滴答声[重复]
【发布时间】:2012-05-09 22:59:25
【问题描述】:

可能重复:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select

我上次检查时我的代码运行良好,但现在它似乎坏了。这是错误:

    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/nerblog/public_html/nerblog/arch.php on line 4

...这是第 4 行的代码:

    $q = mysql_query("SELECT * FROM main WHERE month='$month' AND year='$year' LIMIT 12 ORDER BY id DESC");

    while ($sql = mysql_fetch_array($q ))

【问题讨论】:

  • 这是一个布尔值,因为您的查询无效

标签: php sql boolean


【解决方案1】:

您的 SQL 查询失败。尝试将“ORDER”之后的“LIMIT”命令移动到查询的末尾:

SELECT * FROM main WHERE month='$month' AND year='$year' ORDER BY id DESC LIMIT 12

【讨论】:

    【解决方案2】:

    根据文档:

    对于 SELECT、SHOW、DESCRIBE、EXPLAIN 和其他返回结果集的语句,mysql_query() 成功时返回资源,错误时返回 FALSE。

    对于其他类型的 SQL 语句,INSERT、UPDATE、DELETE、DROP 等,mysql_query() 成功时返回 TRUE,错误时返回 FALSE。

    如果用户无权访问查询引用的表,mysql_query() 也会失败并返回 FALSE。

    mysql_fetch_array() 函数需要 mysql_query 返回的结果资源。如果该调用失败,它将返回 false,这就是您传递给 mysql_fetch_array() 函数的内容,因此它失败了。

    问题实际上出在您的 SQL 中。您需要在查询中将LIMIT 子句放在最后:

     SELECT * FROM main WHERE month='$month' AND year='$year' ORDER BY id DESC LIMIT 12 
    

    确保查询中的错误不会渗入其他代码的一种方法是首先检查该值:

    $q = mysql_query("SELECT * FROM main WHERE month='$month' AND year='$year' ORDER BY id DESC LIMIT 12");
    
    if($q != FALSE)
    {
       // Query didn't fail, so get results
       while ($result = mysql_fetch_array($q))
       {
          // Do something with $result
       }
    
    }
    

    【讨论】:

      【解决方案3】:

      mysql_error() 存在是有原因的。

      您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“ORDER BY id DESC”附近使用正确的语法

      意思是它没想到会看到ORDER BY 你把它放在哪里。原因是LIMIT 应该在之后 ORDER BY,而不是之前。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        相关资源
        最近更新 更多