【问题标题】:PHP PDO - Using MySQL VariablesPHP PDO - 使用 MySQL 变量
【发布时间】:2020-07-31 15:07:24
【问题描述】:

我正在尝试使用 PDO 在 PHP 中运行查询。 该查询在顶部有一些变量来确定排名,除了在 $sql 中使用 SET @var 时,它返回一个空行集。但是,如果我删除有问题的 SQL,它会返回正常。

我不想在我的脚本中返回 @prev_value、@rank_count 或 @rank_increasing,只返回它在 SELECT 中创建的排名。

你能告诉我我做错了什么吗?

谢谢

    $sql = "
    SET @prev_value = NULL;
    SET @rank_count = 0;
    SET @rank_increasing = 0;
    SELECT a.*
         , @rank_increasing := @rank_increasing + 1 AS row_num
         , CASE
           WHEN @prev_value = score 
              THEN @rank_count
           WHEN @prev_value := score 
              THEN @rank_count := @rank_increasing
           END AS rank
      FROM ( 
           -- INLINE VIEW --
           ) a
    ";
    try {
        $sth = $dbh->prepare($sql);
        $sth->execute(array($var1, $var2));
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    } catch (Exception $e) {
        return $e;
    }

【问题讨论】:

标签: php mysql sql variables pdo


【解决方案1】:

在这里找到解决方案:https://stackoverflow.com/a/4685040/1266457

谢谢你:)

修复:

// Prepare and execute the variables first
$sql = "
SET @prev_value = NULL;
SET @rank_count = 0;
SET @rank_increasing = 0;
";
$sth = $dbh->prepare($sql);
$sth->execute();

// Run the main query
$sql = "
SELECT a.*
     , @rank_increasing := @rank_increasing + 1 AS row_num
     , CASE
       WHEN @prev_value = score 
          THEN @rank_count
       WHEN @prev_value := score 
          THEN @rank_count := @rank_increasing
       END AS rank
  FROM ( 
       -- INLINE VIEW --
       ) a
"; ...

【讨论】:

  • 在同一个查询中执行“sets”会引发错误,但单独它可以正常工作。因为,似乎没有合乎逻辑的理由。非常感谢,这解决了问题。
  • 在与 UPDATE 语句相同的语句中执行 SET 语句在我的情况下不会引发错误,查询确实执行正常。但是我无法使用 rowCount() 从数据库连接中取回受影响的行。拆分查询对我有用,我现在可以使用 rowCount() 检查我是否更新了一些行!从 prepare() 中删除 Mysql 变量时,我得到了受影响的行,因此我找到了这篇文章。感谢您的回答!
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
相关资源
最近更新 更多