2013-08-21 44 views
2

我正在开发一个项目,当用户输入信息并点击“添加学校”时,应该在服务器上创建一个具有学校名称的新数据库。如何在服务器上动态创建数据库?

我试图像这 -

<?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服务器上的罚款。但是当我将它上传到服务器时,数据库创建总是失败。

注:我授予用户权限的所有服务器上(但有权限表,如“创建数据库”没办法)

有没有办法做到这一点?

+2

你最好为每所学校创建一个新的服务器! – zerkms

+0

您的代码易受SQL注入 – Chris

+3

学校应该以*表中的条目表示*而不是每个表中的全部新数据库。 – Quentin

回答

3

嗯,说实话,我投票结束了,因为你对此的看法只是一种灾难。你不能为每所学校创建一个新的数据库。 真的不应该做的是使用不推荐的扩展名。你问的是类似的:“嘿,我已经把定罪的恋童癖者在托儿所工作,但有投诉......我应该怎么处理他们?”。唯一正确的答案是而不是做你正在做的事情。

对于开球:你假设人们将很好地放在一个有效的数据库名称,格式为...他们可以利用的形式和输入类似:

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,我还没有读通过它,但图表确实表明什么关系设计是:更多的表,包含的数据较少,但适当的索引和钥匙

相关问题