2013-08-21 47 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,我還沒有讀通過它,但圖表確實表明什麼關係設計是:更多的表,包含的數據較少,但適當的索引和鑰匙

相關問題