我有一個奇怪的問題,即創建表會將反引號添加到數據庫中的表名。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 {
...
}
這意味著您需要在將變量傳遞給查詢之前在應用程序端徹底驗證變量,這不是一件容易的事。
這最終提出了一個問題,即為什么每個站點都有一個單獨的表。我不推薦這種違反基本規范化規則的設計,并且會很快變成維護噩夢。相反,您應該有一個列出站點的引用表,以及一個用于所有路徑的表,以及一個引用站點表的外鍵列。使用適當的架構和索引,您不太可能遇到性能問題,除非您有數以億計的行(在這種情況下可以使用其他選項,例如邏輯分區)。
- 1 回答
- 0 關注
- 153 瀏覽
添加回答
舉報
0/150
提交
取消