php - 如何在单个网页上连接多个MySQL数据库?
我将信息分散在几个数据库中,并希望使用PHP将所有信息放到一个网页上。 我想知道如何连接到单个PHP网页上的多个数据库。
我知道如何使用以下方法连接到单个数据库:
$dbh = mysql_connect($hostname, $username, $password)
or die("Unable to connect to MySQL");
但是,我可以使用多个“mysql_connect”命令来打开其他数据库,如果我连接了多个数据库,那么PHP如何知道我希望从中获取信息的数据库。
JoshFinnie asked 2019-04-09T05:23:13Z
11个解决方案
320 votes
您可以多次调用SELECT * FROM database2.tablename,但如果参数相同,则需要为'$new_link'(第四个)参数传递true,否则将重用相同的连接。 例如:
$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);
如果您没有传递链接标识符,则使用最后创建的连接(在本例中为SELECT * FROM database2.tablename表示的连接),例如:
mysql_query('select * from tablename');
其他选择
如果MySQL用户可以访问两个数据库并且它们位于同一主机上(即两个数据库都可以从同一个连接访问),您可以:
保持一个连接打开,并根据需要调用SELECT * FROM database2.tablename进行交换。 我不确定这是一个干净的解决方案,你最终可能会查询错误的数据库。
在查询中引用表时指定数据库名称(例如SELECT * FROM database2.tablename)。 实施这可能是一种痛苦。
另请阅读troelskn的答案,因为如果您能够使用PDO而不是旧的扩展,这是一种更好的方法。
Tom Haigh answered 2019-04-09T05:24:17Z
92 votes
如果您使用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();
}
(当然替换上面的databasename,用户名和密码)
然后,您可以像这样查询数据库:
$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();
}
troelskn answered 2019-04-09T05:25:45Z
8 votes
我让我的生活变得简单:
CREATE VIEW another_table AS SELECT * FROM another_database.another_table;
希望它有用...欢呼......
Ihsan Kusasi answered 2019-04-09T05:26:25Z
6 votes
而不是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
kaushik answered 2019-04-09T05:27:01Z
4 votes
试试以下代码:
$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);
Paks answered 2019-04-09T05:27:34Z
3 votes
除非您确实需要使用多个PDO对象实例,否则请考虑以下事项:
$con = new PDO('mysql:host=localhost', $username, $password,
array(PDO::ATTR_PERSISTENT => true));
请注意构造参数中缺少USE dbname。
当您通过终端或其他工具连接到MySQL时,不需要数据库名称。 您可以通过PDO::exec()方法使用USE dbname语句在数据库之间切换。
$con->exec("USE someDatabase");
$con->exec("USE anotherDatabase");
当然,您可能希望将其包装在catch try语句中。
Michael Ratcliffe answered 2019-04-09T05:28:37Z
2 votes
您可以使用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将对您有所帮助。
user3857891 answered 2019-04-09T05:29:44Z
2 votes
$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个数据库创建2个不同的用户,它将起作用。
Lazy Fellow answered 2019-04-09T05:30:14Z
2 votes
您实际上并不需要select_db.您可以同时向两个数据库发送查询。 首先,授予DB1以从GRANT select ON DB2.* TO DB1@localhost;选择DB2。然后,FLUSH PRIVILEGES;。最后,您可以进行“多数据库查询”,如SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2等。(不要忘记您需要'root'访问权限才能使用grant 命令)
Nagibaba answered 2019-04-09T05:30:54Z
1 votes
如果你使用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**);
所以只需更改mysqli中的参数传递名称,如DB1和DB2。 如果你在mysqli中传递相同的参数,假设两个文件中的DB1,则第二个数据库将不再连接。 所以请记住,在mysqli函数中使用两个或多个连接传递不同的参数名称时
lotus weaver answered 2019-04-09T05:31:41Z
-1 votes
我在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 ("");
}
Log::info('user saved');
}
}
这是我的示例代码
Balaji Rajendran answered 2019-04-09T05:32:33Z