Как вы подключаетесь к нескольким базам данных MySQL на одной веб-странице?
У меня есть информация, распространяемая по нескольким базам данных, и вы хотите разместить всю информацию на одной веб-странице с помощью PHP. Мне было интересно, как я могу подключиться к нескольким базам данных на одной веб-странице PHP.
Я знаю, как подключиться к одной базе данных, используя:
$dbh = mysql_connect($hostname, $username, $password)
or die("Unable to connect to MySQL");
Однако могу ли я просто использовать несколько команд "mysql_connect", чтобы открыть другие базы данных, и как PHP узнает, в какую базу данных я хочу получить информацию, если у меня есть несколько подключенных баз данных.
Ответы
Ответ 1
Внимание: mysql_xx
функции устарели, так как PHP 5.5 и удалены, так как PHP 7.0 (см http://php.net/manual/intro.mysql.php), используйте mysqli_xx
функции или увидеть ответ ниже от @Troelskn
Вы можете сделать несколько вызовов 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()
одно соединение открытым и вызовите mysql_select_db()
для переключения между ними, если это необходимо. Я не уверен, что это чистое решение, и вы могли бы в конечном итоге запросить неправильную базу данных. - Укажите имя базы данных, когда вы ссылаетесь на таблицы в своих запросах (например,
SELECT * FROM database2.tablename
). Это, вероятно, будет проблемой для реализации.
Также, пожалуйста, прочитайте ответ troelskn, потому что это лучший подход, если вы можете использовать PDO, а не старые расширения.
Ответ 2
Если вы используете 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();
}
Ответ 3
Я просто сделал свою жизнь простой:
CREATE VIEW another_table AS SELECT * FROM another_database.another_table;
надеюсь, что это полезно... приветствия...
Ответ 4
Вместо 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
Ответ 5
Попробуйте ввести код:
$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);
Ответ 6
Вы также можете взглянуть на один из многих инструментов абстракции базы данных. Однако они, как правило, будут делать то же самое, что описано в томе, чтобы одновременно открывать несколько соединений.
Ответ 7
Если вам действительно нужно иметь более одного экземпляра объекта 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.
Ответ 8
$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 разных пользователя для двух баз данных, и он будет работать.
Ответ 9
Возможно, вы сможете использовать синтаксис 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 таким образом поможет вам.
Ответ 10
Вам действительно не нужно select_db
. Вы можете отправить запрос в две базы данных одновременно. Сначала дайте грант DB1
для выбора из DB2
на GRANT select ON DB2.* TO [email protected];
. Тогда FLUSH PRIVILEGES;
. Наконец, вы можете выполнять "запрос с несколькими базами данных", например, SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2
и т.д. (Не забывайте, что вам нужен "root" доступ к использованию команды grant)
Ответ 11
если вы используете 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
Ответ 12
<?php
// Sapan Mohanty
// Skype:sapan.mohannty
//***********************************
$oldData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
echo mysql_error();
$NewData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
echo mysql_error();
mysql_select_db('OLDDBNAME', $oldData );
mysql_select_db('NEWDBNAME', $NewData );
$getAllTablesName = "SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'";
$getAllTablesNameExe = mysql_query($getAllTablesName);
//echo mysql_error();
while ($dataTableName = mysql_fetch_object($getAllTablesNameExe)) {
$oldDataCount = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $oldData);
$oldDataCountResult = mysql_fetch_object($oldDataCount);
$newDataCount = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $NewData);
$newDataCountResult = mysql_fetch_object($newDataCount);
if ( $oldDataCountResult->noOfRecord != $newDataCountResult->noOfRecord ) {
echo "<br/><b>" . $dataTableName->table_name . "</b>";
echo " | Old: " . $oldDataCountResult->noOfRecord;
echo " | New: " . $newDataCountResult->noOfRecord;
if ($oldDataCountResult->noOfRecord < $newDataCountResult->noOfRecord) {
echo " | <font color='green'>*</font>";
} else {
echo " | <font color='red'>*</font>";
}
echo "<br/>----------------------------------------";
}
}
?>
Ответ 13
я сделал это в Laravel
ini_set('max_execution_time', 3600);
$old_users = DB::connection('mysql2')->table('user_master')->get();
foreach ($old_users as $old_user) {
if ($old_user->usr_phone != "0") {
$password = base64_decode($old_user->usr_pwd);
$password = Hash::make($password);
if ($old_user->device_type == "1") {
$device_type = "ios";
} else if ($old_user->device_type == "2") {
$device_type = "android";
} else {
$device_type = "web";
}
$user = new User;
$user->name = $old_user->usr_name;
$user->email = $old_user->usr_email;
$user->points_exp_date = "2018-08-02"; try {
$user->save();
} catch (\Exception $e) {
echo ("<script>console.log('duplicate entry in user: " . $user->name . "');</script>");
}
Log::info('user saved');
}
}
И это мой пример кода