Переключение баз данных в PHP

0

Я новичок в 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" ), и пароль будет таким же, как и их соленый и хешированный пароль. То есть каждый пользователь будет иметь свою собственную базу данных с сгенерированным именем пользователя и паролем, соответствующим их соленному + хешированному паролю.

В этом случае, если мой второй файл PHP имел другую функцию для доступа к базе данных, как бы я мог убедиться, что он будет использовать определение новой базы данных, а не определение базы данных из login.php?

Что сохраняется в памяти между одним вызовом функций в этом файле PHP и следующим вызовом и может ли это различать пользователей? Если мне нужно поместить часть этой информации в сеанс, чтобы я мог загрузить соответствующую базу данных при следующем вызове, каково было бы минимальное количество информации, чтобы я мог это сделать, без ущерба для безопасности приложения (то есть, Я, очевидно, не хочу вводить пароль в сеанс)?

Есть ли лучший способ сделать это (я уверен, что есть, но может кто-нибудь объяснить это мне или указать мне в правильном направлении)?

  • 4
    С какой стати вы хотите использовать разные БД для каждого пользователя?
  • 0
    Дубликат: stackoverflow.com/questions/1580540/max-tables-design-pattern
Показать ещё 6 комментариев
Теги:

1 ответ

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. Даже при использовании постоянных подключений возникает целый ряд проблем, таких как их устаревание, необходимость их повторного подключения и т.д.

Держите его простым.

Кроме того, хранение в сеансе является разумным подходом, но имейте в виду, что что-либо в сеансе читается другими сайтами в среде совместного размещения (хотя может быть сложно, но не невозможно, выяснить, к кому это относится).

  • 0
    Будет ли эта информация сохраняться между несколькими обращениями к этому файлу PHP? Или мне придется каждый раз передавать эти данные, чтобы различать пользователей?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню