カテゴリ: PHP 更新日: 2025/09/16

初心者向けPHPでMySQLからデータを取得する方法(SELECT文)完全ガイド

PHP の MySQL からデータを取得する方法(SELECT 文)
PHP の MySQL からデータを取得する方法(SELECT 文)

新人と先輩の会話形式で理解しよう

新人

「PHPでMySQLからデータを取得したいんですけど、どうすればいいですか?」

先輩

「PHPでMySQLにアクセスするには、まずMySQLについて理解しておくといいですね。これから詳しく説明します。」

-

1. MySQLとは?(基本的な説明)

1. MySQLとは?(基本的な説明)
1. MySQLとは?(基本的な説明)

MySQLは、データベース管理システムの一つで、データを保存したり、検索したりするために使われます。基本的に、MySQLはテーブルと呼ばれる場所にデータを格納し、SELECT文を使って必要なデータを取り出します。

例えば、ブログの投稿情報やユーザーのデータなどを保存するためにMySQLを使います。MySQLは非常に高速で、安定して動作するので、世界中の多くのウェブアプリケーションで利用されています。

2. PHPでMySQLに接続する方法(mysqliとPDOの概要)

2. PHPでMySQLに接続する方法(mysqliとPDOの概要)
2. PHPでMySQLに接続する方法(mysqliとPDOの概要)

PHPでは、MySQLに接続するために主に2つの方法があります。ひとつはmysqli、もうひとつはPDOです。どちらもPHPからデータベースへ接続するために使いますが、少し使い方が異なります。

2.1 mysqliを使ってMySQLに接続する方法

mysqliは、PHPの拡張モジュールで、MySQLにアクセスするための機能を提供します。以下は、mysqliを使ってデータベースに接続し、データを取得するサンプルコードです。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// 接続を作成
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続を確認
if ($conn->connect_error) {
    die("接続失敗: " . $conn->connect_error);
}

// データを取得するSELECT文
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

// データが取得できたかチェック
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - 名前: " . $row["name"]. " - メール: " . $row["email"]. "<br>";
    }
} else {
    echo "0 件のデータが見つかりました";
}

// 接続を閉じる
$conn->close();
?>

2.2 PDOを使ってMySQLに接続する方法

PDOは、PHP Data Objectsの略で、データベースへの接続を抽象化する方法です。複数のデータベースに対応しているため、将来的にMySQL以外のデータベースを使う場合にも便利です。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    // PDOでMySQLへ接続
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // エラーモードを設定
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // データを取得するSELECT文
    $stmt = $conn->prepare("SELECT id, name, email FROM users");
    $stmt->execute();

    // 結果を出力
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage();
}

$conn = null;
?>

3. mysqliを使ったSELECT文の実行方法

3. mysqliを使ったSELECT文の実行方法
3. mysqliを使ったSELECT文の実行方法

ここでは、mysqliを使ってMySQLからデータを取得する方法を詳しく説明します。

mysqliには、2つの使い方があります。ひとつは手続き型、もうひとつはオブジェクト指向型です。どちらも同じようにデータベースとやり取りできますが、オブジェクト指向型の方がコードを整理しやすいです。

3.1 手続き型のSELECT文

手続き型のmysqliを使うと、以下のようにデータを取得できます。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// MySQLに接続
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 接続を確認
if (!$conn) {
    die("接続失敗: " . mysqli_connect_error());
}

// SQL文を実行
$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);

// データを取得して表示
if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} else {
    echo "0 件のデータが見つかりました";
}

// 接続を閉じる
mysqli_close($conn);
?>

3.2 オブジェクト指向型のSELECT文

オブジェクト指向型では、mysqliをクラスとして使い、より整理されたコードを書けます。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// MySQLに接続
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続を確認
if ($conn->connect_error) {
    die("接続失敗: " . $conn->connect_error);
}

// SQL文を実行
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

// データを取得して表示
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} else {
    echo "0 件のデータが見つかりました";
}

// 接続を閉じる
$conn->close();
?>

4. PDOを使ったSELECT文の実行方法

4. PDOを使ったSELECT文の実行方法
4. PDOを使ったSELECT文の実行方法

次に、PDOを使ってデータを取得する方法を説明します。PDOは、複数のデータベースに対応しており、より柔軟なコードを書くことができます。

4.1 PDOの基本的なSELECT文

PDOでは、prepareメソッドを使ってSQLを実行し、データを取得します。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    // PDOでMySQLに接続
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SQL文を準備して実行
    $stmt = $conn->prepare("SELECT id, name, email FROM users");
    $stmt->execute();

    // 結果を取得
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage();
}

// 接続を閉じる
$conn = null;
?>
-

5. mysqliとPDOの違い(どちらを選ぶべきか)

5. mysqliとPDOの違い(どちらを選ぶべきか)
5. mysqliとPDOの違い(どちらを選ぶべきか)

mysqliPDOには、それぞれの特徴があります。どちらを選ぶべきかは、プロジェクトの要件によって異なります。

5.1 mysqliの特徴

  • MySQL専用のライブラリなので、MySQLを使う場合は最適
  • 手続き型とオブジェクト指向型の両方が使える
  • コードがシンプルでわかりやすい

5.2 PDOの特徴

  • MySQLだけでなく、PostgreSQLやSQLiteなど他のデータベースにも対応
  • セキュアなプリペアドステートメントがデフォルトで使用可能
  • エラーハンドリングがしやすい

5.3 どちらを選ぶべきか?

もし、MySQLだけを使う場合はmysqliで十分です。しかし、将来的に他のデータベースを使う可能性がある場合は、PDOを使うのが良いでしょう。

6. MySQLのエラーハンドリング(SELECT文のエラー処理)

6. MySQLのエラーハンドリング(SELECT文のエラー処理)
6. MySQLのエラーハンドリング(SELECT文のエラー処理)

データベースを扱う際には、エラーハンドリングが重要です。エラーが発生した場合に適切な対応をしないと、プログラムが停止したり、ユーザーに正しい情報が表示されなかったりする可能性があります。

6.1 mysqliを使ったエラーハンドリング

mysqliを使う場合、エラーが発生したときにmysqli_error()を使ってエラーメッセージを取得できます。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// MySQLに接続
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続を確認
if ($conn->connect_error) {
    die("接続失敗: " . $conn->connect_error);
}

// SQL文を実行
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

// エラーがあるか確認
if (!$result) {
    die("クエリ実行エラー: " . $conn->error);
}

// データを取得して表示
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} else {
    echo "0 件のデータが見つかりました";
}

// 接続を閉じる
$conn->close();
?>

6.2 PDOを使ったエラーハンドリング

PDOを使う場合は、try-catch構文を利用してエラー処理を行います。エラーが発生すると、catchの中でエラーメッセージを取得できます。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    // PDOでMySQLに接続
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SQL文を準備して実行
    $stmt = $conn->prepare("SELECT id, name, email FROM users");
    $stmt->execute();

    // 結果を取得
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} catch (PDOException $e) {
    echo "クエリ実行エラー: " . $e->getMessage();
}

// 接続を閉じる
$conn = null;
?>

7. セキュリティ対策(SQLインジェクション対策)

7. セキュリティ対策(SQLインジェクション対策)
7. セキュリティ対策(SQLインジェクション対策)

データベースを扱うときに特に気をつけなければならないのがSQLインジェクションです。これは、悪意のあるユーザーがSQL文を不正に実行し、データを改ざんしたり盗み出したりする攻撃のことです。

7.1 SQLインジェクションの危険性

例えば、以下のように直接ユーザーからの入力をSQLに埋め込むと、悪意のあるコードを実行される可能性があります。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// ユーザーからの入力を取得
$user_input = $_GET['id'];

// SQLを直接組み立てる(危険なコード)
$sql = "SELECT * FROM users WHERE id = $user_input";

// 実行(危険!)
$conn = new mysqli($servername, $username, $password, $dbname);
$result = $conn->query($sql);
?>

上記のようにすると、ユーザーが1 OR 1=1のような入力をした場合、全てのデータが取得されてしまいます。

7.2 SQLインジェクションを防ぐ方法(プリペアドステートメント)

SQLインジェクションを防ぐには、プリペアドステートメントを使います。mysqliPDOの両方で対応できます。

mysqliのプリペアドステートメント


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// 接続
$conn = new mysqli($servername, $username, $password, $dbname);

// プリペアドステートメントの作成
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $_GET['id']);
$stmt->execute();
$result = $stmt->get_result();

// 結果を取得
while ($row = $result->fetch_assoc()) {
    echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
}

// 接続を閉じる
$stmt->close();
$conn->close();
?>

PDOのプリペアドステートメント


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // プリペアドステートメントを使う
    $stmt = $conn->prepare("SELECT * FROM users WHERE id = :id");
    $stmt->bindParam(":id", $_GET['id'], PDO::PARAM_INT);
    $stmt->execute();

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} catch (PDOException $e) {
    echo "エラー: " . $e->getMessage();
}

$conn = null;
?>

8. まとめとおすすめの使い方

8. まとめとおすすめの使い方
8. まとめとおすすめの使い方

今回は、PHPでMySQLからデータを取得する方法について学びました。

  • MySQLとは何か、基本的なデータ取得方法を学んだ
  • mysqliとPDOの違いを理解し、それぞれのメリットを比較した
  • エラーハンドリングの方法を学び、適切なエラー処理を実装する方法を学んだ
  • SQLインジェクション対策として、プリペアドステートメントを使う方法を学んだ

これで、PHPで安全にMySQLのデータを取得できるようになりました。次のステップとして、データの追加・更新・削除の方法も学んでみましょう。

まとめ

まとめ
まとめ

今回はPHPとMySQLを組み合わせて、データベースから情報を安全かつ正確に取得する方法について詳しく学びました。まず、MySQLとは何かという基本から始まり、mysqliPDOのそれぞれの接続方法やSELECT文の書き方、実際のコード例を通してデータ取得の手順を理解しました。さらに、SQLインジェクションといったセキュリティ上の脅威に対してどのように対策を行うべきか、プリペアドステートメントを用いた安全な実装方法も確認しました。

mysqliはMySQL専用で扱いやすく、手続き型とオブジェクト指向型の両方に対応しているため、初学者にもおすすめです。一方でPDOは複数のデータベースに対応し、今後の拡張性や汎用性を重視する場合に非常に有効です。

また、エラーハンドリングの観点でも、mysqliPDOでは手法が異なりますが、どちらも適切な例外処理を用いることで、ユーザーにとって信頼性の高いシステムを構築できます。たとえばmysqli_error()try-catch構文を用いることで、想定外の問題にも柔軟に対応できるようになります。

最後に、セキュリティ対策としてプリペアドステートメントを使うことの重要性を強調しました。以下は、改めて確認しておきたい安全なSQL実行のサンプルコードです。


<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $conn->prepare("SELECT * FROM users WHERE id = :id");
    $stmt->bindParam(":id", $_GET['id'], PDO::PARAM_INT);
    $stmt->execute();

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "id: " . $row["id"] . " - 名前: " . $row["name"] . " - メール: " . $row["email"] . "<br>";
    }
} catch (PDOException $e) {
    echo "エラー: " . $e->getMessage();
}

$conn = null;
?>

PHPとMySQLを使ったWebアプリケーション開発の第一歩として、今回の内容は非常に重要です。今後はINSERTやUPDATE、DELETEなど、他のSQL文も習得することで、より高度な開発が可能になります。まずはこの記事で学んだ内容を何度も実践し、PHPとMySQLの基礎をしっかりと身につけましょう。

先生と生徒の振り返り会話

新人

「PHPでMySQLに接続してデータを取り出す方法、かなり理解できました!mysqliPDOの違いも整理できました。」

先輩

「いいですね!特にプリペアドステートメントはセキュリティ面でも大切なので、今後の開発でもぜひ使ってください。」

新人

「はい!これからはSELECT文だけでなく、データの追加や削除も学んでいきたいです!」

先輩

「その調子!INSERT、UPDATE、DELETEの操作を学べば、Webアプリ開発の幅が一気に広がりますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

PHPでMySQLに接続するには何が必要ですか?

PHPからMySQLに接続するには、MySQLサーバー、ユーザー名、パスワード、データベース名が必要です。また、PHPの拡張機能であるmysqliやPDOが使えるようにしておく必要があります。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
PHPでセッションを使ってフォーム入力を保持する方法を解説!初心者向けステップバイステップ
Pythonで文字列をリストに変換する方法!split()とjoin()の使い方
Pythonの変数とは?定義方法とデータ型を初心者向けに解説
PHPでメールフォームを作る方法を徹底解説!初心者向けにmail関数とPHPMailerの使い方も紹介
人気記事
No.1
PHP&Python記事人気No1
Pythonでテキストファイルを1行ずつ読み込む方法(readline() / readlines())
No.2
PHP&Python記事人気No2
Pythonのリストを辞書に変換する方法(dict() / zip())
No.3
PHP&Python記事人気No3
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
No.4
PHP&Python記事人気No4
初心者向けにPHP でファイルを開く・読み込む・書き込む方法(fopen, fwrite, fread)を解説する記事
-