PHPでお知らせ一覧を安全に表示する前に確認すること
Webサイトでよく見かける「お知らせ」や「ニュース」の一覧。新しい情報が追加されるたびに手作業でHTMLを更新するのは大変ですよね。実は、PHPのforeachループを使えば、そんな手間のかかる作業を自動化し、いつでも最新の情報を表示できる動的なリストを簡単に作成できます。
この記事では、PHPのforeachでお知らせ一覧を表示する方法に加えて、長いタイトル、空の配列、リンクURL、DBから取得した本文、AIが出したコードを本番へ入れる前の確認を整理します。お知らせ一覧はトップページや管理画面に出やすいため、1件だけ表示が崩れても目立ちます。安全な表示の型を先に決めてから実装しましょう。
確認日: 2026年5月20日
このページで整理できること
foreachで同じHTMLをデータ件数分だけ表示する基本。- 空配列、長いタイトル、リンクURL、日付表示で崩れやすい場所。
htmlspecialchars()を使って一覧表示を安全にする理由。- 配列一覧からDB一覧、CMS風のお知らせ管理へ進める前の確認順。
- AIやCodexに一覧表示コードを相談する時に伏せる情報。
最初に分けること
| 作りたい一覧 | 先に確認すること | 次に読むページ |
|---|---|---|
| 固定配列のお知らせ一覧 | 空配列、1件、複数件、長いタイトルを試す | PHP配列で表示する基本 |
| 本文の抜粋付き一覧 | HTMLタグを途中で切らず、表示直前にエスケープする | PHPで安全な抜粋文を作る方法 |
| DBから出す一覧 | 接続情報を分け、表示時はDB本文も信用しすぎない | PDOでデータを一覧表示する基本 |
| AIが作った一覧コード | 実データや管理画面URLを貼らず、サンプル配列で相談する | AIコード安全公開の入口 |
PHPを動かすための準備(開発環境)まだXAMPP「ザンプ」を構築してない方は、【PHP入門】XAMPPのダウンロードとインストール方法を徹底解説!を参照してください。 インストール後、指定されたフォルダ(`htdocs`など)にPHPファイルを置けば、準備は完了です!
先に確認:foreachで作る一覧の使い道
foreachは「同じ形のHTMLをデータ件数分だけ出す」時に使います。お知らせ一覧だけでなく、商品一覧、ブログカード、管理画面の一覧にも応用できます。
- PHPの基本がまだ不安なら、先に PHPで動的なWebサイトを作る基本 を確認します。
- 配列の表示例をもう少し見たい場合は、PHP配列でプロフィールカードを作る方法 が近いです。
- 本文の短い説明文も出したい場合は、PHPで安全な抜粋文を作る方法 と組み合わせます。
- DBから一覧を出したい場合は、PDOでデータを一覧表示する基本 に進みます。
1. 基本のキ!PHPの配列とforeachループ
まずは、`foreach`が何をするものなのかを理解するために、その相棒である「配列」から見ていきましょう。
配列とは、複数の値をまとめて格納できる、箱のようなものです。例えば、お知らせの情報を「日付」と「タイトル」のセットで管理したい場合、以下のように配列を作ることができます。
<?php
// お知らせ情報を格納した配列
$news_items = [
[
"date" => "2025-07-03",
"title" => "夏季休業のお知らせ"
],
[
"date" => "2025-07-01",
"title" => "新サービス「〇〇」を開始しました"
],
[
"date" => "2025-06-20",
"title" => "ウェブサイトをリニューアルしました"
]
];
// 配列の中身を確認(デバッグ用)
print_r($news_items);
?>
この配列という「箱」から、中身を一つずつ取り出して処理するのが`foreach`ループの役目です。構文はとてもシンプルです。
foreach (配列 as 取り出した要素を一時的に入れる変数) { ...処理... }
この構文を使い、先ほどの配列からタイトルだけを順番に取り出して表示させてみましょう。
<?php
$news_items = [
["date" => "2025-07-03", "title" => "夏季休業のお知らせ"],
["date" => "2025-07-01", "title" => "新サービス「〇〇」を開始しました"],
["date" => "2025-06-20", "title" => "ウェブサイトをリニューアルしました"]
];
// 配列から1件ずつお知らせ情報を取り出す
foreach ($news_items as $item) {
// 取り出したお知らせのタイトルを表示する
echo $item['title'] . "\n";
}
?>
このように、`foreach`は配列の中の要素がなくなるまで、自動的に処理を繰り返してくれます。これが動的リスト生成の心臓部となります。
2. 実践!foreachでお知らせ一覧を作成する
それではいよいよ本題です。先ほどの配列と`foreach`ループを使って、Webページに表示できるHTML形式のお知らせ一覧を作成します。以下のコードは、HTMLとPHPを組み合わせた最も基本的な形です。このままファイルにコピペすれば、ブラウザで表示を確認できます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>お知らせ一覧</title>
<style>
body { font-family: sans-serif; line-height: 1.6; padding: 20px; }
.news-list { list-style: none; padding: 0; border-top: 1px solid #ccc; }
.news-list li { padding: 15px 10px; border-bottom: 1px solid #ccc; }
.news-date { font-weight: bold; margin-right: 1em; color: #555; }
</style>
</head>
<body>
<h1>お知らせ</h1>
<?php
// お知らせ情報を配列として用意
$notices = [
[
"date" => "2025-07-03",
"title" => "夏季休業のお知らせ"
],
[
"date" => "2025-07-01",
"title" => "新サービス「〇〇」を開始しました"
],
[
"date" => "2025-06-20",
"title" => "ウェブサイトをリニューアルしました"
]
];
?>
<ul class="news-list">
<?php foreach ($notices as $notice): ?>
<li>
<span class="news-date"><?php echo htmlspecialchars($notice['date']); ?></span>
<span class="news-title"><?php echo htmlspecialchars($notice['title']); ?></span>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
このコードのポイントは、`
- `タグの内側で`foreach`ループを回している点です。配列`$notices`に格納されたデータ1件につき、`
- `タグのセットが1つずつ生成されます。もし配列の要素を4件、5件と増やせば、自動的にリストの項目も増えていきます。これが「動的リスト生成」の仕組みです。
3. 応用例でさらに便利に
基本が分かったところで、より実用的な形に改造していきましょう。
各お知らせにリンクを追加する
お知らせ一覧には、各項目の詳細ページへのリンクが付き物です。配列にURLの情報を追加し、ループの中で`<a>`タグを生成するように変更してみます。
<ul class="news-list"> <?php // URLの情報を追加した配列 $notices_with_links = [ [ "date" => "2025-07-03", "title" => "夏季休業のお知らせ", "url" => "/news/summer-holiday.html" ], [ "date" => "2025-07-01", "title" => "新サービス「〇〇」を開始しました", "url" => "/news/new-service.html" ] ]; foreach ($notices_with_links as $notice): ?> <li> <span class="news-date"><?php echo htmlspecialchars($notice['date']); ?></span> <a href="<?php echo htmlspecialchars($notice['url']); ?>"> <?php echo htmlspecialchars($notice['title']); ?> </a> </li> <?php endforeach; ?> </ul>
タイトル部分を`<a>`タグで囲み、`href`属性に配列から取得したURLを指定するだけで、簡単にリンク付きのリストが完成しました。
日付のフォーマットを変更する
「2025-07-03」のような表記ではなく、「2025年07月03日」のように、より親しみやすい形式で表示したい場合もあるでしょう。PHPの`date()`関数と`strtotime()`関数を組み合わせることで、日付のフォーマットを自由自在に変更できます。
<ul class="news-list"> <?php $notices = [ ["date" => "2025-07-03", "title" => "夏季休業のお知らせ"], ["date" => "2025-07-01", "title" => "新サービス「〇〇」を開始しました"] ]; foreach ($notices as $notice): // 文字列の日付をタイムスタンプに変換 $timestamp = strtotime($notice['date']); // 好きなフォーマットに変換して表示 $formatted_date = date("Y年m月d日", $timestamp); ?> <li> <span class="news-date"><?php echo $formatted_date; ?></span> <span class="news-title"><?php echo htmlspecialchars($notice['title']); ?></span> </li> <?php endforeach; ?> </ul>
`strtotime()`で日付の文字列をPHPが扱える数値(タイムスタンプ)に変換し、`date()`でその数値を指定した書式に変換しています。`"Y年m月d日 (D)"`のようにすれば曜日を追加することも可能です。
4. 気をつけるべき点
`foreach`ループを使う上で、注意しておきたい点がいくつかあります。
配列が空っぽだった場合
まだお知らせが1件も登録されていない場合など、ループ処理の元となる配列が空っぽのケースも考慮しなければなりません。`foreach`は配列が空の場合、何も実行せずにスルーしてくれるのでエラーにはなりませんが、ユーザーには「お知らせがありません」といったメッセージを表示するのが親切です。
PHPの`empty()`関数を使って、配列が空かどうかを事前にチェックします。
<?php // お知らせがまだ1件もない空の配列 $notices = []; ?> <h1>お知らせ</h1> <?php if (empty($notices)): ?> <p>現在、新しいお知らせはありません。</p> <?php else: ?> <ul class="news-list"> <?php foreach ($notices as $notice): ?> <li> <!-- リスト表示処理 --> </li> <?php endforeach; ?> </ul> <?php endif; ?>
`if (empty($notices))`で配列が空の場合の表示を、`else`で配列にデータがある場合のリスト表示処理を、それぞれ記述することで、どんな状況にも対応できる堅牢なコードになります。
HTMLエスケープ処理の重要性
データベースなど、外部から取得したデータをWebページに表示する際には、セキュリティ対策として`htmlspecialchars()`関数を通すことが非常に重要です。これは、悪意のあるJavaScriptコードなどが埋め込まれるクロスサイトスクリプティング(XSS)という攻撃を防ぐためです。
たとえ自分で入力したデータであっても、`echo`で画面に出力する際には必ず`htmlspecialchars()`で囲む癖をつけておくと安全です。
<?php // 悪意のあるデータが混入している例 $notice = [ "title" => "<script>alert('XSS');</script>" ]; ?> <!-- 悪い例:そのまま出力するとスクリプトが実行されてしまう --> <span><?php echo $notice['title']; ?></span> <!-- 良い例:htmlspecialcharsでエスケープ処理を行う --> <span><?php echo htmlspecialchars($notice['title']); ?></span>
良い例の場合、ブラウザ上には「<script>alert('XSS');</script>」という文字列がそのまま表示されるだけで、スクリプトが実行されることはありません。
リンクURLもそのまま信用しない
タイトルだけでなく、リンク先のURLも配列やDBから出す場合は注意が必要です。外部入力のURLをそのまま
hrefに入れると、意図しないURLへ飛ばすリンクになることがあります。最初は自分で許可したパスだけを配列に入れ、表示時はhtmlspecialchars()を通す形にしておくと安全です。フォームから登録したお知らせを表示する場合は、入力チェックも必要です。詳しくは PHPフォームのバリデーションと安全対策 を確認してください。
5. まとめと関連コードの紹介
今回は、PHPの`foreach`ループを使って、配列のデータから動的にお知らせ一覧を生成する方法を解説しました。このパターンは、お知らせ一覧だけでなく、商品リスト、ブログ記事一覧、ギャラリーなど、Webサイトのあらゆる「繰り返し表示」に応用できる非常に強力なテクニックです。
基本の形をマスターしたら、ぜひご自身のサイトで色々なリスト表示に挑戦してみてください。配列のデータをデータベースから取得するように変更すれば、本格的なWebアプリケーションへの第一歩となります。
`foreach`ループと似たような繰り返し処理には、条件が満たされている間だけ処理を続ける`while`ループなどもあります。特定の回数だけ繰り返したい場合は`for`ループが便利です。それぞれの特性を理解し、場面に応じて使い分けることで、プログラミングの幅がさらに広がります。
DBのお知らせ一覧へ発展させる時
配列で作ったお知らせ一覧は、DBから取得する形へ発展できます。その場合も、表示時の
htmlspecialchars()は必須です。DBに入っているデータでも、画面に出す時は安全な文字列として扱います。- DB接続は共通ファイルにまとめる
- 日付はDB側で
created_atを持たせる - 一覧は
ORDER BY created_at DESCで新しい順にする - 空の場合の表示を用意する
関連: PDOで一覧表示する基本
AIにお知らせ一覧コードを相談するメモ
AIやCodexへ相談する時は、本番DBの接続情報や実在する投稿本文を貼らず、サンプル配列と表示したい形だけを渡します。
PHPのお知らせ一覧表示について相談します。 目的: - トップページ / お知らせページ / 管理画面 / ブログ一覧 のどれか: 入力元: - 固定配列 / DB / JSON / フォーム投稿: 表示したい項目: - 日付: - タイトル: - リンクURL: - 抜粋文: 確認したいこと: - foreachの書き方 - 空配列の表示 - htmlspecialcharsの使い方 - 長いタイトルや改行で崩れないか - DB一覧へ移す時の注意 貼らない情報: - DBホスト、ユーザー名、パスワード - 実在する問い合わせ内容、メールアドレス、投稿本文 - 本番管理画面URL公開前後に確認したいこと
一覧ページはサイトの入口になりやすいため、1件だけ表示が崩れても目立ちます。ローカルで空配列、1件、複数件、長いタイトルを試してから公開すると安全です。
- 真っ白になったら PHPのエラーログ確認手順 を見ます。
- ロリポップで更新する場合は PHPサイトを安全に更新する手順 を確認します。
- 公開したのに古い表示のままなら FTPアップロードが反映されない時の確認順番 を見ます。
- ページ分割が必要になったら SQLのLIMITでページネーションする方法 が次の候補です。
関連して確認したいPHP記事