初心者向けPHPでMySQLからデータを取得する方法(SELECT文)完全ガイド
新人
「PHPでMySQLからデータを取得したいんですけど、どうすればいいですか?」
先輩
「PHPでMySQLにアクセスするには、まずMySQLについて理解しておくといいですね。これから詳しく説明します。」
1. MySQLとは?(基本的な説明)
MySQLは、データベース管理システムの一つで、データを保存したり、検索したりするために使われます。基本的に、MySQLはテーブルと呼ばれる場所にデータを格納し、SELECT
文を使って必要なデータを取り出します。
例えば、ブログの投稿情報やユーザーのデータなどを保存するためにMySQLを使います。MySQLは非常に高速で、安定して動作するので、世界中の多くのウェブアプリケーションで利用されています。
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文の実行方法
ここでは、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文の実行方法
次に、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の違い(どちらを選ぶべきか)
mysqli
とPDO
には、それぞれの特徴があります。どちらを選ぶべきかは、プロジェクトの要件によって異なります。
5.1 mysqliの特徴
- MySQL専用のライブラリなので、MySQLを使う場合は最適
- 手続き型とオブジェクト指向型の両方が使える
- コードがシンプルでわかりやすい
5.2 PDOの特徴
- MySQLだけでなく、PostgreSQLやSQLiteなど他のデータベースにも対応
- セキュアなプリペアドステートメントがデフォルトで使用可能
- エラーハンドリングがしやすい
5.3 どちらを選ぶべきか?
もし、MySQLだけを使う場合はmysqli
で十分です。しかし、将来的に他のデータベースを使う可能性がある場合は、PDO
を使うのが良いでしょう。
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インジェクション対策)
データベースを扱うときに特に気をつけなければならないのが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インジェクションを防ぐには、プリペアドステートメント
を使います。mysqli
とPDO
の両方で対応できます。
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. まとめとおすすめの使い方
今回は、PHPでMySQLからデータを取得する方法について学びました。
- MySQLとは何か、基本的なデータ取得方法を学んだ
- mysqliとPDOの違いを理解し、それぞれのメリットを比較した
- エラーハンドリングの方法を学び、適切なエラー処理を実装する方法を学んだ
- SQLインジェクション対策として、プリペアドステートメントを使う方法を学んだ
これで、PHPで安全にMySQLのデータを取得できるようになりました。次のステップとして、データの追加・更新・削除の方法も学んでみましょう。