1

我有一个类似的类,有很多方法,但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()作品。这里有什么问题?

4

2 回答 2

2

bindParam用于绑定参数,而不是标识符。您在那里绑定的值将扩展为:

SELECT 'some_value' FROM tbl WHERE rowid='some_other_value';

...因此相当于:

SELECT 'some_value';

您应该只将参数用于实际参数

$this->db->prepare('SELECT '.$column.' FROM tbl WHERE rowid=?');

如果您的列是用户提供的并且您想要转义它,请使用正确的转义函数。在这种情况下,它是SQLite3::escapeString()

$column = SQLite3::escapeString($column);
$this->db->prepare('SELECT '.$column.' FROM tbl WHERE rowid=?');

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

于 2012-04-04T17:35:18.513 回答
0

标识符不是字符串。
你不能绑定标识符。
您必须将它们列入白名单。

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

于 2012-04-04T17:38:02.270 回答