【问题标题】:Stop PHP PDO from clearing variables for each row fetch停止 PHP PDO 清除每行获取的变量
【发布时间】:2017-05-08 00:57:00
【问题描述】:

我使用 HeidiSQL 编写我的 PHP/MySQL 查询。我想用下面的测试SQL

SELECT @summer := 0, wrapper.* FROM
    (SELECT 
        bs_file.*,
        @summer := IFNULL(@summer,0), 
        @summer := @summer+1 as summer
    FROM bs_file  
) as wrapper
WHERE wrapper.summer = 3

为了演示我的问题,它位于一个更复杂的查询中,这种情况实际上是有意义的。这条 SQL 基本上每行都会增加 @summer

预期的行为是数据库返回我的bs_file 表的第 4 行以及一些额外的字段 (0,2,3)。

当我在 HeidiSQL 中执行此查询时,一切都按预期工作。

但是当我使用 PDO 时,我将一无所获。

$sql = "SELECT @summer := 0, wrap...";
$connection->prepare($sql);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);

$result 返回 false

我尝试使用非准备语句,事务。我知道您可以更改连接属性,但我不知道要设置什么来接收我的结果。

我发现@summer 将被设置为0 每次获取一行。

【问题讨论】:

  • 我在 PDO 准备好的语句中运行了您的确切查询,它工作正常;-/ 使用的代码:pastebin.com/UhgVx5jq
  • 我最初使用 phalcon 模型,然后下到 pdo 层。也许我没有尝试过。

标签: php mysql sql sql-server pdo


【解决方案1】:

我不太了解 SQL,无法说明您的查询为何不起作用。
我也不能在 mysql 控制台中重现您所谓的结果。
我非常怀疑清除变量应该归咎于 PDO。

无论哪种方式,我都会在两个查询中进行,首先设置变量,然后在其中使用查询

$pdo->query("SELECT @summer := 0");
$sql ="SELECT wrapper.* FROM
        (SELECT 
            bs_file.*,
            @summer := @summer+1 as summer
        FROM bs_file  
    ) as wrapper
    WHERE wrapper.summer = 3";
$row = $pdo->query($sql)->fetch();

这段代码对我有用,不管它是什么意思。

【讨论】:

  • 我认为 PDO 不是问题,我认为我在配置它时做错了。两次选择没有意义。包装器只会使@summer 为空,因为 HeidiSQL 会保持状态直到连接被终止。
  • 您在上面的评论中有许多错误的陈述。检查您的场所,然后再来。
  • 好的,我知道你的意思,但是你的例子在第三行的 PHP 插入中仍然返回 false,就像在 HeidiSQL 中一样
  • 对我来说它返回第三行。所以这不是 PDO,而是您的查询。检查你的 SQL。
  • 它应该可以工作。您始终可以运行多个查询。其他明智的许多数据库功能将无法正常工作。
猜你喜欢
  • 2016-09-22
  • 2014-12-26
  • 2013-03-04
  • 2015-06-01
  • 2011-07-19
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多