У меня есть информация, распространяемая по нескольким базам данных, и вы хотите разместить всю информацию на одной веб-странице с помощью 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)