読み込み中...

5つのステップでマスター! PHPでプレースホルダを活用する方法

PHPでプレースホルダを活用するステップバイステップのガイド PHP
この記事は約8分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

PHPとそのデータベース操作について学ぶための記事へようこそ!

この記事を読めば、初心者でもPHPのプレースホルダを用いた安全なデータベース操作を学ぶことができるようになります。

ここで説明するプレースホルダという技術は、SQLインジェクションという一種のサイバーセキュリティ攻撃を防ぐのに有効な手段です。

それでは、具体的なコードとその解説を交えながら進めていきましょう。

●PHPとプレースホルダの基本知識

○PHPとは

PHPは、「PHP: Hypertext Preprocessor」の略で、サーバーサイドで動作するスクリプト言語の一つです。

主にWeb開発に使用され、HTML内に直接記述することが可能です。

○プレースホルダとは

プレースホルダは、一種の予約語であり、SQL文中で値を一時的に置き換える役割を果たします。

プレースホルダが設定されている部分には後から具体的な値が埋め込まれます。

これにより、SQLインジェクションのような攻撃を防ぐことが可能になります。

●プレースホルダの使い方

○プレースホルダの基本的な使い方

PHPでプレースホルダを使用するには、PDO(PHP Data Objects)拡張を使用します。

PDOは、データベースにアクセスするための一種のインターフェースで、PHPからデータベースに対する操作を抽象化します。

○サンプルコード1:データベースへのデータ挿入

次に、プレースホルダを使用してデータベースにデータを挿入する例を紹介します。

この例では、$pdo->prepare()メソッドを使ってSQL文を準備し、プレースホルダを使用しています。

そして、bindValue()メソッドを使ってプレースホルダに値をバインドしています。

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$sql = 'INSERT INTO users (name, age) VALUES (?, ?)';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, 'John', PDO::PARAM_STR);
$stmt->bindValue(2, 30, PDO::PARAM_INT);
$stmt->execute();
?>

このサンプルコードでは、bindValue()メソッドによって、1番目のプレースホルダに’John’という文字列が、2番目のプレースホルダに30という整数がバインドされています。

その結果、このSQL文はデータベースに対して、nameに’John’、ageに30という値を持つ新しい行を挿入する命令となります。

○サンプルコード2:データベースからのデータ取得

次に、プレースホルダを使用してデータベースからデータを取得する例を紹介します。

この例では、ある特定の名前を持つユーザーの年齢を取得しています。

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$sql = 'SELECT age FROM users WHERE name = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, 'John', PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
echo $result['age'];
?>

このサンプルコードでは、bindValue()メソッドによって1番目のプレースホルダに’John’という文字列がバインドされています。

その結果、このSQL文はデータベースに対して、名前が’John’であるユーザーの年齢を取得する命令となります。

●プレースホルダを活用した応用例

基本的な使い方を理解したところで、より具体的なプレースホルダの使用例をいくつか見ていきましょう。

○サンプルコード3:検索フォームの作成

下記のコードでは、ユーザーから入力された名前を用いてデータベースから該当するデータを検索する簡易的な検索フォームを作成しています。

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$name = $_GET['name'];
$sql = 'SELECT * FROM users WHERE name = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
    echo $row['name'], ': ', $row['age'], "\n";
}
?>

この例では、$_GET変数から取得したユーザー入力の名前をプレースホルダにバインドし、該当するユーザー情報を取得しています。

各行の情報はforeachループで処理し、名前と年齢を出力しています。

○サンプルコード4:データベースのデータ更新

次に、プレースホルダを使用してデータベースの既存のデータを更新する例を紹介します。

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$sql = 'UPDATE users SET age = ? WHERE name = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, 31, PDO::PARAM_INT);
$stmt->bindValue(2, 'John', PDO::PARAM_STR);
$stmt->execute();
?>

このコードでは、名前が’John’のユーザーの年齢を31に更新しています。

プレースホルダを使って値をバインドすることで、SQL文の安全性を確保しつつ、動的なデータ操作が可能になります。

○サンプルコード5:データベースのデータ削除

最後に、プレースホルダを使用してデータベースからデータを削除する例を紹介します。

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$sql = 'DELETE FROM users WHERE name = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, 'John', PDO::PARAM_STR);
$stmt->execute();
?>

このコードでは、名前が’John’のユーザーをデータベースから削除しています。

ここでもプレースホルダを使うことで、安全にSQL文を実行することが可能です。

●プレースホルダの注意点と対処法

次に、プレースホルダを使用する際の注意点とその対処法を見ていきましょう。

●プレースホルダをカスタマイズする方法

PDOは、質問型プレースホルダと名前付きプレースホルダの2種類のプレースホルダをサポートしています。

それぞれの使用方法と特性を理解することで、より効果的にプレースホルダをカスタマイズできます。

○プレースホルダの種類

  1. 質問型プレースホルダ:これまでに紹介した例はすべて質問型プレースホルダを使用しています。
    質問型プレースホルダはSQLクエリ内の任意の場所に ‘?’ を使用し、それぞれのプレースホルダに値をバインドする方法です。
  2. 名前付きプレースホルダ:名前付きプレースホルダはSQLクエリ内で特定のキーワードを使用し、そのキーワードに値をバインドします。
    キーワードは ‘:’ から始まります。

○サンプルコード6:名前付きプレースホルダの使用

下記の例では、名前付きプレースホルダを使用してデータベースから情報を取得します。

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$name = $_GET['name'];
$sql = 'SELECT * FROM users WHERE name = :name';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
    echo $row['name'], ': ', $row['age'], "\n";
}
?>

このコードでは、質問型プレースホルダの代わりに名前付きプレースホルダ ‘:name’ を使っています。

名前付きプレースホルダを使用すると、バインドする値が何であるかがより明確になり、大規模なプロジェクトや複雑なSQLクエリでの利用に優れています。

まとめ

この記事では、PHPのプレースホルダの使い方を5つのステップで学びました。

プレースホルダはSQLインジェクション対策として有効な手段であり、プログラミング初心者からベテランまで、安全なデータベース操作を行うためには欠かせない技術です。

また、PDOが提供する質問型プレースホルダと名前付きプレースホルダは、それぞれの特性を理解し、適切に使い分けることで、より高度なデータベース操作を実現できます。

これらの知識を活かし、次のステップに進みましょう。