LESSON 03 / 03 約5分

PHPから、安全に取り出す

まずは仕組みをつかもう。細かい書き方は覚えなくて大丈夫。

01 これは何?

PHPからMySQLを扱うときは、PDO*1などを使います。利用者の入力はSQLの文章へ直接つなげず、プレースホルダー*2へ値として渡します。SQLインジェクション*3を防ぐ基本です。

*1 PDO:PHPからデータベースを操作するための機能。
*2 プレースホルダー:値を後から入れるための目印。
*3 SQLインジェクション:入力を命令に混ぜて、データベースを不正操作する攻撃。

02 なぜ必要?

投稿者のIDなどをSQLへ直接つなぐと、不正な入力によって命令の意味を変えられる場合があります。命令と値を分けると安全に扱いやすくなります。接続情報は公開せず、保存する前の入力確認と、表示時の対策も続けて必要です。

03 最小限のコード・図

<?php
// $pdoは接続済みのPDO。$userIdはサーバーで確認した本人のID。
$stmt = $pdo->prepare(
    'SELECT id, body FROM posts WHERE user_id = :user_id ORDER BY id DESC LIMIT 20'
);
$stmt->execute(['user_id' => $userId]);
$posts = $stmt->fetchAll(PDO::FETCH_ASSOC);

04 ここだけ理解する

  • prepareで命令を用意し、executeで値を渡す。
  • 接続先・利用者名・パスワードは公開するコードに置かない。
  • 取得した文章をHTMLに出すときは、別途htmlspecialcharsを使う。

05 覚えなくていいこと

接続処理の書式はその都度確認してOK。短い例には接続や本人確認が省かれていると見抜くことが大切です。

ASK AI

06 AIに聞いてみよう

質問文をコピーして、ChatGPTやCodexなどに貼り付けてみましょう。

PHPのPDOでMySQLに接続し、ログイン中の本人の投稿を取得する例を段階的に作ってください。接続情報は環境変数など公開しない場所から取得し、utf8mb4、例外処理、プリペアドステートメントを使ってください。利用者IDをフォームから信用せず、HTML出力時のXSS対策も説明してください。

07 AIの回答を見るポイント

  • 利用者の入力をSQL文字列へ直接つないでいないか。
  • 接続パスワードや詳しいエラー内容を画面へ漏らさないか。

さらに確認する:公式ドキュメント ↗

08 だいたい分かったら、次へ

「理解できた」はいつでも取り消せます。記録せずに次へ進んでも大丈夫です。