我正在开展一个项目,当用户输入信息并点击“添加学校”时,应在服务器上创建一个名为school的新数据库。
我尝试过这样的事情 -
<?php
$con = mysql_connect('localhost', 'root', '') or die('Connection failed');
$query = "CREATE DATABASE `".$_POST['school_name']."`"; //'school_name' is fetched from form
if(mysql_query($query, $con))
echo "Database created successfully";
else
echo "Database creation failed";
?>
代码在本地计算机上的XAMPP服务器上正常工作。但是当我将它上传到服务器时,数据库创建总是失败。
注意:我在服务器上授予了用户的所有权限(但权限列表中没有选项,如'CREATE DATABASE')
有没有办法做到这一点?
答案 0 :(得分:4)
嗯,说实话,我投票结束了,因为你这样做的方式只是灾难的一个方法。你无法继续为每所学校创建一个新的数据库。您真正不应该做的是使用已弃用的扩展名。你问的问题也是类似的:“嘿,我已经把被定罪的恋童癖者送到托儿所工作,但是有抱怨......我怎么处理他们?”。唯一正确的答案是不做你正在做的事情。
开始时:你假设人们会很好地在表单中输入有效的DB名称...他们可以利用表单并输入类似的内容:
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,而是搞乱你的查询。然而,这假设用户知道注射。即使他们不这样做,是什么让你认为任何学校名称都是有效的DB名称?假设像“Numbskulls学院”这样的学校,或者非虚构的学校:“M.I.T”。当然,这不会作为数据库名称!
你应该做的是有一个名为 schools 的简单表格,如下所示:
+----------+----------+
| 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
表中删除,并且由于一些巧妙放置的外键,您可以设置表,以便其他表中的所有记录链接回该学校也会被删除或更新(软删除)。
快速google for “关系设计mysql”,给我带来here,我还没看过,但图表确实显示了关系设计的内容:更多表格,包含较少的数据,但具有适当的索引和键