MySQL select 在 phpMyAdmin 中有效但在 PHP 中无效?

MySQL select works in phpMyAdmin but not within PHP?

我正在使用 MySQL 5.7 和 PHP 7.4。

下面的 select 语句 运行 在 phpMyAdmin 中完全没问题,并且 returns 连续,如我所料。

select b.price,sum(ifnull(i.itemamount,0)) totalpaid,b.loyaltypoints
from bookings b 
    left join paymentitems i on i.bookingid = b.id
where b.id = 214

但是如果我尝试使用 PDO 从 PHP 中 运行 这个完全相同的语句,我会收到 500 错误。是的,我已经确认绑定到 :bookingid 的值是 214。

$db->query("select b.price,sum(ifnull(i.itemamount,0)) totalpaid,
                   b.loyaltypoints
              from bookings b 
              left join paymentitems i on i.bookingid = b.id
             where b.id = :bookingid");

$db->bind(":bookingid",$bookingid);

我已将问题缩小到这部分

sum(ifnull(i.itemamount,0)) totalpaid

如果我删除总和,则它有效。至少在它认为它有效 SQL 和 运行 的意义上。当然我没有得到我想要的结果,因为我需要求和值。

ifnull(i.itemamount,0) totalpaid

所以我想这是一个由两部分组成的问题。最重要的是,我怎样才能使它工作,而且,为什么它不起作用?这让我很困惑。

编辑:我应该补充一点,因为我的语法似乎有很多混乱,我正在使用数据库 class 来准备和绑定,所以当我说 $db->query () 这实际上是在做一个准备。 $db->bind() 正在做一个 bindValue。多年来,我一直在数以千计的其他语句中使用此 class,之前从未遇到过此问题,所以我知道它工作得很好。

编辑:在 PHP 日志中发现此错误:PHP 致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1140 在聚合查询中没有 GROUP BY,SELECT 列表的表达式 #1 包含非聚合列 'benji_prod.b.price';这与

中的 sql_mode=only_full_group_by 不兼容
  Working Code:
  -------------
  $servername = "localhost";
  $username = "root";
  $password = "";

  $bookingid=1;
  
  $conn = new PDO("mysql:host=$servername;dbname=test", $username, $password);
  
  $sth = $conn->prepare('select b.price,sum(ifnull(i.itemamount,0)) totalpaid,b.loyaltypoints from bookings b left join paymentitems i on i.bookingid = b.id where b.id = :bookingid');// if you change "prepare" with "query" it will show error
 
  $sth->bindParam(':bookingid',$bookingid);
  
  $sth->execute();
  
  $result = $sth->fetchAll();
  
  var_dump($result);     


    Mistakes as per  my opinion:
    ----------------------------
    $sth = $conn->query('select b.price,sum(ifnull(i.itemamount,0)) totalpaid,b.loyaltypoints from bookings b left join paymentitems i on i.bookingid = b.id where b.id>0');//here there is no binding values, it will work
    
    $sth = $conn->query('select b.price,sum(ifnull(i.itemamount,0)) totalpaid,b.loyaltypoints from bookings b left join paymentitems i on i.bookingid = b.id where b.id=:bookingid');//it will show error, since there is binding values
    
    $db->bind(":bookingid",$bookingid);-> incorrect syntax
    
    $sth->bindParam(':bookingid',$bookingid); -> correct syntax
    
    
    

错误消息指出您需要所有列都具有如下所示的聚合函数。

但我认为您需要重新考虑您的查询并通过您的查询向我们展示您真正想要完成的事情

看来,phpmyadmin 忽略了服务器的 only_full_group_by。但是禁用它的解决方案 here 不是正确的选择,编写正确的查询,提供正确的结果

CREATE tABLE bookings (id int,price DECIMAL(8,2),loyaltypoints int)
INSERT INTO bookings VALUES (214,12.12,1)
CREATE TABLE paymentitems (bookingid int,itemamount int)
INSERT INTO paymentitems VALUES (214,10.11),(214,2.01)
select MIN(b.price),sum(ifnull(i.itemamount,0)) totalpaid,SUM(b.loyaltypoints)
from bookings b 
    left join paymentitems i on i.bookingid = b.id
where b.id = 214
MIN(b.price) | totalpaid | SUM(b.loyaltypoints)
-----------: | --------: | -------------------:
       12.12 |        12 |                    2

db<>fiddle here