CodeIgniterの学習 31 - JSONヘルパを試す(住所郵便番号検索作成その3 )

今日はXML-RPCライブラリを使うのをやめて、
JSONヘルパ (http://codeigniter.com/wiki/JSON_Helper/)を試してみる。
(CodeIgniter標準のヘルパではない。)



本当は、外部連携(webapi)させることも視野に入れて、xmlrpcを噛まして、

1:画面(検索条件入力)
↓↑
2:xmlrpcクライアント(1のパラメータ受付後3に通信、結果を XMLJSONシリアライズした文字列 の任意の形式で1に戻す)
↓↑
3:xmlrpcサーバ(2から検索条件を受け、DB問い合わせ、結果を2に返送)


みたいな流れにしたかったのだが、
3で返送するデータのフォーマット($response) を作るのが面倒なだけで面白くなかったのでやめた。

クエリ結果を渡すと、一気にレスポンスフォーマットを自動で作ってくれればいいのになあ。



俺の理解力が悪いのか、
それともXML-RPCクラスの出来が悪いのか、
簡単な処理を投げて簡単な戻り値を得る程度にだけ使うべきなのか。

いつかもう一度XML-RPCでデータ受け渡ししてみる。



JSONヘルパの設置方法

というわけで、XML-RPCは一旦あきらめて、JSON形式でデータを返せるようにしてみる。
(xajaxで実装する予定だから、あまり使うつもりは無いけど。何事も実践)


http://codeigniter.com/wiki/JSON_Helper/ に行って
File:json helper pengekcs.zip をダウンロードして解凍し、

json_helper.php と、
JSON.php
application/helpers/ に設置する。(JSON.phpをヘルパに置くのは微妙だと思うが一応指示通りに)


動作確認コード

まだまだ作成中、クエリも適当。
zipcodeを入れると結果が返ってくる。

(var_dumpで、結果の配列とjsonエンコードされたデータを表示している。)

application/controllers/zipcodesrv.php

<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
//郵便番号、住所取得、ただいま作成中
class Zipcodesrv extends Controller {
  // コンストラクタ
  function Zipcodesrv()
  {
    parent :: Controller();
    $this -> load -> helper( 'json' );
  } 
  // 郵便番号→住所
  function za( $zipcode = null, $limit = 10, $offset = 0 )
  {
    $zipcode = $this -> input -> xss_clean( $zipcode ); //ここでxssフィルタしておく
    $regexp = "#^(\d{3})-?(\d{0,4})$#iu";
    $zipcode = mb_convert_kana( $zipcode, "a" ); //全角数字も半角数字に変換して問い合わせる
    $data = array();
    $data["errormsg"] ="";

    if ( !preg_match( $regexp, $zipcode ) ) {
      // 変な郵便番号は認めませんよ
      $data["errormsg"] = "正しい郵便番号を入れてください";
    }else {

      // パラメータのフィルタをしておく
      // 郵便番号
      $zipcode = preg_replace( $regexp, "\\1\\2", $zipcode ); 

      // リミット
      $limit = is_integer( $limit ) ? ( int ) $limit  : 10 ; 
      // オフセット
      $offset = is_integer( $offset ) ? ( int ) $offset : 0 ; 


      // 検索条件
      $this -> db -> like( 'zipcode', $zipcode, 'after' ); 
      // データ取得のリミットとオフセット
      $this -> db -> limit( $limit, $offset ); 
      // データ取得
      $query = $this -> db -> get( 'zipcode' );
      var_dump($query);
      $cnt = $query -> num_rows();
      if ( $cnt ) {
        foreach( $query -> result_array() as $k => $row ) {
          foreach( $row as $col => $val ) {
            $data[$k][$col] = $val;
            
          }
        }
      }else{
        $data["errormsg"] = "見つからない";
      }
    } 
    var_dump($data);
    $enc_data = json_encode( $data ); 
    echo '<textarea rows="40" cols="90">'.var_export($enc_data,true)  .'</pre>';
  }

} //endofclass


/* 使う予定のカラム達
code VARCHAR(6) NOT NULL,          #  1. 全国地方公共団体コード(JIS X0401、X0402)……… 半角数字
old_zipcode VARCHAR(5) NOT NULL,   #  2. (旧)郵便番号(5桁)…… 半角数字、空白トリム
zipcode VARCHAR(7) NOT NULL,       #  3. 郵便番号(7桁)………… 半角数字
kana_pref VARCHAR(64) NOT NULL,    #  4. 都道府県名 ………… 全角カタカナ(コード順に掲載)
kana_city VARCHAR(127) NOT NULL,   #  5. 市区町村名 ………… 全角カタカナ(コード順に掲載)
kana_street VARCHAR(127) NOT NULL, #  6. 町域名 ……………… 全角カタカナ(五十音順に掲載)
pref VARCHAR(64) NOT NULL,         #  7. 都道府県名 ………… 漢字(コード順に掲載)
city VARCHAR(127) NOT NULL,        #  8. 市区町村名 ………… 漢字(コード順に掲載)
street VARCHAR(127) NOT NULL,      #  9. 町域名 ……………… 漢字(五十音順に掲載)
*/

/**
 * End of file zipcodesrv.php
 */
/**
 * Location: ./application/controllers/zipcodesrv.php
 */
 ?>


画面

var_dumpはこんな感じ


JSONエンコード結果はこんな感じ


なんかエンコード出来てるっぽい。これで結果をjavascriptでこねくり回せる。




忙しいので今日はここまで。明後日くらいに次にいくつもり。