Php GROUP BY中使用的传入参数仍然返回1行?
我偶然发现了这种行为,现在我很好奇到底发生了什么。如果我尝试将参数绑定到GROUPBY子句中的列名,则实际上会返回数据,但只返回一行。我知道您正在使用表名或列名作为参数,但我想知道是什么导致了这种情况在幕后发生。这在我的(业余)代码中很深,很难排除故障,因为它没有抛出错误,而且实际上返回了数据。我希望更多地了解这一点 样本表:Php GROUP BY中使用的传入参数仍然返回1行?,php,mysql,pdo,group-by,bindparam,Php,Mysql,Pdo,Group By,Bindparam,我偶然发现了这种行为,现在我很好奇到底发生了什么。如果我尝试将参数绑定到GROUPBY子句中的列名,则实际上会返回数据,但只返回一行。我知道您正在使用表名或列名作为参数,但我想知道是什么导致了这种情况在幕后发生。这在我的(业余)代码中很深,很难排除故障,因为它没有抛出错误,而且实际上返回了数据。我希望更多地了解这一点 样本表: | artist | album | label | |-----------------|---------------
| 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”
我注意到:
- 改为使用“艺术家分组”,并注释掉:字段的bindParam行,我得到了预期的“行数:2”这是正确的方法。
- 使用WHERE子句中的参数:field作为列名(例如,“WHERE:fieldlike:artist”)将显示“行数:0”
当您传入
:field
时,您正在传入一个字符串值。因此,结果是groupby
,它返回一行
无法参数化列的名称,因此必须将其直接放入SQL语句中:
$sql = 'SELECT artist, album
FROM record_collection
WHERE artist LIKE :artist
GROUP BY '.$field'
:artist
很好,因为它是一个值,而不是SQL中的标识符。试试这个简单的SQL:选择。。。按“whatever”分组(注意引号使其成为字符串文字)谢谢——根据您的回答,我测试并确认了按“someRandomString”分组和按NULL分组的相同行为。后者让我想到了,这基本上是一样的。我还检查了SQL Server,它确实在按select子句中未包含的内容进行分组时抛出了一个错误,正如我预期的那样,如果在我的环境中仅启用了_FULL _GROUP _by,mysql会这样做,但如果$field
来自用户输入,那么它是否会像SQL注入一样存在安全问题??有什么建议吗?