第6回 読み書き削除の実装例 - OOP講座

PHP講座 HTML×CSS 初級編

がる先生のOOP講座

Lecutures on PHP

第6回 読み書き削除の実装例 (その1)

 このエントリーをはてなブックマークに追加

読み書き削除の実装例

先日の話に従ってソースコードの整理をしていると、やってきました。 定番の出だし「上司からの命令下りmail」です。

<<メール>>
mailでの削除がいい加減しんどいから削除機能が欲しい。

そうなんです。
今まで、掲示板の投稿文の削除は

  • mailを貰って
  • こちら側で手で削除

がる先生という、いわゆる「SE対応」でやっていたのですが、確かに量が増えるとある程度面倒ではあります。
せっかくですし、ソースコードの整理と合わせて、削除機能も付け足してみましょう。

まずreadとwriteを、前回のMVCに従って実装し直してみます。
より正確には、readとwriteを「実処理してくれる君」用に書き直します。
では早速、まずはwriteから。

一つ目はwrite_print。
このプログラムは「テンプレートを表示する」程度の軽微な処理を行っています。

list 1

write_print.class.php より

  1  public function 実行() {
  2    
$this->set_template_filename(入力用テンプレートファイル名);
  3    return ;
  4  }

がる先生二つ目はwrite_fin。
このプログラムは

  • 入力を受け取って
  • validationに失敗したら入力画面に戻って
  • validationが成功したら書き込んで、その後、readクラスに出力を依頼する

という流れになります。

list 2

write_fin.class.php より

  1  public function 実行() {
  2    
// 掲示板名を取得
  3    
$sysconfig_obj $this->get_sysconfig();
  4    
$bbs_name $sysconfig_obj->find('bbs_title');
  5  
  6    
// bbs_dataクラスを使う準備
  7    
$bbs_obj = new bbs_data();
  8  
  9    
// 新しく追加したメソッドです。保存先のファイル名などをここから取得できるようにしておきます
 10    
$bbs_obj->set_sysconfig($sysconfig_obj);
 11  
 12    
// 「掲示板の1メッセージの情報」をクラスの中に入れる
 13    
$bbs_obj->set_from_cgiform();
 14  
 15    
// データのチェック(validate)
 16    
if (false === $bbs_obj->is_validate()) {
 17      
// エラー表示処理をして「振り分け君」に戻す
 18      // XXX ここの詳細は第五回のlist 4などを参照してください
 19      
$this->set_次に呼びたいメインクラスのクラス名('write_print');
 20      return ;
 21    }
 22  
 23    
// 「1メッセージの情報」をファイルに書き込む
 24    
$bbs_obj->write();
 25  
 26    
// readにリダイレクト
 27    
$this->set_次に呼びたいメインクラスのクラス名('read');
 28  }

最後にread。
このプログラムは「掲示板の内容を表示する」プログラムになります。

list 3

read.class.php より

  1  public function 実行() {
  2  <?
php
  3  
  4    
// 掲示板名を取得
  5    
$sysconfig_obj $this->get_sysconfig();
  6    
$bbs_name $sysconfig_obj->find('bbs_title');
  7  
  8    
// ページ数を取得
  9    
$now_page_num $cgi_request->get_param('page');
 10  
 11    
// ループして、出力データを作成
 12    
$ppn 10// 1Pageに出力するメッセージ件数
 13    
$data array(); // データ格納用配列
 14    
for($i 0$i $ppn$i ++) {
 15      
// 指定された番号の掲示板情報を取ってくる
 16      // XXX 削除した掲示板メッセージを想定していないので、そのあたりは各自工夫してみてください
 17  
 18      // bbs_dataクラスを使う準備
 19      
$bbs_obj = new bbs_data(); // インスタンスを作る
 20      
$bbs_obj->set_filename_from_config($sysconfig_obj);
 21  
 22      
// 指定した番号の掲示板メッセージをハッシュ配列化して取得
 23      
$wk $bbs_obj->get_data_to_hash_by_no$now_page_num $ppn $i );
 24  
 25      
// データを保存領域に格納する
 26      
$data[] = $wk;
 27    }
 28    
// Smartyを作ってassign
 29    
$this->get_smarty()->assign('bbe_messages'$data);
 30  
 31    
// 出力依頼
 32    
$this->set_template_filename(入力用テンプレートファイル名);
 33    return ;
 34  }

がる先生さて、ほぼ一気にここまで書いてきました。
この勢いに任せて、削除についても書く……前に仕様を決めておきましょう。
「ボタン一つで削除」は便利なのですが、どちらかというと「クラッカーフレンドリー」な仕様になってしまいます。
とりあえず、さほどクリティカルでもセンシティブでもない掲示板ですので「書き込み時のパスワードと同じパスワードが入力されつつ、ボタンがおされたら削除」としておきましょう。
「書き込み情報にパスワードを追加する」ための方法は、第二回を思い出してみてください。
bbs_data classのget_target_arrayメソッドのreturn内容に「pass」を追加するだけですね。

  • 1
  • 2


Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)