如何在服务器上动态创建数据库?

时间:2013-08-21 10:37:11

标签: php mysql

我正在开展一个项目,当用户输入信息并点击“添加学校”时,应在服务器上创建一个名为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')

有没有办法做到这一点?

1 个答案:

答案 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,我还没看过,但图表确实显示了关系设计的内容:更多表格,包含较少的数据,但具有适当的索引和键