gpt4 book ai didi

php - GROUP BY 中使用的传入参数仍然返回 1 行?

转载 作者:行者123 更新时间:2023-11-30 22:14:24 25 4
gpt4 key购买 nike

我偶然发现了这种行为,现在我很好奇到底发生了什么。如果我尝试将参数绑定(bind)到 GROUP BY 子句中的列名,实际上会返回数据,但只有一行我知道你是 not allowed to使用表名或列名作为参数,但我想知道是什么导致这种情况在幕后发生。这深埋在我的(业余)代码中,很难排除故障,因为它没有抛出错误,而且它实际上返回了数据。我希望对此有更多的了解!

示例表:

| artist          | album          | label       |
|-----------------|----------------|-------------|
| John Coltrane | A Love Supreme | MCA Records |
| John McLaughlin | Extrapolation | Marmalade |
| John Coltrane | A Love Supreme | Impulse! |
| John McLaughlin | Extrapolation | Polydor |

示例代码:

$field = 'artist';
$artist = '%john%';
$sql = 'SELECT artist, album
FROM record_collection
WHERE artist LIKE :artist
GROUP BY :field';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':artist', $artist);
$stmt->bindParam(':field', $field);
$stmt->execute();
echo 'Row count: '. $stmt->rowCount();

返回:“行数:1”

我注意到:

  • 改为使用“GROUP BY artist”,并注释掉 :field 的 bindParam 行,我得到了预期的“Row count: 2”。 这是正确的做法。
  • 在 WHERE 子句中使用参数 :field 作为列名(例如,“WHERE :field LIKE :artist”)会得到“行数:0”。

所以我想知道的是:

  1. 在导致返回 1 行的场景背后,SQL/PDO 做了什么?
  2. 如果不支持 GROUP BY 中的参数,为什么不返回任何内容,或者更好的是,抛出一个错误?我假设不是,但是将参数传递给 GROUP BY 有任何合法用途吗?

最佳答案

当你通过 :field in,那么你传递的是一个字符串值。所以,结果是 group by <constant> ,返回一行。

列名不能参数化,必须直接写在SQL语句中:

$sql = 'SELECT artist, album
FROM record_collection
WHERE artist LIKE :artist
GROUP BY '.$field'

:artist很好,因为它是一个值,而不是 SQL 中的标识符。

关于php - GROUP BY 中使用的传入参数仍然返回 1 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38943718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com