PHP的PDO – 绑定表名称?

是否可以绑定一个表名?

我想创build一个类来读取表中的列,并根据字段types为我生成表单input。 当我做$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和我的表名称。

是否可以绑定一个表名?

没有。

您必须将表格名称列入白名单。 我怀疑你想让用户浏览你的数据库中的任何表。

而且你也必须手动格式化标识符。 有一个标签wiki的例子。 为什么不先读它?

更新:正如你所看到的,PDO原来是不方便的现实生活中的任务。 所以,你必须有一个更智能的抽象库来处理MySQL查询。 这是一个使用safeMysql类的例子,它将使你的代码大大缩短:

 class form{ public function __construct($table){ global $db; return $db->getAll("DESCRIBE ?n", $table); } } 

2笔记:

  • 我已经删除了第二个参数,因为你的函数中没有使用它的代码。
  • 永远不要在课堂上连接。 改用已经打开的连接。 或者你会杀死你的MySQL服务器有这么多的连接。

排除实施的版本

 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; } } 

然而,这样的类很less可以按照预期使用 – 总是有很多例外和手动格式化来使其可用。

有一个PDO包装类在 – http://www.phpclasses.org/package/5997-PHP-Database-access-abstraction-layer.html ,让你这样做(虽然我是PDO的新手,所以也许它不使用预备报表)

他build议的用法是:

  $db = new DatabaseConnection('someMysqlServer', 'user', 'pass', 'database'); $result = $db->exec($db->filterForSql('SELECT * FROM '.$tableName.';')); 

如果其他人认为这是使用PDO的“安全”方式,我会感兴趣。