簡體   English   中英

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

[英]PHP `Create Table` is including quote marks in the table name

我遇到了一個奇怪的問題,即創建表會將反引號添加到數據庫中的表名中。

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的原因是它將由 web 爬蟲動態完成,我正在尋找常見的文件和目錄名稱,並且由於大量路徑可收集,我決定在一張桌子上對於每個站點及其從其主機名生成的名稱。 (可能的狡猾主機名示例: https://whe.re/

但這導致了這一點。

在此處輸入圖像描述

所以我在沒有它們的情況下嘗試過,它會引發錯誤

“您的 SQL 語法有錯誤;請查看與您的 MariaDB 服務器版本相對應的手冊,了解在 ''random_site' 附近使用的正確語法

我沒有看到或想到什么,自從我使用 PHP 以來已經有一段時間了,我很茫然,因為我的所有搜索都讓我明白為什么在進行不屬於我的查詢時表名應該用反引號括起來問題。

謝謝

信息:MariaDB
PHP:7.4.6

那是因為你正在綁定一個字符串值,所以它被注入了周圍的單引號。 但最重要的是,您不能在查詢中將表名作為參數傳遞。 綁定機制旨在傳遞文字值,而表名顯然不是。

在這種特定情況下,除了字符串連接之外,您別無選擇:

$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 {
    ... 
}

這意味着您需要在將變量傳遞給查詢之前在應用程序端徹底驗證變量,這不是一件容易的事。

這最終提出了一個問題,即為什么每個站點都有一個單獨的表。 我不推薦這種設計,它違反了基本的規范化規則,並且很快就會變成維護的噩夢。 相反,您應該有一個列出站點的引用表和一個包含所有路徑的表,其中包含一個引用站點表的外鍵列。 使用適當的模式和索引,您不太可能遇到性能問題,除非您有數以億計的行(在這種情況下,其他選項可用,例如邏輯分區)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM