猿问

PHP PDO-绑定表名称?

可以绑定表名称吗?


我想创建一个类以从表中读取列,并根据字段类型为我生成表单输入。当我这样做时$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。


牛魔王的故事
浏览 316回答 3
3回答

米脂

可以绑定表名称吗?没有。您必须将表名称列入白名单。我怀疑您想让用户浏览数据库中的任何表。而且,您还必须手动设置标识符的格式。有一个带示例的Wiki。为什么不先阅读它?更新: 如您所见,PDO实用于现实生活中的任务。因此,您必须拥有一个更智能的抽象库来处理MySQL查询。这是一个使用safeMysql类的示例,它将大大缩短您的代码:class form{&nbsp; &nbsp; public function __construct($table){&nbsp; &nbsp; &nbsp; &nbsp; global $db;&nbsp; &nbsp; &nbsp; &nbsp; return $db->getAll("DESCRIBE ?n", $table);&nbsp; &nbsp; }}2个注意事项:我删除了第二个参数,因为您的函数中没有使用它的代码。切勿在课堂上联系。请改用已经打开的连接。否则,您将通过大量连接杀死MySQL服务器。排除实施版本class form {&nbsp; &nbsp; public function __construct($table,$skip = array("id")){&nbsp; &nbsp; &nbsp; &nbsp; global $db;&nbsp; &nbsp; &nbsp; &nbsp; $data = array();&nbsp; &nbsp; &nbsp; &nbsp; $res = $db->query("DESCRIBE ?n", $table);&nbsp; &nbsp; &nbsp; &nbsp; while($row = $db->fetch($res)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!in_array($row['Field'],$skip)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $data[] = $row;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return $data;&nbsp; &nbsp; }}但是,此类类很少能按预期使用-总是有很多例外情况和手动格式化才能使其可用。

波斯汪

完成所有修改后,您的答案就会变得更加有意义。我将坚持一个简单的,无绑定的PDO查询,因为它需要与您提到的类相同数量的语句,并创建一个全局pdo变量。同样,该类并非旨在使表单从头到尾完成,而只是旨在为您创建具有正确输入类型的输入和标签,具有正确“ for”的标签,最大长度等于数据库中字段的最大长度,等等。就格式化而言,只要保持HTML简单,所有格式化都可以在CSS中轻松完成。
随时随地看视频慕课网APP
我要回答