【问题标题】:Query returns boolean after adding "WHERE date BETWEEN" statement添加“WHERE date BETWEEN”语句后查询返回布尔值
【发布时间】:2015-05-16 14:57:32
【问题描述】:

查询运行良好,没有限制日期语句“BETWEEN ** AND **”。当我添加日期限制时,它返回一个布尔值,而不是通过循环对结果进行分组。

这是我的代码

$result = $mysqli->query("SELECT blood_type WHERE date BETWEEN '". 
$startingdate."' AND '". $endingdate ."',
count(*) AS donor_count FROM donors GROUP BY blood_type");

这是循环:

while ($row = $result->fetch_assoc()) {
    $resultArray[] = $row;  
}

抛出此错误:

PHP Fatal error:  Call to a member function fetch_assoc() on boolean

知道为什么它没有返回应有的数组吗?

编辑:

我收到以下错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE date BETWEEN '2015-04-20' AND '2015-05-18', count(*) AS donor_count FROM d' 附近使用正确的语法” /p>

【问题讨论】:

  • @Fred-ii- 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE date BETWEEN '2015-04-20' AND '2015-05-18', count(*) AS donor_count FROM d' 附近使用正确的语法” /跨度>
  • 您的FROM 的位置/查询顺序错误。请参阅下面的答案。
  • 将错误报告添加到您的打开 PHP 标记(例如 <?php error_reporting(E_ALL); ini_set('display_errors', 1);)之后的文件顶部,然后是其余代码,以查看它是否产生其他任何内容。如果您确实使用mysqli_ 进行连接,您可能需要向我们展示更多代码。
  • @Fred-ii-我每次收到错误时都会读取 apache 的错误日志,它会打印相同的错误...是的,我正在使用完全 mysqli ..

标签: php mysql mysqli


【解决方案1】:

当你想调试某些东西时,你应该打印出 SQL。您的查询是这样的:

SELECT blood_type
WHERE date BETWEEN '". $startingdate."' AND '". $endingdate ."',
count(*) AS donor_count
FROM donors
GROUP BY blood_type;

虽然由 SQL 子句构成,但它是胡言乱语。我想你想要:

SELECT blood_type, count(*) as donor_count
FROM donors
WHERE date BETWEEN '". $startingdate."' AND '". $endingdate ."'
GROUP BY blood_type;

SQL 语句中子句的顺序是固定的。如果你把它们放在错误的顺序,你会得到一个错误。您的代码应该检查此类错误。

此外,日期应该真正参数化,而不是嵌入到查询字符串中。

【讨论】:

  • 好主意,伙计!!!!现在更清楚了。尽管我尝试了你的代码,但它仍然出现同样的错误..
  • $startingdate."' AND '". $endingdate ."',
  • @Fred-ii-。 . .谢谢你。我什至没有看到。
  • @GordonLinoff 我想知道此时 OP 是否需要转义他们的数据。 MySQL 可能会抱怨这一点,并且很难准确地说出这些变量是从什么分配的。
  • @Alamri 我看到你接受了答案。那么,是不是前面的额外(尾随)逗号?
【解决方案2】:

不确定你想在这里做什么,但如果你想在某个时间段内按血型分组统计献血者,你的查询应该是这样的:

$result = $mysqli->query("SELECT blood_type, count(*) as donor_count WHERE date BETWEEN '". $startingdate."' AND '". $endingdate ."' GROUP BY blood_type");

翻译成这样的:

select blood_type, count(*) as donor_count WHERE date between '2015-05-10' and '2015-05-16' group by blood_type

【讨论】:

  • 是的,这正是我想要做的谢谢,但我尝试了您的查询,但仍然遇到同样的问题。它返回一个布尔值。
  • @Alamri,看看戈登的回答。这基本上是重复的,但有错误。
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多