3

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

我试过这样的东西-

<?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”这样的选项)

有没有办法做到这一点?

4

1 回答 1

4

好吧,老实说,我投票决定关闭,因为你这样做的方式只是灾难的根源。您不能继续为每所学校创建一个新数据库。您真正不应该做的是使用已弃用的扩展。你问的问题也很相似:“嘿,我已经让被定罪的恋童癖者在托儿所工作,但是有投诉......我应该如何处理他们?” . 唯一正确的答案是不要做你正在做的事情。

开始:您假设人们会很好地在表单中输入有效的数据库名称......他们可以利用该表单并输入如下内容:

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,但会弄乱您的查询。不过,这假设用户知道注射。即使他们不这样做,是什么让您认为任何学校名称都是有效的数据库名称?假设有一所学校,例如“麻木头颅研究所”,或者是非虚构的:“麻省理工学院”。当然,这不能用作数据库名称!

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

+----------+----------+
|    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”的快速谷歌,把我带到这里,我没有通读它,但图表确实显示了关系设计的内容:更多的表,包含更少的数据,但具有适当的索引和键

于 2013-08-21T11:03:11.660 回答