ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

全体表示

[ リスト ]

SELECTで感想を一覧表示



今回の更新は少なめ。
Changeset 7019 - CodeRepos::Share - Trac

一部手直しもしましたが、今回は app/models/Movie.php に作った getReviews() がメインです。
例によってsubversionを使ってソースを入手できます。

流れ


フォームから投稿すると、moviesとreviewsテーブルにそれぞれデータがINSERTされるように作りました。そのデータをフォームの下に一覧表示します。

データベース(SQLite)からデータを取得する処理は、app/models/Movie.php に記述します。getReviews() という名前でpublicなfunctionにしました。このfunctionは app/controllers/Index.php で呼び出されます。呼出し元の execute() でデータを得た後、returnした配列(Index.phpの29行目)は app/views/index.php の中で$resultsという変数を使ってechoできるようになっています。流れが若干複雑ですが、

・modelでデータベースから取得する
・controllerで取得したデータをviewに渡す
・viewで表示する

となっています。

SQLiteから投稿したデータを取得する


select title, type, review, date from movies, reviews where movies.id = reviews.movie_id order by date desc
このSQLの結果をfetchAllですべて取得する、というのが getReviews() の役目。このSQLは何をしようとしているかというと、reviewsテーブルの中身を取得しつつmoviesテーブルから映画のタイトルを紐付けて出しています。紐付けは2つのテーブルに共通するmoviesのidとreviewsのmovie_id。

create table reviews (
id integer,
movie_title text,
type integer,
date integer,
review text
);
とすればテーブルは1つですむのですが、movie_title以外にも監督名だとかいろいろ追加する予定なのと、今は1映画1つの感想にしやすいように分けています。この辺りは正規化のお話。


出力、とその前に


lib/Controller.php の39行目をコメントアウトして、フォームの感想の欄に
<h1>文字がでっかくなる</h1>
<script type="text/javascript">
alert("ほげ!");
</script>
と入力して投稿してみてください。文字がでっかく表示され、ダイアログが出現すると思います。これはよろしくありません。このような事態を防いでいるのが$resultsに適用している outputFilter() です。htmlspecialcharsという関数を使うとHTMLのタグがそのまま表示されるよう変換してくれます。array_mapを使って引数$paramが配列でもすべての要素に適用されるようになっています。

このhtmlspecialcharsを使うのはなかなかややこしい話ですがよく理解しておく必要があります。以下の記事が参考になります。
高木浩光@自宅の日記 - プログラミング解説書籍の脆弱性をどうするか, 「サニタイズ言うなキャンペーン」とは何か, ASPとかJSPとかPHPとかERBとか、逆だ..

こうやって自分で書いていると不安になるので要復習。。

出力時のPHP


views/index.php で出力。唯一HTMLと混在する箇所。PHPの書き方も普段と少し変わります。if文やforeach文は { } を使いますがそれだとインデントが無い分見づらいのでコロンを使った記法にしてあります。これは好みの問題かもしれません。echoは

<?=$review['title']?>
のように短く書くこともできます。php.iniのshort_open_tagの設定次第。

次回


さて、これで一応投稿して表示するところまでできました。
次は一度投稿した内容を編集したり削除したり、してみようと思います。

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


みんなの更新記事