FC2ブログ

サラリーマンのすらすらIT日記

IT関連を中心とした日々を綴ります。
--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2010/02/23

Ext JS-EditorGrid その4

今回は、編集したグリッドの中身を保存することを考えます。編集したものの、次に開いたときに編集結果がどこにも残っていないというのは、面白くありませんから。そのためにDBの設定から始めます。

今回DBはFirebirdを使っています。テーブル名はBOOKLIST、フィールド名は"id", "book", "tanka", "kosu", "price", "kei"とします。ここで"id"は今回追加したものです。これはUPDATE文でデータ更新するのにレコード指定するため、値が一意となるフィールドが必要だからです。

サーバから返すデータが

{"rows":[
{"id":1,"book":"今日からつかえるJSP&サーブレット","tanka":"3150","kosu":"","price":"","kei":false},
{"id":2,"book":"Tomcatハンドブック第2版","tanka":"4935","kosu":"","price":"","kei":false},
{"id":3,"book":"jQueryプログラミング入門","tanka":"3150","kosu":"","price":"","kei":false},
{"id":4,"book":"計","tanka":"","kosu":"","price":"","kei":true}
]}


というフォーマットになるようにサーバサイドのPHPプログラムを書きます。

/* DB接続部分は省略 */
$sql = 'SELECT "id", "book", "tanka", "kosu", "price", "kei" FROM BOOKLIST';
$result = $conn->query($sql);
$outData = "{\"rows\":[";
$firstFlagForOuterLoop = true; /* 外側のループ(全レコード分)で最初のデータの場合true */
while ($entry = $result->fetch(PDO::FETCH_ASSOC)) {
if ($firstFlagForOuterLoop != true) {
$outData .= ",";
}
$firstFlagForOuterLoop = false;
$outData .= "{";
$firstFlagForInnerLoop = true; /* 内側のループ(1レコード分)で最初のデータの場合true */
while (list($key, $val) = each($entry)) {
if ($firstFlagForInnerLoop != true) {
$outData .= ",";
}
$firstFlagForInnerLoop = false;
if ($key == "kei") {
$outData .= ($val == 0)
? "\"kei\":false"
: "\"kei\":true";
} else {
$outData .= "\"".$key."\":\"".htmlspecialchars($val, ENT_QUOTES)."\"";
}
}
$outData .= "}";
}
$outData .= "]}";
// データ出力
ob_start();
print $outData;
$out = ob_get_contents();
ob_end_clean();
print $out;


PHPに詳しい方なら、「どうしてjson_encode関数を使わずにガリガリと書くの?」という疑問を持たれると思います。Firebird1.5ではフィールドの型をbooleanにできないので、フィールド"kei"はsmallintにしています。そのため、$keyが"kei"である時、データがゼロの時はfalse、そうでない時はtrueとするための処理を自分で書く必要があるからです。Firebird以外のDBでboolean型があるのであれば、この処理は不要です。

また、SQL文でフィールド名をダブルクォーテーションで囲っているのはFirebird特有のものです。Firebirdではフィールド名が大文字の場合はダブルクォーテーションが不要ですが、小文字が入っている場合にはダブルクォーテーションが必要だからです。PostgreSQLなどではダブルクォーテーションは不要です(MySQLは詳しくありませんが、やはり不要?)。

クライアント側から、http://(サーバ名)/gridTestUpdate.php?id=1&field=kosu&value=1("id"=1のレコードの、フィールド"kosu"を1にする)というリクエストが来た時に、UPDATE BOOKLIST SET "kosu" = 1 WHERE "id" = 1というSQLをDBサーバに送るため、UPDATE用のPHPも用意しておきます。

$id = (isset($_REQUEST['id'])) ? $_REQUEST['id'] : "";
$field = (isset($_REQUEST['field'])) ? $_REQUEST['field'] : "";
$value = (isset($_REQUEST['value'])) ? $_REQUEST['value'] : "";
if ($id !== "") {
$sql = "UPDATE BOOKLIST SET ";
$sql .= "\"" . $field . "\" = " . $value . " ";
$sql .= "WHERE \"id\" = " . $id . ";";
$stmt = $conn->prepare($sql);
$flag = $stmt->execute();
}


クライアント側は次回に。

スポンサーサイト

コメント

コメントの投稿

  • URL
  • コメント
  • パスワード
  • 秘密
  • 管理者にだけ表示を許可する

トラックバック

トラックバックURL:http://sookibizviz.blog81.fc2.com/tb.php/383-8fc35d9e

■  カレンダー

06 | 2019/07 | 08
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

■  プロフィール

sookibizviz

Author:sookibizviz
仕事の内容やソフトの紹介を交えながら、日々の悪戦苦闘を綴っていきます。

■  最新記事

■  最新コメント

■  最新トラックバック

■  月別アーカイブ

■  カテゴリ

未分類 (64)
BizViz (24)
IT (1119)
計量 (76)
環境 (26)
数学 (181)
ニュース (46)
本 (187)
音楽 (113)
囲碁 (5)
将棋 (26)
ブログ (14)
日記 (19)

■  FC2カウンター

■  検索フォーム

■  RSSリンクの表示

■  QRコード

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。