你如何连接到一个网页上的多个MySQL数据库?
我有信息分布在几个数据库,并希望把所有的信息,使用PHP的一个网页。 我想知道如何连接到单个PHP网页上的多个数据库。
我知道如何使用以下方式连接到单个数据库:
$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
但是,我可以使用多个“mysql_connect”命令来打开其他数据库,如果我连接了多个数据库,PHP将如何知道从哪个数据库中提取信息。
您可以对mysql_connect()
进行多次调用,但是如果参数相同,则需要为“ $new_link
”(第四个)parameter passingtrue,否则将重用相同的连接。 例如:
$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);
如果你没有传递一个链接标识符,那么使用上一个创build的连接(在这个例子中是由$dbh2
表示的$dbh2
),例如:
mysql_query('select * from tablename');
其他选项
如果MySQL用户可以访问这两个数据库,并且他们在同一个主机上(即两个数据库都可以从同一个连接访问),那么您可以:
- 保持一个连接打开,并根据需要调用
mysql_select_db()
进行交换。 我不确定这是一个干净的解决scheme,你最终可能会查询错误的数据库。 - 在查询中引用表时指定数据库名称(例如,
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();
如果您需要一次打开多个连接,则可以简单地创build多个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提供了一次连接多个数据库的function。
$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=
。
当您通过terminal或其他工具连接到MySQL时,数据库名称不再需要。 您可以通过使用USE dbname
语句通过PDO::exec()
方法在数据库之间切换。
$con->exec("USE someDatabase"); $con->exec("USE anotherDatabase");
当然你可能想把这个包装在一个catch语句中。
$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);
这是我使用的最明显的解决scheme,但是请记住,如果两个数据库的用户名/密码在同一主机中完全相同,则此解决scheme将始终使用第一个连接。 所以不要混淆,这是不是在这种情况下工作。 你需要做的是,为2个数据库创build2个不同的用户,它将工作。
你可以使用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**);
所以只需要像DB1和DB2那样改变mysqli中parameter passing的名字。 如果你在mysqli中传入同样的参数,假设DB1在这两个文件中,那么第二个数据库将不再连接。 所以记得当你使用两个或更多的连接时,在mysqli函数中传递不同的参数名称
你实际上不需要select_db
。 您可以同时向两个数据库发送查询。 首先,授予DB1
通过GRANT select ON DB2.* TO DB1@localhost;
从DB2
GRANT select ON DB2.* TO DB1@localhost;
。 然后, FLUSH PRIVILEGES;
。 最后,您可以像SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2
等那样执行“多数据库查询”(不要忘记您需要“root”访问权限来使用grant命令)