2016-03-04 78 views
0

我正在開發一個工具,允許用戶更改數據庫連接。 所以用戶有一個選擇框,他選擇慾望數據庫。我總共有4個不同的數據庫,但結構是一樣的,只有數據發生了變化。訪問不同的數據庫,防止用戶錯誤PHP

如果用戶只使用1個打開的選項卡,我沒有任何問題。但是,如果用戶使用少量選項卡,則會出現很多安全問題。

例如: 選項卡1 - 用戶希望編輯從數據庫1 行的同時,用戶的變化TAB2數據庫3. 所以當他要保存選項卡1,可能它會保存到數據庫3 ,因爲這是最後的變化。

我將所選數據庫保存在$ _SESSION var。

我的代碼現在,我有一個用戶選擇數據庫的表單。並在_init.php我有一個簡單的開關情況下,需要一個不同的config.php取決於選定的數據庫。

一些想法,我可以如何防止這樣的錯誤發生?

+0

用戶教育是一種選擇嗎? 「在觸摸此設置之前關閉所有其他標籤。」如果沒有,那麼你將會有一場無盡的艱苦戰鬥。想象一下這種情況:Conn1在Tab1中打開,Tab2打開並切換到Conn2。數據在Tab1中更新,頁面刷新,因爲您沒有使用AJAX,因此用戶看不到他們所做的更改。 – MonkeyZeus

+0

這就是@MonkeyZeus的問題。但我們不能信任一個用戶:( – 62009030

回答

0

如果將活動連接存儲在$ _SESSION中,則無論您在瀏覽器中打開的選項卡數量是多少,都可以只有一個活動連接,因爲該會話是通過選項卡共享的。

相反,你可以給一個計數器或爲每個連接的數字標識符:

例子:

1 = connection 1 
2 = connection 2 
... 

如果用戶更改您的選擇框的連接,使用重定向一個發送GET參數與連接號碼。

例子:

  • 如果我選擇連接1將瀏覽器重定向到index.php CN = 1
  • 如果我使用連接2的另一個選項卡,將瀏覽器重定向我的index.php CN? = 2

您將需要始終通過GET或POST發送您的連接ID,並接收它而不是在$ _SESSION var中查找它。

希望它可以幫助

0

如果每個併發選項卡允許使用一個單獨的數據庫連接,然後每個併發選項卡將需要發佈請求到服務器時指定該信息。

這可能很簡單,只需將數據庫的標識符包含在每個表單的隱藏字段中即可。當用戶在該頁面上選擇其他數據庫時,請更新該隱藏字段。 (這裏主要猜測「隱藏域」的結構,因爲我們不知道你的表單是如何佈局的,但關鍵是表單應該包含這個值)。

這變成了一個整體更加REST風格的方法,從會話狀態轉移到由頁面本身驅動的狀態轉移。一般而言,這是件好事。

基本上,由於對正在執行的操作(保存記錄)的請求需要知道將其保存在哪裏,因此請求中包含該信息本身,而不是試圖在服務器端調整該信息。

+0

Hi @David。對於所有的標籤頁應該是同一個數據庫連接,但是如果用戶在一個標籤頁中更改,我只知道他在另一個標籤頁中更改了頁面後重新加載頁面。 。我們在這裏沒有任何API – 62009030

+0

@ 62009030:這聽起來像是你要在定義技術實現之前定義用戶體驗,如果用戶有兩個標籤打開並且在一個標籤中改變數據庫,什麼*應該*發生?(我不確定你的意思是關於一個API,這是怎麼相關的?) – David

+0

如果用戶更改數據庫在tab1上,我不能讓他保存任何東西在tab2(如果它有不同的數據庫連接) – 62009030

0

說實話,我會採取不同的方法來解決您的問題。

在您的服務器上設置指向同一個確切Web文件夾並具有硬編碼數據庫連接設置的子域。現在

 
db1.example.com 
db2.example.com 
db3.example.com 
db4.example.com 

用戶必須登錄到正確的子域名,以便執行所需的數據庫操作,以便session_start()實際上創建每個子域唯一的會話。

用戶將能夠打開4個選項卡,而不用擔心使用錯誤的數據庫。

所以你db_config.php文件可以是這樣的:

switch($sub_domain) 
{ 
    case 'db1.example.com': 
     // Code for connecting to DB1 
     break; 
    case 'db2.example.com': 
     // Code for connecting to DB2 
     break; 
    case 'db3.example.com': 
     // Code for connecting to DB3 
     break; 
    case 'db4.example.com': 
     // Code for connecting to DB4 
     break; 
} 

至於與選擇您的數據庫創建<select>盒的想法,你可以實現一些JS打開指向正確的子一個新標籤-域。

+0

Hi @MonkeyZeus。其實這是我們以前的做法。但現在人們想要改變它,讓所有人都在同一個域中,以更快地更改數據庫連接 – 62009030

+0

@ 62009030在這種情況下,我會建議創建一種方法來在使用'