嗯,說實話,我投票結束了,因爲你對此的看法只是一種災難。你不能爲每所學校創建一個新的數據庫。 真的不應該做的是使用不推薦的擴展名。你問的是類似的:「嘿,我已經把定罪的戀童癖者在託兒所工作,但有投訴......我應該怎麼處理他們?」。唯一正確的答案是而不是做你正在做的事情。
對於開球:你假設人們將很好地放在一個有效的數據庫名稱,格式爲...他們可以利用的形式和輸入類似:
tbl`(
id INT AUTO_INCREMENT PRIMARY KEY,
field_name1 VARCHAR(255) NOT NULL PRIMARY KEY, -- normal fields
field_name2 INTEGER(11) NOT NULL PRIMARY KEY,
field_name3 VARCHAR(255) NOT NULL DEFAULT '',
inserted TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated TIMESTAMP NOT NULL DEFAULT 0
ON UPDATE CURRENT_TIMESTAMP
)ENGINE = INNODB
CHARACTER SET utf8 COLLATE utf8_general_ci; --
這是有效的SQL ,而是弄亂你的查詢。不過,這假定用戶知道注射。即使他們不這樣做,是什麼讓你認爲任何學校名稱都是有效的數據庫名稱?假設像「麻醉研究所」或非虛構的學校:「M.I.T」。當然,這不會用作數據庫名稱!
你應該做的是有一個簡單的表,稱爲學校,看起來像這樣:
+----------+----------+
| id | name |
+----------+----------+
| 12 | foobar |
| 15 | M.I.T. |
+----------+----------+
現在每所學校都有自己獨特的ID,在所有其他表,如學生登錄,添加一個字段school_id
:
//tbl student_login
+--------------------+--------------------+--------------------+--------------------+
| id | school_id | login | passw |
+--------------------+--------------------+--------------------+--------------------+
| 1 | 12 | Bobby | hash |
| 2 | 15 | Bobby | hash |
+--------------------+--------------------+--------------------+--------------------+
現在每個學生的每條記錄都與正確的學校相關聯。更重要的是,你現在可以使用數據庫提供的所有好東西,比如外鍵,存儲過程,視圖以及你有什麼...讓表格成爲關係!
如果你想獲得所有學生的登錄信息foobar的學生:很簡單:
SELECT students.login FROM schools
LEFT JOIN studend_login AS students
ON schools.id = studends.school_id
WHERE schools.name = 'foobar';
您可以爲每個學校的視圖,這樣你就不必繼續寫同一加入過如果你真的想要...
如果學校應該關閉/不再需要你的服務,只需從schools
表中刪除它,並且由於巧妙地放置了外鍵,你可以設置你的表,其他表中鏈接到該學校的所有記錄都將被刪除或更新(軟刪除)。
快速谷歌爲「關係設計的mysql」,給我帶來了here,我還沒有讀通過它,但圖表確實表明什麼關係設計是:更多的表,包含的數據較少,但適當的索引和鑰匙
你最好爲每所學校創建一個新的服務器! – zerkms
您的代碼易受SQL注入 – Chris
學校應該以*表中的條目表示*而不是每個表中的全部新數據庫。 – Quentin