【初心者向け】PHPでデータベース接続エラー「mysql_connect(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in」を解決する3つのステップ

2024-04-02

PHPで「mysql_connect(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in」エラーが発生した場合の対処方法

このエラーは、PHPスクリプトがMySQLデータベースに接続しようとした際に、ソケットファイル /tmp/mysql.sock が存在しない、またはアクセス権限がないために発生します。

原因

以下の原因が考えられます。

  • MySQLサーバーが起動していない
  • ソケットファイル /tmp/mysql.sock が存在しない
  • PHPスクリプトの設定に誤りがある

解決方法

以下の方法で解決できます。

# systemctl status mysql

上記のコマンドを実行し、MySQLサーバーが起動していることを確認します。

ソケットファイルの存在確認

# ls -l /tmp/mysql.sock

上記のコマンドを実行し、ソケットファイル /tmp/mysql.sock が存在することを確認します。

# ls -l /tmp/mysql.sock

以下の項目を確認します。

  • データベース接続用のホスト名またはIPアドレス
  • データベース名
  • ユーザー名
  • パスワード

これらの設定が誤っていると、接続エラーが発生します。

  • 使用しているOS
  • 使用しているMySQLのバージョン

補足

このエラーは、MySQL 5.7 以降で廃止された mysql_connect() 関数を使用している場合に発生します。新しいコードでは、mysqli_connect() または PDO などの接続方法を使用することを推奨します。




<?php

// データベース接続情報
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = 'password';

// データベース接続
$mysqli = new mysqli($host, $username, $password, $dbname);

//接続エラーチェック
if ($mysqli->connect_errno) {
  echo 'データベース接続エラー: ' . $mysqli->connect_error;
  exit;
}

// クエリ実行
$sql = 'SELECT * FROM users';
$result = $mysqli->query($sql);

// 結果処理
while ($row = $result->fetch_assoc()) {
  echo $row['id'] . ' ' . $row['name'] . '<br>';
}

// データベース接続解除
$mysqli->close();

?>

ポイント

  • データベース接続情報は、ご自身の環境に合わせて変更してください。
  • クエリ実行と結果処理は、目的に合わせて変更してください。



その他の接続方法

PDOは、PHP Data Objectsの略で、データベースにアクセスするための統一されたインターフェースを提供します。PDOは、MySQLだけでなく、様々なデータベースに対応しています。

<?php

// データベース接続情報
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = 'password';

// データベース接続
$pdo = new PDO('mysql:host=' . $host . ';dbname=' . $dbname, $username, $password);

// クエリ実行
$sql = 'SELECT * FROM users';
$stmt = $pdo->query($sql);

// 結果処理
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  echo $row['id'] . ' ' . $row['name'] . '<br>';
}

// データベース接続解除
$pdo = null;

?>

mysqlndは、MySQL用のネイティブドライバーです。mysqliよりも高速で、より多くの機能を提供します。

<?php

// データベース接続情報
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = 'password';

// データベース接続
$conn = mysqlnd_connect($host, $username, $password, $dbname);

// クエリ実行
$sql = 'SELECT * FROM users';
$result = mysqlnd_query($conn, $sql);

// 結果処理
while ($row = mysqlnd_fetch_assoc($result)) {
  echo $row['id'] . ' ' . $row['name'] . '<br>';
}

// データベース接続解除
mysqlnd_close($conn);

?>

その他のライブラリ

上記以外にも、様々なライブラリを使ってMySQLデータベースに接続できます。

  • Doctrine ORM
  • Laravel Eloquent
  • CakePHP ORM

これらのライブラリは、オブジェクト指向のインターフェースを提供し、データベース操作をより簡単に記述できます。

MySQLデータベースに接続するには、様々な方法があります。それぞれの方法にはメリットとデメリットがあるので、ご自身の環境や目的に合わせて最適な方法を選択してください。


php mysql database


サンプルコードから学ぶSQL Server接続文字列のタイムアウト設定

SQL Serverへの接続文字列でタイムアウトを設定しても、意図通りに動作しない場合があります。この問題は、接続の確立とデータの読み込み/書き込みという2つの異なるフェーズにタイムアウトが適用されることが原因です。タイムアウトの種類接続タイムアウト: サーバーへの接続確立に許される時間。...


スタースキーマ設計の代替方法: スノーフレークスキーマ、ファクトコンソリデーションスキーマ、マルチディメンショナルキューブ

スタースキーマ設計は、以下の要素で構成されます。ファクトテーブル: 事実に関するデータを格納します。各行は、特定のイベントやトランザクションを表します。ディメンションテーブル: ファクトテーブルの属性を定義するデータを格納します。各行は、属性値とその説明を表します。...


CREATE TABLEステートメントを使用して既存のMySQLテーブルに自動インクリメントプライマリキーを追加する方法

MySQLで既存のテーブルに自動インクリメントのプライマリキー列を追加するには、以下の2つの方法があります。方法1:ALTER TABLEステートメントを使用するALTER TABLEステートメントを使用して、既存のテーブルに新しい列を追加します。この列には、データ型をINTまたはBIGINT、およびAUTO_INCREMENT属性を指定する必要があります。...


Visual Studio 2015でMySQL操作時のエラー「mysql_init() always return null」を解決

原因:MySQL ライブラリが正しくインストールされていない: Visual Studio 2015 では、MySQL Connector/C++ ライブラリを別途インストールする必要があります。ライブラリのパスが間違っている: Visual Studio 2015 では、プロジェクトのプロパティで MySQL ライブラリのパスを正しく設定する必要があります。...