亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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條經驗 獲得超14個贊

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


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


$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 關注
  • 153 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號