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的“安全”方式,我会感兴趣。