嗯,说实话,我投票结束了,因为你对此的看法只是一种灾难。你不能为每所学校创建一个新的数据库。 真的不应该做的是使用不推荐的扩展名。你问的是类似的:“嘿,我已经把定罪的恋童癖者在托儿所工作,但有投诉......我应该怎么处理他们?”。唯一正确的答案是而不是做你正在做的事情。
对于开球:你假设人们将很好地放在一个有效的数据库名称,格式为...他们可以利用的形式和输入类似:
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