2016-03-04 76 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在这种情况下,我会建议创建一种方法来在使用'