カテゴリ: PHP 更新日: 2025/05/29

初心者向け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のデータを取得できるようになりました。次のステップとして、データの追加・更新・削除の方法も学んでみましょう。

コメント
コメント投稿は、ログインしてください

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

カテゴリの一覧へ
新着記事
Pythonのエラーメッセージの読み方!よくあるエラーと解決方法
PHPの関数(function)の基本を完全ガイド!初心者でもわかる使い方
Pythonの条件式でNoneを判定する方法!is None vs == None の違い
Pythonのpass文とは?一時的なコードブロックをスキップする方法
人気記事
No.1
Java&Spring記事人気No1
PHPの配列をソートする方法!sort, rsort, asort, ksortの使い方を丁寧に解説します!
No.2
Java&Spring記事人気No2
PHPとは?初心者向けにわかりやすく解説
No.3
Java&Spring記事人気No3
PHPの関数(function)の基本を完全ガイド!初心者でもわかる使い方
No.4
Java&Spring記事人気No4
PHP の文字列の基本操作(連結・切り出し・長さ)の使い方
-