開発メモ,主に補足by子連れ親父プログラマー

2012-07-08

一つ目を選択したら二つ目のセレクトの値が変化するようにしたいんだが、ソースの文字コードがEUCでjqueryのload()を使って読み込むと文字化けしてしまう。


一つ目を選択したら二つ目のセレクトの値が変化するようにしたいんだが、ソースの文字コードがEUCでjqueryのload()を使って読み込むと文字化けしてしまう。



文字コードがEUCなのは昔のソースなのでしょうがない。
いまさら直しようがない。
jquery の load() だと化けるってのもしょうがないだろう。調べるだけ無駄だ。
ということで、php側で一旦データを全部読み込んで、それをJSON形式のデータにして、直接javascriptのスクリプト部分に埋め込むことにしよう。

データのイメージ:
一つ目のセレクトがこんな感じであって、選択すると、

<select name="category_id">
    <option value="0">爬虫類</option>
    <option value="1">鳥類</option>
    <option value="2">昆虫option>
</select>
こんなようなデータが読み込まれて二つ目のセレクトが生成される。(鳥類だったら"1"のデータがセレクトになる)

var per_array ='{
    "0":{
        "1":"トカゲ",
        "2":"ワニ",
        "3":"ザリガニ",
    },
    "1":{
        "4":"スズメ",
        "5":"ハト",
        "6":"トンボ"
    },
    "2":{
        "7":"コオロギ",
        "8":"バッタ"
    }
}';

データベースにはこんな感じで入っている。

SELECT * FROM ikimono;
 id | category_id |   name   
----+-------------+----------
  1 |           0 | トカゲ
  2 |           0 | ワニ
  3 |           0 | ザリガニ
  4 |           1 | スズメ
  5 |           1 | ハト
  6 |           1 | トンボ
  7 |           2 | コオロギ
  8 |           2 | バッタ
(8 rows)

まず、データベースから値を読み込んで、JSON形式のデータを作成する。

$query = "SELECT id, name, category_id FROM ikimono";
$result = pg_query($pg, $query);
$n = pg_numrows($result);
if ($n){
    for ($i=0;$i<$n;$i++){
        $id = pg_result($result, $i, 0);
        $name = pg_result($result, $i, 1);
        $category_id = pg_result($result, $i, 2);
        // ここで一個一個配列に入れておいて
        $select_array[$category_id] .= '"'.$id.'":"'.$name.'",';
    }
}
// ここでカテゴリー別に {} で囲む
foreach($select_array as $k => $v) {
    $v = preg_replace('/,$/', '', $v);
    $ikimono_data .= '"' . $k . '":{' . $v . '},';
}
$ikimono_data = preg_replace('/,$/', '', $ikimono_data);// 最後のカンマを削除

で、ページ表示部分のjavascript部分をこんな感じで。
配列の定義のところに直接phpでデータを埋め込む。


<script>
$(document).ready(function(){
    $('select[name=category_id]').change(function(){
        var category_id = $(this).val();
        var ikimono_array ='{<?php echo $ikimono_data; ?>}';
        var obj = jQuery.parseJSON(ikimono_array)[category_id];
        var ikimono_select = '';
        for (key in obj) {
            ikimono_select += '<option value="'+key+'">' + obj[key] + "</option>";
        }
        $('select[name=ikimono_id]').empty().append(ikimono_select);
    }).change();
});
</script>

二個目のセレクトは空っぽで用意しておく。

<select name="ikimono_id">
</select>

もっと他にいい方法がありそうな予感が大いににするが、とりあえずこんなところで。

2012-07-01

登録日と更新日のフィールドがあって、その中で一番新しい日付を一発でセレクトするクエリー(CASE文とMAX)

登録日と更新日のフィールドがあって、その中で一番新しい日付を一発でセレクトするクエリー(CASE文とMAX)

登録日が created で、更新日が modified で、データを新規登録した時にね、
created には insert するけど、modified にはしない。
本当に編集した時だけ modified に入れるようなプログラムになってたとするじゃないですか。

そうするとデータはこんな感じになる訳で。

          created           |          modified          
----------------------------+----------------------------
 2009-03-17 10:18:24.792449 | 2009-03-17 10:32:55.900294
 2009-03-25 19:32:18.205694 | 
 2009-03-26 14:44:18.787866 | 
 2009-03-30 16:56:56.128813 | 
 2012-06-22 18:26:11.540513 | 
 2012-06-23 12:18:09.649044 | 
 2012-06-22 18:26:37.815316 | 2012-06-26 15:07:45.34223
 2012-06-21 12:46:03.151537 | 2012-06-26 16:44:05.811683
 2012-06-26 19:05:44.473284 | 2012-06-26 20:15:18.196717
 

modified は NULL になってるデータがある訳です。

こういう状態で、更新があった一番新しい日付をセレクトせよ、ってことなんですが。。。


 SELECT MAX(CASE WHEN modified IS NULL THEN created ELSE modified END) AS dates FROM items;
 

これでこうなる。

           dates            
----------------------------
 2012-06-26 20:15:18.196717
(1 row)
まあ、最初っから両方入れとけよって話ですね。



このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー