PHP: MySQLへの接続

MySQLiとPDOを使用してPHPからMySQLに接続する方法を学びます

👋 Stackheroのドキュメントへようこそ!

Stackheroは、数多くの利点を提供する使いやすいPHPクラウドソリューションを提供しています。

  • 簡単なgit pushでアプリケーションを数秒でデプロイ
  • 独自のドメイン名を使用し、HTTPS証明書の自動設定による強化されたセキュリティを享受。
  • 自動バックアップワンクリックアップデート、そしてシンプルで透明性のある予測可能な価格設定で安心を提供。
  • プライベートで専用のVMによる最適なパフォーマンスと強固なセキュリティを実現。

時間を節約し、生活を簡素化:StackheroのPHPクラウドホスティングソリューションを試すのに5分しかかかりません

以下の例は、オブジェクト指向スタイルで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'); // 慣例として、データベース名はユーザー名と一致します

?>

環境変数を使用することで、資格情報のセキュリティを維持し、異なる環境での設定をより適応可能にします。