トップ » 技術記事 » PHPで週末プログラミング(4) - 掲示板を作ってみよう(4)

PHPで週末プログラミング(4) - 掲示板を作ってみよう(4)

タグ: PHP

もし、Webサイトの管理者で週末に何か気軽に作ってみようと思ったなら、自分専用の「掲示板」が作ってみるのはどうでしょうか。本連載では、PHPを使うことで手軽にできる掲示板の制作を紹介しています。掲示板を題材にPHPを学ぶことで、Webプログラミングの仕組みを学ぶことができます。ゼロからの掲示板作りに挑戦してみましょう。

対象とする読者

  • 週末に何か作ってみたい人
  • 何かしらのプログラミング言語の経験がある
  • PHPに挑戦してみたい人
  • 掲示板を作ってみたい人

ここまでの復習

週末の時間を使って、PHPで掲示板を作ろうという企画です。

連載の一回目では、環境のセットアップから簡単な掲示板を作るまでを紹介しました。

二回目では、データベースを利用して、より手軽に書き込みを管理する方法を紹介しました。

三回目では、実際にWebサイトに設置して使ってもらえるような掲示板を作ってみようと思い、せっかくなので、筆者が制作している、日本語プログラミング言語「なでしこ」のサポート用の掲示板を作ってみました。

真夏の盛りに開発したので、掲示板の名前を manatubbs としました。

四回目の今回は、前回作ってみた掲示板に対して考察を加え、新しいアイデアを出してから、これに改良を加えてみたいと思います。

ツリー掲示板は使いづらい?

前回、ツリー掲示板を作って、日本語プログラミング言語「なでしこ」のサポート用の掲示板としてリリースしてみたわけですが、いくつか反省すべき点がありました。

まずは、視覚的な問題でツリー掲示板でありながら、親ノードと子ノードがインデントされているだけになっていますので、罫線で親と子をつなぐようにしたい気がしました。

あと、これは、ツリー掲示板の性格上の問題なのですが、議論が熱く交わされた時、どんどん子ノードが深くなってしまい、スレッドを追い辛くなってしまいます。話が途中で分岐してしまった場合などは、訳が分からなくなってしまうのです。

2ちゃんねるにしても、mixi にしても、スレッド(話題)は分かれているものの、ツリー掲示板にはなっていません。多くの人が使うことを考えるとツリー式の掲示板は可読性の点で少し問題があるようです。単純に時系列で表示した方が、内容が把握しやすくなりますし、もしも話題がそれる場合は、新たにスレッドを立ててもらいやすくなるでしょう。

そこで、前回作った掲示板のDB構造自体は変えないまま、2ちゃんねるのようなスレッド一覧+普通の掲示板として改良してみよう思います。

細かい修正

それから、前回作りこみが甘かった部分を強化することにしました。特に、前回の掲示板では、スレッドに返信があった場合に、スレッドの返信数のフィールドを更新し忘れていたり、URLのリンクが途中で切れる場合があったりしたので修正を行いました。

掲示板は一度設置してしまうと、なかなかアップデートしないものなので、バグはなるべく潰して安全な状態で使ってもらえるようにしたいものです。

まずは、こうした細かい修正の中で、前回解説できなかった小さなテクニックから紹介していきたいと思います。

ポイントとなるテクニックの紹介

本文中に記述されているURLを自動でリンクする

一般的な掲示板では、本文に記述されているURLを自動で <a>タグでリンクするようになっています。これは、正規表現を使って URL の部分を取り出してタグで囲うようになっています。

正規表現は、文字列の検索・置換を行なうときに利用されるもので、文字列のパターンを表現する表記法のことです。ここで詳しくは解説しませんが、URLをリンクする場合は、以下のように書くことができます。

$body = preg_replace("#((http|https|ftp)\:\/\/[a-zA-Z0-9\.\,\/\#\?\&\=\-\~\+\%\;\:\*\!\@\[\]]+)#","<a href='$1'>$1</a>",$body);

例えば、$body に 「http://nadesi.com」が入っていたとすると、「<a href=’http://nadesi.com’>http://nadesi.com</a>」のように置換されます。

長すぎる文字列を省略する

今回、掲示板のスレッド表示で、テーブルを使っていますが、テーブルを使うとあまり長いタイトルの書き込みがると、不自然にテーブルが変形してしまうことがあります。そこで、書き込みの長いタイトルを省略した形で表示するようにしたいと思います。

PHPには、指定した幅で文字列を丸める関数「mb_strimwidth()」が用意されています。この関数を使うことで、指定した文字幅に収まりきらない文字列をうまく切り取ることができます。部分文字列を取り出す関数「substr()」を使えば良いように思えますが、これだと日本語の文字列があった時に、文字の途中で切れてしまう恐れがあります。

例えば以下の関数は、タイトルと名前を短く丸めるために使っています。名前は半角16文字に、タイトルは半角48文字に丸めます。

function m_mode__write_strim(&$title, &$name)
{
    $name = mb_strimwidth($name, 0, 16, "..");
    $title = mb_strimwidth($title, 0, 48, "..");
}

例えば、「あいうえおあいうえお」という名前の人なら「あいうえおあい..」のように丸めます。

ページ分けの処理

また、書き込みが多くなってくると、1ページに全ての書き込みを表示しきれなくなります。そうなると、書き込みをページに分けて表示する必要があります。ページ分けの処理のために、PHPには、Pagerというライブラリがありますので、これを使うのも手だと思います。

manatubbsのように自力でページャーを作るには、SQL文を作る時に、「SELECT * FROM logs OFFSET xxx LIMIT xx」のように、OFFSET と LIMIT をつけて SELECT 文を発行します。これをつけると、OFFSET から LIMIT 分のデータを取り出します。

LIMIT には、ページに表示するデータ+1個分の値を指定します。そして、ページに表示するデータ個数よりも、取り出した分が多ければ「次へ」のリンクを表示し、1ページ以降なら「前へ」のリンクを表示するという処理を行うようにします。

$page     = intval(m_param("p", 1)); if ($page > 0) $page--;
$perpage  = m_info("logs.perpage");
$offset   = $page * $perpage;
$limit    = $perpage + 1;
$sql      = "SELECT * FROM logs WHERE threadid=$threadid
             ORDER BY logid DESC LIMIT $limit OFFSET $offset";
...

まとめ

以上、今回は掲示板を改良していく中で、必要なるちょっとしたテクニックを中心に紹介してきました。URLのタグ付け・文字列の切り取り・ページの分割など、掲示板の完成度を高める上で欠かせないものです。

いずれも難しいものではないので仕組みを理解した上で、自分で実装してみてください。既にフリーの掲示板がたくさんあるので、わざわざ自分で作らなくてもと思いますが、掲示板の作成こそ Webアプリケーション作成に必要な諸要素が詰まっていると言えるでしょう。

週末プログラミングで、掲示板作成に挑戦してみてください。

Series Navigation

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :