Php 使用bindParam()的非常基本的PDO方法

Php 使用bindParam()的非常基本的PDO方法,php,sqlite,pdo,Php,Sqlite,Pdo,我有一个类似的类,有很多方法,但是getData()只返回$column参数的值 private $db; function __construct() { $this->db = new PDO('sqlite:\db'); } public function getData($rowid, $column) { $st = $this->db->prepare('SELECT ? FROM tbl WHERE rowid=?'); $st->

我有一个类似的类,有很多方法,但是
getData()
只返回
$column
参数的值

private $db;

function __construct()
{
    $this->db = new PDO('sqlite:\db');
}

public function getData($rowid, $column)
{
    $st = $this->db->prepare('SELECT ? FROM tbl WHERE rowid=?');
    $st->bindParam(1, $column, PDO::PARAM_STR);
    $st->bindParam(2, $rowid, PDO::PARAM_INT);
    if ($st->execute())
        return $st->fetchColumn();
    else
        return false;
}

类的每一个其他部分和
getData()
的剩余部分都有效。这里有什么问题?

bindParam
用于绑定参数,而不是标识符。在此处绑定的值将展开为:

SELECT 'some_value' FROM tbl WHERE rowid='some_other_value';
…因此相当于:

SELECT 'some_value';
应仅对实际参数使用参数:

如果您的列是用户提供的,并且希望转义,请使用适当的转义函数。在这种情况下,它是:


如果该列不是用户提供的,则实际上不必转义它。

标识符不是字符串。
无法绑定标识符。
你必须把他们列入白名单


或者-更好-以正确的方式设计应用程序,完全不需要动态字段名。

@erenon:可能,但不一定。在某些用例中,用户提供列名比在代码中维护列列表更好。这很少见,但可能会发生。这是一个很好的观点,假设
$column
是用户提供的,但事实可能并非如此。无法用实际代码来判断。@netcoder事实并非如此。这个类应该是PDO和应用程序逻辑之间某种更具体的接口。只有
$rowid
是用户提供的,我正确地转义了它。@YourCommonSense我只使用这个应用程序来尝试一些东西,但是有这样一个通用方法有什么问题?@Gergő“正确转义”绑定变量有什么意义?如果我知道它的用途,我能告诉你有什么问题。@YourCommonSense“Escaping”是一个错误的词,
$rowid
由查询字符串提供,其有效性为整数。在这种情况下,我是否应该将参数传递给
execute()
?对于单个调用,使用
query()
exec()
是否更合理?最后,使用column作为参数的方法本身是一种糟糕的做法吗?或者简单地说,我应该注意什么?提前谢谢你!
$this->db->prepare('SELECT '.$column.' FROM tbl WHERE rowid=?');
$column = SQLite3::escapeString($column);
$this->db->prepare('SELECT '.$column.' FROM tbl WHERE rowid=?');