Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO-绑定表名?_Php_Pdo - Fatal编程技术网

PHP PDO-绑定表名?

PHP PDO-绑定表名?,php,pdo,Php,Pdo,可以绑定表名吗 我想创建一个类来读取表中的列,并根据字段类型为我生成表单输入。当我做$form=新表单(“用户”),构造函数应该从使用以下代码从表中获取字段名开始: class form{ public function __construct($table, $skip = array("id")){ $pdo = new PDO('mysql:host=localhost;dbname=site;',USER,PASS); $query = $pd

可以绑定表名吗

我想创建一个类来读取表中的列,并根据字段类型为我生成表单输入。当我做
$form=新表单(“用户”),构造函数应该从使用以下代码从表中获取字段名开始:

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);
    }
}
类形式{
公共函数构造($table,$skip=array(“id”)){
$pdo=newpdo('mysql:host=localhost;dbname=site;',USER,PASS);
$query=$pdo->prepare(“描述:表”);
$query->bindValue(':table',$table,PDO::PARAM_STR,strlen($table));
$query->execute();
而($field=$query->fetch(PDO::fetch_NUM)){
变量转储($field);
回声“

”; } 未结算(pdo); } }
当我在prepare语句中指定“users”而不是“:table”时,这很好,但是bind正在工作,我很确定这是因为它试图绑定一个表名。此外,这需要绑定,因为我希望能够通过
$\u GET
等传递表名

可以绑定表名吗

没有

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

您还必须手动设置标识符的格式。 有一个例子。为什么不先读呢

更新: 正如您所看到的,PDO对于实际任务来说是不方便的。 因此,您必须有一个更智能的抽象库来处理MySQL查询。 下面是一个使用该类的示例,它将使您的代码大大缩短:

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

然而,这样的类很少能按预期使用-总是有很多异常和手动格式化使其可用

在-中有一个PDO包装器类,允许您这样做(虽然我是PDO新手,所以可能它没有使用准备好的语句)

他建议的用法是:

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

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

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

在“PDO准备好的语句”部分的wiki中,为什么不能用表的参数替换SQL字符串?我不知道有标记wiki。那很方便。还有,为什么这样的课程会浪费时间呢?经过你所有的编辑,你的答案会更有意义。我将坚持使用一个简单的、无绑定的PDO查询,因为它将使用与您提到的类相同数量的语句,并生成一个全局PDO变量。此外,该类并不是为了让表单从开始到结束,它只是为了使用正确的输入类型为您创建输入和标签,使用正确的“for”s创建标签,使用maxlength等于数据库中字段的最大长度的输入,等等。就格式化而言,只要HTML保持简单,在CSS中,所有的格式都可以很容易地完成。@Mistermanchly如果需要的语句数量完全相同,那么您就不能格式化$table变量,从而允许注入。是的。“你不想让用户选择他们所看到的表”还有一个优点。如果我需要白名单表名,我不需要在比较之前清理变量,因为如果它与白名单表名不完全匹配,SQL查询将不会运行,因此不需要SQL清理。很抱歉在我之前的评论中跳过了这个小细节。任何类做类似于
filterForSql
的事情都是不可用的危险废物。该网站需要注册,所以,我无法更全面地审查它。我很惊讶你说它是无法使用的垃圾,而你还没有阅读源代码。很抱歉,关于这一点有很多相互矛盾的信息,我想看看“防弹PDO数据库类”——你有什么建议吗?你发布的函数本身就足以做出判断。一个SQL查询由许多不同的部分组成,不可能为它们创建一个通用的过滤器——对一个部分的过滤会破坏另一个部分,反之亦然。我有一个用于运行mysql查询的防弹类(虽然不是基于PDO的,但这并不重要)。你可以在我的个人资料中找到链接。我所知道的唯一一门真正的防弹课。谢谢你的课-看起来很有趣。我仍然不相信原来的海报要求不能实现。我已经在我的答案中添加了代码。