是否可以绑定表名?
我想创建一个类来读取表中的列,并根据字段类型为我生成表单输入。当我$form = new form("users");
时,构造函数应该从使用以下代码从表中获取字段名称开始:
class form{
public function __construct($table, $skip = array("id")){
$pdo = new PDO('mysql:host=localhost;dbname=site;',USER,PASS);
$query = $pdo->prepare("DESCRIBE :table");
$query->bindValue(':table', $table, PDO::PARAM_STR, strlen($table));
$query->execute();
while($field = $query->fetch(PDO::FETCH_NUM)){
var_dump($field);
echo "<br /><br />";
}
unset($pdo);
}
}
当我在prepare语句中指定“users”而不是“:table”时,这很好用,但绑定它正在工作,我很确定这是因为它试图绑定一个表名。此外,这需要绑定,因为我希望能够通过$_GET
传递我的表名。
答案 0 :(得分:9)
是否可以绑定表名?
没有
您必须将表名列入白名单。我怀疑您是否想让用户从您的数据库中浏览任何表。
您还必须手动格式化标识符。 有一个tag wiki示例。为什么不先读它?
<强>更新强> 正如您所看到的,PDO对于现实生活任务来说是不方便的。 因此,您必须拥有一个更智能的抽象库来处理MySQL查询。 以下是使用safeMysql类的示例,它将使您的代码显着缩短:
class form{
public function __construct($table){
global $db;
return $db->getAll("DESCRIBE ?n", $table);
}
}
2注:
排除已实施的版本
class form {
public function __construct($table,$skip = array("id")){
global $db;
$data = array();
$res = $db->query("DESCRIBE ?n", $table);
while($row = $db->fetch($res)) {
if (!in_array($row['Field'],$skip)) {
$data[] = $row;
}
}
return $data;
}
}
但是,这样的类很少能按预期使用 - 总是有很多例外和手动格式化以使其可用。
答案 1 :(得分:3)
有一个PDO包装器类 - http://www.phpclasses.org/package/5997-PHP-Database-access-abstraction-layer.html允许你这样做(虽然我是PDO的新手,所以也许它不是使用准备好的语句)
他的建议用法是:
$db = new DatabaseConnection('someMysqlServer', 'user', 'pass', 'database');
$result = $db->exec($db->filterForSql('SELECT * FROM '.$tableName.';'));
如果其他人认为这是使用PDO的“安全”方式,我会感兴趣。