11

是否可以绑定表名?

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

当我在准备语句中指定“用户”而不是“:表”时,这工作得很好,但是绑定它正在工作,我很确定这是因为它试图绑定一个表名。此外,这需要绑定,因为我希望能够通过我的表名$_GET等等。

4

2 回答 2

9

是否可以绑定表名?

不。

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

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

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

于 2013-03-03T05:57:52.620 回答
2

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

于 2013-03-03T06:42:30.357 回答