用PHP切换数据库

时间:2009-11-25 06:12:59

标签: php mysql

我是PHP的新手,所以最好通过对PHP基础知识的简要解释来回答这个问题,而不是解决我正在尝试做的事情(虽然这也很有用)。

我想根据用户为我的应用程序设置多个数据库。当用户登录时,它将针对DB-1对它们进行身份验证,并从那里检索哪个数据库将用于其他所有数据库。

我将login.php文件定义如下:

<?php
    $db_hostname = 'localhost';
    $db_database = 'testing';
    $db_username = 'someuser';
    $db_password = 'somepass';
?>

然后我有另一个PHP文件定义如下:

<%php
require_once 'login.php';

$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die ("Unable to connect to MySQL: " . mysql_error());

mysql_select_db($db_database)
    or die ("Unable to select database: " . mysql_error());

function check_login($user, $password) {
    $user = mysql_entities_fix_string($user);
    $password = mysql_entities_fix_string($password);
    $password = secure_password($password);
    $query = "SELECT DB_NAME, DB_USER FROM USERS WHERE USER_NAME='$user' AND PASSWORD='$password'";
    $result = mysql_query($query);
    if (!$result) 0; //no access to the database
    elseif (mysql_num_rows($result)) {
        $row = mysql_fetch_row($result);
        $db_database = $row[0];
        $db_username = $row[1];
        $db_password = $password;
        return 1; //login succeeded
    } else {
        return 2; //login failure
    }
}
?>

我想知道的是函数check_login()的结束。假设USERS表将返回数据库的名称(例如'db123522')和该数据库的用户名(例如'jsmith'),密码将与其salted和散列密码相同。也就是说,每个用户都有自己的数据库,生成的用户名和密码与盐渍+哈希密码相匹配。

在这种情况下,如果我的第二个PHP文件有另一个访问数据库的函数,我将如何确保它将使用新的数据库定义,而不是login.php中的数据库定义?

在对这个PHP文件中的函数的一次调用和下一次调用之间保留在内存中,这可以区分用户吗?如果我必须将一些这些信息放入会话中,以便我可以在下次调用时加载适当的数据库,那么让我这样做的最小信息量是多少,而不会影响应用程序的安全性(即,我显然不想在会话中输入密码)?

有没有更好的方法来做到这一点(我确信有,但有人可以向我解释或指出我正确的方向)?

1 个答案:

答案 0 :(得分:4)

如果要连接到多个数据库,请注意mysql_connect()返回该数据库的资源,该资源可用作mysql_select_db()mysql_query()等可选参数。

如果您未指定要使用的链接,则将使用最后打开的链接:

mysql_connect($hostname, $username, $password);
mysql_select_db($database);
...
mysql_connect($host2, $user2, $pass2);
mysql_select_db($db2); // uses the database just opened
mysql_query('SELECT * FROM sometable'); // also uses the second database

或更明确地说:

$res1 = mysql_connect($host1, $user1, $pass1);
$res2 = mysql_connect($host2, $user2, $pass2);
mysql_query('...', $res1); // use first database
mysql_query('...', $res2); // use second database

尽管如此,用户作为分区方案对于不同的数据库来说很少是个好主意。首先,大多数人倾向于严重高估其数据库的大小或性能要求或可能的使用或存储要求。其次,它可能会使您可能感兴趣的事情变得非常复杂,例如查找适合特定配置文件的所有用户(数据库)。现在,这将涉及连接到N个数据库,运行N个查询以及以某种方式聚合结果,而不仅仅是运行简单(甚至不那么简单)的SQL查询。

修改:如果您希望在请求之间保留连接,则可以使用mysql_pconnect()。在请求之间保留PHP中的任何内容(禁止存储到某些持久性介质,如会话或数据库)。但这实际上是PHP的美妙之处。即使使用持久连接也会涉及一系列新问题,例如它们过时,需要重新连接等等。

保持简单。

此外,在会话中存储是一种合理的方法,但要注意会话中的任何内容都可以被共享托管环境中的其他站点读取(尽管确定它属于谁可能很难,但并非不可能)