【问题标题】:mysqli_query return false instead of 1 rowmysqli_query 返回 false 而不是 1 行
【发布时间】:2019-11-01 01:57:16
【问题描述】:

我不明白为什么 mysqli_query 返回 false,我在网上搜索了很多但是 我什么都没找到。

我的代码:

$M1 = "SET @Month = month(TIMESTAMPADD(month, -1, CAST(now() AS DATE)));    
Set @firstDay = CONCAT('01','/', @month, '/',year(now())); SET @lastDay = 
last_day(TIMESTAMPADD(month, -1, CAST(now() AS DATE))); SELECT count(*) 
AS M1 FROM APPEL where CAST(D_CREATION AS DATE) BETWEEN @firstDay and 
@lastDay";

$connexion = cnx();
if ($connexion) 
{
  $result = mysqli_query($connexion, $M1);
  if($result)
  {
    $row = mysqli_fetch_assoc($result); // This is Line 55
    $_SESSION['ArrayMois'][0] = implode($row);
  }
  else
  {
    $_SESSION['ArrayMois'][0] = 0;
  }   
}

错误是:

警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,布尔值在第 55 行的 ... 中给出

这个查询总是返回false,但如果我在 PHPMyAdmin 中执行它,我会返回一行。

【问题讨论】:

标签: php mysql mysqli


【解决方案1】:

1) MySQL reporting log locations

2) 阅读this answer 了解如何生成和阅读 MySQL 错误报告。

对于您的代码:

$row = mysqli_fetch_assoc($result) 
      or error_log("MYSQL Error on line ". __LINE__. 
         " :: ".print_r(mysqli_error($connection),true));

更新:

你说:

警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,布尔值在第 55 行的 ... 中给出

你的错误是什么意思:

这意味着 查询 没有按预期工作,因此:

$result = mysqli_query($connexion, $M1) 
          or error_log("MYSQL Error on line ". __LINE__. 
             " :: ".print_r(mysqli_error($connection),true));

问题:

您正在一个 MySQL_query 查询处理程序中运行多个单独的 SQL 查询,在大多数情况下默认情况下不允许这样做。也许您已将 SQL 设置为接受串联查询,但通常这是不明智的,而且不太可能。

另类。您可以创建一个PROCEDURE, FUNCTION or similar

您也不要将列名包含在反引号中,这是非常可取的。


修复你的 SQL:

目前你有:

SET @Month = month(TIMESTAMPADD(month, -1, CAST(now() AS DATE)));  

Set @firstDay = CONCAT('01','/', @month, '/',year(now())); 

SET @lastDay = last_day(TIMESTAMPADD(month, -1, CAST(now() AS DATE))); 

SELECT count(*) AS M1 FROM APPEL where CAST(D_CREATION AS DATE) 
       BETWEEN @firstDay and @lastDay";

这可以更简洁地写成:

SELECT COUNT(*) as M1 FROM APPEL WHERE CAST(`D_CREATION` AS DATE) BETWEEN
(LAST_DAY(CURDATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY) AND LAST_DAY(CURDATE())

这将列出当月第一天和最后一天之间的所有结果。我从你的代码中不清楚你到底想要达到什么,但看起来你可能想要上一个月的列表,在这种情况下你可以使用:

SELECT COUNT(*) as M1 FROM APPEL WHERE CAST(`D_CREATION` AS DATE) BETWEEN
(LAST_DAY(CURDATE() - INTERVAL 2 MONTH) + INTERVAL 1 DAY) 
AND LAST_DAY(CURDATE() - INTERVAL 1 MONTH)

【讨论】:

  • 谢谢,但如果我使用 $M2(与 $M1 相同但只是一个月)mysql_query 将返回 false,而他必须正常返回 true,因为如果我接受查询并执行它phpmyadmin 我返回了一行。
  • 非常感谢!!我明白为什么它不起作用。是的,我想要上个月的列表。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2012-01-05
  • 2014-11-28
  • 1970-01-01
  • 2021-06-04
  • 2023-03-20
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多