今回は複数の記事に対応したいと思います。今までは、記事を投稿して出力するのは1記事だけしかできませんでした。前の記事は新しい記事に上書きをされてしまっていました。新しい記事を投稿しても前の記事は残るように作成します。
前回は、JSONファイルからデータを取得して投稿記事一覧を作成、CSSを使い装飾をしました。
ブログ投稿後の処理を複数投稿に対応します。
JSONを配列形式に格納するようにします。[ ]の中に記事の内容ごとにカンマで区切るとJSONで配列になります。JSONファイルを次のように書き換えましょう。
[
{
"title":"面白いサッカー",
"category":"スポーツ",
"comment":"サッカー楽しいスポーツです。"
},
{
"title":"面白いバスケ",
"category":"スポーツ",
"comment":"バスケも楽しいです。"
}
]
投稿後、JSONファイルを読み込んで、PHPの連想配列に変換します。次に新しい投稿データを連想配列に追加していく処理にします。
投稿後、真っ白なページになってしまうところも変えたいと思います。前回PHPファイルにはHTML文を書けることを学習しました。今回もPHPファイルにHTML文をかいて、「投稿完了」メッセージと、投稿リストページのリンクをはりましょう。
<?php
$title = htmlentities($_POST['title'], ENT_QUOTES);
$category = htmlentities($_POST['category'], ENT_QUOTES);
$comment = htmlentities($_POST['comment'], ENT_QUOTES);
if( empty($title) || empty($comment) ){
header('Location: index.html');
exit;
}
#$title = str_replace("楽しい", "面白い", $title);
#全角カナから半角カナに変える
#$title = mb_convert_kana($title, "k");
$blog_content = [
"title" => $title,
"category" => $category,
"comment" => $comment,
];
//① JSONファイルから読み込み
$file = "blog.json";
$json = file_get_contents($file);
$data = json_decode($json, true);
//② 連想配列に新しい投稿データを追加
$data[] = [
"title" => $title,
"category" => $category,
"comment" => $comment,
];
//③ 連想配列をJSONデータに変換しJSONファイルに保存
$blog_json = json_encode($data, JSON_UNESCAPED_UNICODE);
file_put_contents($file, $blog_json);
?>
<html>
<head>
<title>投稿完了</title>
</head>
<body>
<h1>投稿完了</h1>
投稿しました。<br/>
<a href="articles.php">投稿記事一覧へ</a><br/>
<a href="index.html">記事投稿へ</a>
</body>
</html>
JSONファイルからJSONデータを読み込み、PHPの連想配列に変換します。JSONデータの配列に新しい投稿データを追加するためです。
PHPの配列は、次のような書き方で値を追加することができます。ターミナルを開いて「php -a」を入力してインタラクティブモードにして次を入力してみましょう。
$hoge[] = 'AAA';
$hoge[] = 'BBB';
var_dump($hoge);
array(2) { [0]=> string(3) "AAA" [1]=> string(3) "BBB" }
配列にXXXとYYYが追加されました。
連想配列ではどうでしょうか。$dataという配列に、新しい投稿データの配列を追加します。
$hoge[] = ['AAA','XXX'];
$hoge[] = ['BBB','YYY'];
var_dump($hoge);
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000} span.s1 {font-variant-ligatures: no-common-ligatures} array(4) { [0]=> string(3) "XXX" [1]=> string(3) "YYY" [2]=> array(2) { [0]=> string(3) "AAA" [1]=> string(3) "XXX" } [3]=> array(2) { [0]=> string(3) "BBB" [1]=> string(3) "YYY" } }
連想配列に新しい投稿データを追加されました。
json_encode関数が、JSONの配列データにうまく変換してくれます。JSONファイルに保存します。
JSONファイルからJSONデータを読み取り、表示するコードも変更します。
<?php
$file = "blog.json";
$json = file_get_contents($file);
$blog_contents = json_decode($json, true);
?>
<html>
<haed>
<title>ブログ記事一覧</title>
<link media="all" rel="stylesheet" href="style.css" />
</head>
<body>
<?php foreach($blog_contents as $content){ ?>
<h1><?php echo $content['title']; ?></h1>
<span><?php echo $content['category']; ?></span>
<div><?php echo $content['comment']; ?></div>
<?php } ?>
</body>
</html>
PHPは、HTML文を書けるだけではなく、<?php — ?>で囲んだPHP処理も実行できます。
foreachは繰り返し処理です。配列「$blog_contents」のはじめから終わりまで、$blog_contentsの値を$contentに代入する処理を繰り返します。$contentに1投稿記事のデーアが入り、表示させています。
配列、連想配列をイメージしやすくするコツは表を書くことです。
$blog_contentsの中身をイメージしてみましょう。foreachは、下表indexの0から2まで処理を繰り返します。$contentに値を代入していきます。
index | 値 |
0 | {[title]=>”面白いサッカー”,[category]=>”スポーツ”,[comment]=>”サッカー楽しいスポーツです。”} |
1 | {[title]=>”面白いバスケ”,[category]=>”スポーツ”,[comment]=>”バスケも楽しいです。”} |
2 | {[title]=>”楽しいブログ製作!”,[category]=>”ニュース”,[comment]=>”ブログ製作は楽しい!”} |
動作を試してみましょう。
ブラウザーで、localhost:8000を開いて、タイトル「楽しいブログ製作!」、カテゴリ「ニュース」、記事「ブログ製作は楽しい!」と投稿してみましょう。
localhost:8000/articles.php を開いてみてください。
複数投稿に対応できました。
ただ、新しい投稿は下に表示されていますね。表示する順を新しい投稿が上にくるように逆にしてみます。
<?php
$file = "blog.json";
$json = file_get_contents($file);
$blog_contents = json_decode($json, true);
$blog_contents = array_reverse($blog_contents);
?>
<html>
<haed>
<title>ブログ記事一覧</title>
<link media="all" rel="stylesheet" href="style.css" />
</head>
<body>
<?php foreach($blog_contents as $content){ ?>
<h1><?php echo $content['title']; ?></h1>
<span><?php echo $content['category']; ?></span>
<div><?php echo $content['comment']; ?></div>
<?php } ?>
</body>
</html>
array_reverse関数だけで、簡単に配列を順序を逆にできました。PHPは便利ですね。
もう一度 localhost:8000/articles.php を開いてみてください。
新しい投稿が上にくるようになりました。新しい投稿が注目されるようになりますね。
今回は以上です。
複数の記事を読み書きできるブログになりました。投稿後、JSONファイルからデータをすべて読みこんで、連想配列にして新しい記事データを追加しました。
投稿記事一覧では、JSONファイルからデータを読み込み、PHPで扱える連想配列に変換、foreachを使い繰り返し処理をして、1記事ごとに出力しました。
配列になると少し難しく感じますが、配列を考える時は、EXCELのような表を(マトリックス図)を作って値を書いていくとわかりやすいです。
次回は、PHPの外部ファイル読み込みと投稿時間をいれます。
最後までお読みいただき、ありがとうございました!