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

Php GROUP BY中使用的传入参数仍然返回1行?,php,mysql,pdo,group-by,bindparam,Php,Mysql,Pdo,Group By,Bindparam,我偶然发现了这种行为,现在我很好奇到底发生了什么。如果我尝试将参数绑定到GROUPBY子句中的列名,则实际上会返回数据,但只返回一行。我知道您正在使用表名或列名作为参数,但我想知道是什么导致了这种情况在幕后发生。这在我的(业余)代码中很深,很难排除故障,因为它没有抛出错误,而且实际上返回了数据。我希望更多地了解这一点 样本表: | artist | album | label | |-----------------|---------------

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

样本表:

| 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”
所以我想知道的是:

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

  • 当您传入
    :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注入一样存在安全问题??有什么建议吗?