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

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

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

$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL"); 

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

Вы можете сделать несколько вызовов в 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 имеет доступ к обеим базам данных и они находятся на одном и том же хосте (т.е. обе базы данных доступны из одного и того же соединения), вы можете:

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

Также, пожалуйста, прочитайте ответ troelskn, потому что это лучший подход, если вы можете использовать PDO, а не старые расширения.

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

Вы подключаетесь через PDO, например:

 try { $db = new PDO('mysql:dbname=databasename;host=127.0.0.1', 'username', 'password'); } catch (PDOException $ex) { echo 'Connection failed: ' . $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 'Connection failed: ' . $ex->getMessage(); } 

Я просто сделал свою жизнь простой:

 CREATE VIEW another_table AS SELECT * FROM another_database.another_table; 

надеюсь, что это полезно … ура …

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

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

 $Db1 = new mysqli($hostname,$username,$password,$db_name1); // this is connection 1 for DB 1 $Db2 = new mysqli($hostname,$username,$password,$db_name2); // this is connection 2 for DB 2 

Попробуйте под кодом:

  $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); 

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

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

 $con = new PDO('mysql:host=localhost', $username, $password, array(PDO::ATTR_PERSISTENT => true)); 

Обратите внимание на отсутствие dbname= в аргументах построения.

Когда вы подключаетесь к MySQL через терминал или другой инструмент, имя базы данных не требуется с места в карьер. Вы можете переключаться между базами данных с помощью оператора USE dbname помощью метода PDO::exec() .

 $con->exec("USE someDatabase"); $con->exec("USE anotherDatabase"); 

Конечно, вы можете обернуть это в заявлении try try.

 $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 разных пользователя для двух баз данных, и он будет работать.

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

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

Например:

 $Db1 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 1st database connection $Db2 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 2nd database connection 

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

 $query = $Db1->query("select * from tablename") $query2 = $Db2->query("select * from tablename") die("$Db1->error"); 

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

если вы используете mysqli и имеете два файла db_connection. как первый

 define('HOST','localhost'); define('USER','user'); define('PASS','passs'); define('**DB1**','database_name1'); $connMitra = new mysqli(HOST, USER, PASS, **DB1**); 

второй –

  define('HOST','localhost'); define('USER','user'); define('PASS','passs'); define(**'DB2**','database_name1'); $connMitra = new mysqli(HOST, USER, PASS, **DB2**); 

SO просто измените имя параметра pass в mysqli, как DB1 и DB2. если вы передаете тот же параметр в mysqli, предположите, что DB1 в обоих файлах, то вторая база данных больше не будет подключаться. Поэтому помните, когда вы используете два или более соединения, пропустите другое имя параметра в функции mysqli

Вам действительно не нужно select_db . Вы можете отправить запрос в две базы данных одновременно. Во-первых, дайте грант DB1 для выбора из DB2 по GRANT select ON DB2.* TO DB1@localhost; , Затем, FLUSH PRIVILEGES; , Наконец, вы можете выполнять «запрос с несколькими базами данных», например SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2 и т. Д. (Не забывайте, что вам нужен «root» доступ к использованию команды grant)