ひねりの無いAjaxアプリを作った



http://kasei-san.sakura.ne.jp/rabo/perlAjaxTest/

これは何?

習作として、perlSQLitejQueryでひねりの無い、ゲストブック風webアプリを作成
作成中に引っかかったこと等を以下にメモります
誰か似たようなの作るときの参考になれば幸いです

仕様

  • サーバとの通信は全てJSON
  • 1ページ10件表示で、現在表示中のページの前後2件と、末尾と先頭のリンクを持つ

sqlite

CPANが入っていれば、

cpan > install DBD::SQLite

で、SQLiteと必要なライブラリがインストールされる。便利

  • 起動方法
%sqlite3 使用するDBファイル名
  • テーブル一覧
sqlite> .tables
  • テーブルの内容取得(dump)
sqlite> .dump テーブル名
  • テーブル生成例
sqlite> CREATE TABLE test (id INTEGER PRIMARY KEY, date INTEGER NOT NULL, name TEXT NOT NULL, text TEXT);
  • PRIMARY KEYを設定しておけば、適当に連番を振ってくれる
  • TEXTは、文字長は特に考慮しない(仕様ではMAXあるのかな?)
  • 型を指定しなくてもそれなりにやってくれる

■参考
SQLite が認識できるクエリー言語

perl

さくらのサーバにCPANを入れる方法


使ったライブラリは、

Error

try,catchの構文が書ける

evalブロックを使う構文もあるけど、それよりセキュアなはず…

DBI
  • 接続
# id、パスワード未指定の場合は、undef
# $dbh == 0 で
my $dbh = DBI->connect("dbi:SQLite:dbname=テーブル名", ID, パスワード, {
    AutoCommit => 0,
    RaiseError => 1,
});

#解除
$dbh->disconnect;

■参考
第3章 クラスメソッドを使いこなす[Perl講座 -Smart]

  • select
# SELECTの結果を連想配列の配列に格納
$dbh->selectall_arrayref(
			"SQL文;",
			 { Columns => {} },
			 ( 変数(カンマ区切り) )


SQLの構文に任意の値を入れるときは、入れたい場所に ? を入れる

# IDが100の情報のみ取得
$dbh->selectall_arrayref(
			"SELECT * FROM テーブル名 WHERE id = ? ;",
			 { Columns => {} },
			 ( 100 )
  • 他のSQL構文を実行
#例としてinsert
my $sth = $dbh->prepare("insert into test (date, name, text) values(?,?,?);");
#bind_paramで、?の中に引数を入れる。
#文字列結合と違って、SQLインジェクションの危険が無い(って事でいいの?)
$sth->bind_param(1, $value);
my $rtnSts = $sth->execute;
  • エラー処理については、後日調査
jQuery

ユーザが入力した値をサーバから取ってきて表示する時は、
.text()で格納してやれば、エスケープしてくれるのでXSSの心配が無い(はず…)


角丸プラグイン
JQuery Corner Gallery

課題・不明点


2008/11/24追記

  • 一般的には、
    • prepare と bind_param を使えば、SQLインジェクションの危険は無いとされているようです
    • jQuery.text で出力すれば、XSS危険性はなくなるとされているようです
  • jQueryで、getJSONとかして、連続した情報を、HTMLに書き出す場合、みんなどうやっているのか?
    • .html()に手書きだと汚くなるし、スタイルシートの整合性をとるのも面倒なので、
      テンプレートとするdivを作って、それをcloneして使ってみたけど、邪道かしら?
  • IE6だとロード中の表示が崩れる。要対策


大体そんな感じ
一応、perlSQLを使った、cgiの作り方は理解
次はもっと面白いの作るぞー!