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


How to create database dynamically on server?

我正在做一个项目,当用户输入信息并单击"添加学校"时,应该在服务器上创建一个具有学校名称的新数据库。

我试过这样的东西-

<?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"的选项)

有办法做到这一点吗?

老实说,我投票决定关闭,因为你这样做只会带来灾难。你不可能为每一所学校创建一个新的数据库。真正不应该做的是使用不推荐使用的扩展。你问的问题也很相似:"嘿,我把被定罪的恋童癖者送到托儿所工作,但有人抱怨……我该如何处理他们?"。唯一正确的答案是而不是做你正在做的事情。

对于启动:你假设人们会很好地在表格中输入一个有效的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".当然,这不能作为DB名称!

你应该做的是有一个简单的表,称为学校,看起来像这样:

+----------+----------+
|    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表中删除即可,而且由于一些巧妙放置的外键,您可以设置您的表,这样,链接回该学校的其他表中的所有记录都会被删除或更新(软删除)。

快速搜索"Relational design mysql",我来到这里,我还没有通读过,但图表确实显示了关系设计的意义:更多的表,包含更少的数据,但具有适当的索引和键