我有一个类似于很多方法的类,但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()
的左半部分都有效。这有什么问题?
答案 0 :(得分: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=?');
如果该列不是用户提供的,则您实际上不必转义它。
答案 1 :(得分:0)
标识符不是字符串 你不能绑定标识符 你必须将它们列入白名单。
或 - 更好 - 以正确的方式设计您的应用程序,根本不需要动态字段名。