Web

Как подключиться к нескольким базам данных MySQL на одной веб-странице

У меня есть информация, распределенная по нескольким базам данных, и я хочу поместить всю информацию на одну веб-страницу с помощью PHP. Мне интересно, как я могу подключиться к нескольким базам данных на одной веб-странице PHP.

Я знаю, как подключиться к одной базе данных с помощью:

$dbh = mysql_connect($hostname, $username, $password) 

        or die("Не удалось подключиться к MySQL");

 

Однако могу ли я просто использовать несколько команд "mysql_connect" для открытия других баз данных, и как PHP узнает, из какой базы данных я хочу получить информацию, если у меня подключено несколько баз данных?

 

Ответ 1

Предупреждение: функции mysql_xx устарели с php 5.5 и удалены с php 7.0, поэтому используйте функции mysqli_xx. Вы можете сделать несколько вызовов mysql_connect(), но, если параметры одинаковы, вам нужно передать true для параметра '$new_link' (четвертый), иначе одно и то же соединение будет использоваться повторно. Например:

$dbh1 = mysql_connect($hostname, $username, $password); 

$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1);

mysql_select_db('database2', $dbh2);

Затем для запроса к базе данных 1 передается идентификатор первой ссылки:

mysql_query('select * from tablename', $dbh1);

И для базы данных 2 передайте вторую:

mysql_query('select * from tablename', $dbh2);

Если вы не передали идентификатор соединения, то будет использоваться последнее созданное соединение (в данном случае то, которое представлено $dbh2), например:

mysql_query('select * from tablename');

 

Другие варианты:

Если пользователь MySQL имеет доступ к обеим базам данных и они находятся на одном хосте (т. е. обе БД доступны из одного соединения), вы можете:

  1. Держать одно соединение открытым и вызывать mysql_select_db() для переключения между ними по мере необходимости. Я не уверен, что это чистое решение, и в итоге вы можете запросить не ту базу данных.

  2. Указывайте имя базы данных, когда ссылаетесь на таблицы в своих запросах (например, SELECT * FROM database2.tablename). Это, скорее всего, будет сложно реализовать.

 

 

Ответ 2

Если вы используете PHP5 (а вы должны это делать, учитывая, что PHP4 уже устарел), вам следует использовать PDO, поскольку он постепенно становится новым стандартом. Одним (очень) важным преимуществом PDO является то, что он поддерживает связанные параметры, что делает код намного более безопасным.

Вы будете подключаться через PDO следующим образом:

try {

  $db = new PDO('mysql:dbname=databasename;host=127.0.0.1', 'username', 'password');

} catch (PDOException $ex) {

  echo 'Ошибка подключения: ' . $ex->getMessage();

}

(Конечно, замените имя базы данных, имя пользователя и пароль).

Затем вы можете запросить базу данных следующим образом:

$result = $db->query("select * from tablename");

foreach ($result as $row) {

  echo $row['foo'] . "\n";

}

Или, если у вас есть переменные:

$stmt = $db->prepare("select * from tablename where id = :id");

$stmt->execute(array(':id' => 42));

$row = $stmt->fetch();

Если вам нужно открыть несколько соединений одновременно, вы можете просто создать несколько экземпляров PDO:

try {

  $db1 = new PDO('mysql:dbname=databas1;host=127.0.0.1', 'username', 'password');

  $db2 = new PDO('mysql:dbname=databas2;host=127.0.0.1', 'username', 'password');

} catch (PDOException $ex) {

  echo 'Ошибка соединения: ' . $ex->getMessage();

}

 

Ответ 3

Вместо mysql_connect используйте mysqli_connect.

mysqli предоставляет функциональность для подключения нескольких баз данных одновременно.

$Db1 = new mysqli($hostname,$username,$password,$db_name1); 

// это 1 соединение с БД

$Db2 = new mysqli($hostname,$username,$password,$db_name2); 

// это 2 соединение с БД

 

Ответ 4

Попробуйте использовать приведенный ниже код:

$conn = mysql_connect("hostname","username","password");

    mysql_select_db("db1",$conn);

    mysql_select_db("db2",$conn);

    $query1 = "SELECT * FROM db1.table";

    $query2 = "SELECT * FROM db2.table";

Вы можете получить данные вышеуказанного запроса из обеих баз данных следующим образом:

$rs = mysql_query($query1);

while($row = mysql_fetch_assoc($rs)) {

    $data1[] = $row;

}

$rs = mysql_query($query2);

while($row = mysql_fetch_assoc($rs)) {

    $data2[] = $row;

}

print_r($data1);

print_r($data2);

 

Ответ 5

$dbh1 = mysql_connect($hostname, $username, $password);  

$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1); 

mysql_select_db('database2',$dbh2); 

mysql_query('select * from tablename', $dbh1);

mysql_query('select * from tablename', $dbh2);

Это наиболее очевидное решение, которое я использую, но помните, что, если имя пользователя/пароль для обеих баз данных абсолютно одинаковы на одном и том же хосте, это решение всегда будет использовать первое соединение. Поэтому не паникуйте, что в таком случае решение не сработает. Что вам нужно сделать, так это создать 2 разных пользователя для двух баз данных, и все заработает.

 

Ответ 6

Возможно, вы сможете использовать синтаксис MySQLi, что позволит вам лучше справиться с этим. Определите подключения к базе данных, а затем, когда вы захотите сделать запрос к одной из баз данных, укажите нужное подключение.

$Db1 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 1-е подключение 

$Db2 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 2-е подключение

 

Затем, чтобы запросить их на одной странице, используйте что-то вроде этого:

$query = $Db1->query("select * from tablename")

$query2 = $Db2->query("select * from tablename")

die("$Db1->error");

 

Переход на MySQLi таким образом поможет вам. 

Схожие статьи

Web

Есть ли способ обновить расширение через composer и обойти ошибку ограничения памяти в Magento2

Web

Как распарсить и обработать HTML/XML в PHP?

Web

Почему Laravel удаляет данные связанной модели по user_id в загруженной функции модели User

Web

Как поместить информацию в контроллер Laravel 8