PHP PDO - 使用MySQL变量

8
我正在尝试使用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;
    }

1个回答

14

在这里找到了解决方案:https://dev59.com/tVPTa4cB1Zd3GeqPil56#4685040

谢谢 :)

修复方法:

// 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”会引发错误,但分开执行则正常工作。似乎没有逻辑原因。所以感谢您,这解决了问题。 - Guilherme Ferreira
在我的情况下,在UPDATE语句中使用同一语句执行SET语句并没有抛出错误,查询表现正常。但我无法通过rowCount()从数据库连接获取受影响的行数。将查询拆分后,我成功解决了这个问题,并且现在可以使用rowCount()来检查是否更新了某些行!当我从prepare()中删除Mysql变量时,我得到了我的受影响的行数,因此我找到了这篇文章。 感谢您的回答! - Piemol
这个问题有点老了,但如果我没记错的话。在MySQL或PHP中有一个安全设置,防止在同一次调用中执行两个SQL语句。当然,这是为了防止某些形式的SQL注入。比如使用第二个查询来向数据库添加用户,或者修改表等等...我发现这个问题是因为我需要进行聚合查询,其中需要多次使用用户ID,将其作为变量更容易而不是不断注入它。 - ArtisticPhoenix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接