PHP: 连接到 MySQL

学习如何使用 MySQLi 和 PDO 从 PHP 连接到 MySQL

👋 欢迎使用 Stackhero 文档!

Stackhero 提供了一种即用型 PHP 云 解决方案,具有众多优势,包括:

  • 通过简单的 git push 在几秒钟内 部署您的应用程序。
  • 使用您自己的域名,并享受 HTTPS 证书的自动配置以增强安全性。
  • 享受自动备份一键更新以及简单、透明和可预测的定价带来的安心。
  • 通过私有和专用的 VM获得最佳的性能和强大的安全性

节省时间简化您的生活:只需 5 分钟即可试用 Stackhero 的 PHP 云托管 解决方案!

以下示例演示如何使用 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'); // 按惯例,数据库名称与用户名相同

?>

使用环境变量有助于维护凭据的安全性,并使您的配置更易于适应不同的环境。