首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 連接多個 MySQL 資料庫的實作指南

     編輯:PHP 綜合知識

前言

在開發 PHP 應用程式時,有時需要同時連接多個 MySQL 資料庫。例如:主資料庫儲存核心業務資料,而另一個資料庫專門處理日誌、快取或第三方整合資料。本文將示範如何在單一 PHP 腳本中建立多個資料庫連線,並分別執行查詢。

核心概念:連線識別子

PHP 的 MySQL 擴展(mysql_* 函式)透過「連線識別子」來區分不同的資料庫連線。每次呼叫 mysql_connect() 都會回傳一個唯一的資源識別子,後續的 mysql_select_db()、mysql_query() 等函式都需傳入該識別子,以指明操作對象。

完整程式碼範例

<?php
// 連線第一個資料庫(以 mysql 使用者身分)
$conn1 = mysql_connect('localhost', 'mysql', '') 
    or die('連線失敗:' . mysql_error());
echo "第一個連線識別子:$conn1 <br>\n";

mysql_select_db('test', $conn1) 
    or die('選擇資料庫失敗:' . mysql_error());
echo "已選擇 test 資料庫 <br>\n";

// 連線第二個資料庫(以 joyce 使用者身分)
$conn2 = mysql_connect('localhost', 'joyce', '') 
    or die('連線失敗:' . mysql_error());
echo "第二個連線識別子:$conn2 <br>\n";

mysql_select_db('techbizbookguide', $conn2) 
    or die('選擇資料庫失敗:' . mysql_error());
echo "已選擇 techbizbookguide 資料庫 <br>\n";

// 分別執行查詢
$query1 = "SELECT foo FROM test";
$query2 = "SELECT title, authorFirst, authorLast FROM bookinfo";

$result1 = mysql_query($query1, $conn1) or die(mysql_error());
$result2 = mysql_query($query2, $conn2) or die(mysql_error());

// 輸出第一個資料庫結果
echo "test 資料表的 foo 欄位:<br>\n";
while (list($foo) = mysql_fetch_row($result1)) {
    echo htmlspecialchars($foo) . "<br>\n";
}

// 輸出第二個資料庫結果
echo "bookinfo 資料表的書籍資訊:<br>\n";
while (list($title, $first, $last) = mysql_fetch_row($result2)) {
    // 使用 trim() 處理可能只有一個名字的作者(如 Madonna、Prince)
    $author = trim("$first $last");
    echo htmlspecialchars("$title by $author") . "<br>\n";
}
?>

關鍵點解析

1. 明確指定連線識別子

所有資料庫操作函式(mysql_select_db、mysql_query、mysql_fetch_row 等)的最後一個參數都應傳入對應的連線識別子($conn1 或 $conn2)。若省略,PHP 會使用最近一次開啟的連線,導致資料混淆。

2. 錯誤處理

範例使用 or die() 捕捉連線與查詢錯誤。實際專案建議改用例外處理或自訂錯誤記錄機制,避免直接輸出敏感資訊。

3. 資安提醒

  • 棄用警告:mysql_* 函式自 PHP 5.5 起棄用,PHP 7.0 移除。新專案請改用 MySQLi 或 PDO。
  • 憑證管理:不要將帳號密碼硬編碼在程式碼中,應存放於環境變數或設定檔(如 .env),並加入 .gitignore。
  • SQL 注入防護:實務上務必使用預備語句(Prepared Statements),而非字串拼接 SQL。

現代化寫法:使用 MySQLi 物件導向風格

<?php
// 連線第一個資料庫
$mysqli1 = new mysqli('localhost', 'mysql', '', 'test');
if ($mysqli1->connect_errno) {
    die("連線失敗:{$mysqli1->connect_error}");
}

// 連線第二個資料庫
$mysqli2 = new mysqli('localhost', 'joyce', '', 'techbizbookguide');
if ($mysqli2->connect_errno) {
    die("連線失敗:{$mysqli2->connect_error}");
}

// 使用預備語句查詢
$stmt1 = $mysqli1->prepare("SELECT foo FROM test");
$stmt1->execute();
$stmt1->bind_result($foo);
while ($stmt1->fetch()) {
    echo htmlspecialchars($foo) . "<br>\n";
}
$stmt1->close();

$stmt2 = $mysqli2->prepare("SELECT title, authorFirst, authorLast FROM bookinfo");
$stmt2->execute();
$stmt2->bind_result($title, $first, $last);
while ($stmt2->fetch()) {
    $author = trim("$first $last");
    echo htmlspecialchars("$title by $author") . "<br>\n";
}
$stmt2->close();

$mysqli1->close();
$mysqli2->close();
?>

總結

在單一 PHP 腳本中操作多個 MySQL 資料庫的關鍵在於:為每個連線保存獨立的識別子,並在每次資料庫操作時明確指定該識別子。雖然舊式 mysql_* 函式已淘汰,但其核心概念(連線物件/識別子的隔離)在 MySQLi 和 PDO 中依然適用。採用現代擴展並搭配預備語句,才能建構安全、可維護的應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved