PHP: 連接到 MySQL

學習如何使用 MySQLi 和 PDO 從 PHP 連接到 MySQL

👋 歡迎來到 Stackhero 文檔!

Stackhero 提供一個即用型的 PHP cloud 解決方案,帶來多種好處,包括:

  • 只需一個簡單的 git push,即可在幾秒鐘內 部署您的應用程式。
  • 使用您自己的域名,並享受 HTTPS 證書的自動配置,以增強安全性。
  • 享受自動備份一鍵更新,以及簡單、透明且可預測的定價,讓您高枕無憂。
  • 得益於專用的私人 VM,獲得最佳的性能和強大的安全性

節省時間簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 PHP cloud hosting 解決方案!

以下示例演示如何使用 MySQLi 以面向對象的風格將 PHP 連接到 MySQL。最佳做法是為您的應用程式創建專用的數據庫和用戶,而不是使用 'root' 帳戶。這種方法可以提高應用程式的安全性。

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$user = 'root';
$password = '<yourPassword>';
$database = 'root'; // 在生產環境中,請在 phpMyAdmin 中創建專用的數據庫和用戶

$mysqli = mysqli_init();
$mysqliConnected = $mysqli->real_connect($hostname, $user, $password, $database, NULL, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
  die('連接錯誤: ' . $mysqli->connect_error);
}

echo '連接成功... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>

如果您更喜歡程序化的方法,下面的示例顯示如何使用 MySQLi 以程序化風格建立連接。與往常一樣,建議使用專用的數據庫和受限用戶以增強安全性。

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$user = 'root';
$password = '<yourPassword>';
$database = 'root'; // 為了增強安全性,請在 phpMyAdmin 中創建專用的數據庫和用戶

$mysqli = mysqli_init();
$mysqliConnected = mysqli_real_connect($mysqli, $hostname, $user, $password, $database, NULL, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
  die('連接錯誤: ' . mysqli_connect_error($mysqli));
}

echo '成功: ' . mysqli_get_host_info($mysqli) . "\n";

mysqli_close($mysqli);

?>

PDO 提供了一種靈活的方法來將 PHP 連接到 MySQL。下面的示例說明如何使用 PDO 建立連接。它還解決了如果您的系統缺乏 CA 證書訪問權限可能出現的 SSL 證書問題。

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$user = 'root';
$password = '<yourPassword>';
$database = 'root'; // 對於生產環境,考慮創建專用的數據庫和用戶

$dsn = "mysql:host=$hostname;dbname=$database";

$options = array(
  // 如果您遇到類似 "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1..." 的錯誤,
  // 可能是因為 /etc/ssl/certs/ 目錄缺少 CA 證書
  PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
  // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
  PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
);

$pdo = new PDO($dsn, $user, $password, $options);

$stm = $pdo->query('SELECT VERSION()');
$version = $stm->fetch();

echo '您已連接到運行版本 ' . $version[0] . "\n" 的數據庫;

?>

如果您看到類似 Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed 的錯誤,可能是因為您的系統的 /etc/ssl/certs/ 目錄中沒有包含必要的 CA 證書。

如果您可以訪問運行 PHP 代碼的系統,您可以按以下方式安裝證書:

  1. Ubuntu/Debian 上,運行 sudo apt-get install ca-certificates
  2. Alpine Linux 上,運行 apk add ca-certificates

如果您無法直接訪問系統以安裝這些證書,您可以手動安裝證書:

  1. 將證書下載到您的電腦:https://letsencrypt.org/certs/isrgrootx1.pem
  2. isrgrootx1.pem 文件添加到您的 PHP 項目文件中。
  3. 註釋掉 PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. 取消註釋 PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

為了增強安全性和更容易的配置管理,建議您避免在源代碼中硬編碼憑證。相反,從環境變量中檢索這些設置,如下所示:

<?php

$hostname = getenv('STACKHERO_MYSQL_HOST');
$user = getenv('STACKHERO_MYSQL_USER');
$password = getenv('STACKHERO_MYSQL_PASSWORD');
$database = getenv('STACKHERO_MYSQL_USER'); // 按慣例,數據庫名稱與用戶名相同

?>

使用環境變量有助於保持憑證的安全性,並使您的配置更適應不同的環境。