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

PHP `Create Table` 在表名中包含引号

PHP `Create Table` 在表名中包含引号

PHP
qq_遁去的一_1 2023-05-26 15:34:09
我有一个奇怪的问题,即创建表会将反引号添加到数据库中的表名。public function create_table($name){    $sql = "        CREATE TABLE IF NOT EXISTS `?` (          id int(11) NOT NULL AUTO_INCREMENT,          url varchar(255) NOT NULL,          resolved tinyint(1) NOT NULL,          PRIMARY KEY (id)        )";    $query = $this->_pdo->prepare($sql);    $query->bindValue(1, $name);    if($query->execute())    {        print("Created");    }    else    {        var_dump($query->errorInfo());    }   }我这样做并绑定的原因是$name它将由我正在寻找通用文件和目录名称的网络爬虫动态完成,并且由于可收集的大量路径我决定为每个路径创建一个表站点及其名称从其主机名生成。(可能的狡猾主机名示例: https: //whe.re/)但这导致了这一点。所以我在没有它们的情况下尝试并抛出错误“您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本对应的手册,了解在‘‘random_site’附近使用的正确语法我没有看到或没有想到什么,自从我使用 PHP 以来已经有一段时间了,我很茫然,因为我所有的搜索都让我明白为什么在进行不是我的查询时,表名应该用反引号包围问题。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

那是因为你绑定了一个字符串值,所以它被注入了周围的单引号。但最重要的是,您不能在查询中将表名作为参数传递。绑定机制旨在传递文字值,而表名显然不是。


在这种特定情况下,除了字符串连接之外别无选择:


$sql = "

    CREATE TABLE IF NOT EXISTS `$name` (

      id int(11) NOT NULL AUTO_INCREMENT,

      url varchar(255) NOT NULL,

      resolved tinyint(1) NOT NULL,

      PRIMARY KEY (id)

    )";


$query = $this->_pdo->prepare($sql);

if ($query->execute()) { 

    ... 

} else {

    ... 

}

这意味着您需要在将变量传递给查询之前在应用程序端彻底验证变量,这不是一件容易的事。


这最终提出了一个问题,即为什么每个站点都有一个单独的表。我不推荐这种违反基本规范化规则的设计,并且会很快变成维护噩梦。相反,您应该有一个列出站点的引用表,以及一个用于所有路径的表,以及一个引用站点表的外键列。使用适当的架构和索引,您不太可能遇到性能问题,除非您有数以亿计的行(在这种情况下可以使用其他选项,例如逻辑分区)。


查看完整回答
反对 回复 2023-05-26
  • 1 回答
  • 0 关注
  • 125 浏览

添加回答

举报

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