为了账号安全,请及时绑定邮箱和手机立即绑定

PHP PDO-绑定表名称?

/ 猿问

PHP PDO-绑定表名称?

PHP
慕标琳琳 2019-10-21 15:50:16

可以绑定表名称吗?


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


查看完整描述

3 回答

?
慕田峪7331174

可以绑定表名称吗?


没有。


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


而且,您还必须手动设置标识符的格式。有一个带示例的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;

    }

}

但是,此类类很少能按预期使用-总是有很多例外情况和手动格式化才能使其可用。


查看完整回答
反对 回复 2019-10-21
?
慕斯王

在http://www.phpclasses.org/package/5997-PHP-Database-access-abstraction-layer.html上有一个PDO包装器类,可让您执行此操作(尽管我是PDO的新手,所以也许不使用PDO准备好的声明)


他的建议用法是:


 $db = new DatabaseConnection('someMysqlServer', 'user', 'pass', 'database');


 $result = $db->exec($db->filterForSql('SELECT * FROM '.$tableName.';'));

我想知道是否其他人认为这是使用PDO的“安全”方法。


查看完整回答
反对 回复 2019-10-21
?
眼眸繁星

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

查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信