SQLの窓

2013年08月31日


PHP に GET で SQL の select 構文(UTF8 で urlencode)を与えて JSON 文字列を返す簡単な処理

eval を使って、動的に配列を作成する文字列を作って(データを埋め込む)、さらに eval で実際の配列を作成してから json_encode します。

データベースは、Windows の MySQL で、PHP も Windows なので、PDO の ODBC を使って処理しています。ですから、MySQL は utf-8 ですが、クライアントアプリは SHIFT_JIS を前提に環境作成しているので、ちょっと変則な文字列変換が行われています。

ただ、そこは本筋とは関係無いので差し替えて考えて下さい。

json_encode が、utf-8 前提なので、『?q=select構文』の日本語部分は utf-8 で urlencode が前提です。

テーブルの列名が日本語の場合は、自動的に item_連番 という形式に列名を変更して JSON に渡します。もし、意図的にその文字列を定義したい場合は、select 構文の列名に英数字(_と-は可)別名を与えて下さい。
<?php
header( "Content-Type: application/json; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

mb_language( "ja" );
mb_internal_encoding("utf-8");

// *********************************************************
// extension=php_pdo_odbc.dll ( php.ini )
// *********************************************************
$conf = array(
	"dns_driver" => "{MySQL ODBC 5.2w Driver}",
	"dns_server" => "localhost",
	"dns_db" => "lightbox",
	"dns_user" => "root",
	"dns_pass" => "パスワード",
	"dns_charset" => "cp932"
);

// **********************************************************
// 接続
// **********************************************************
try {
	$cn1 = new PDO(
		"odbc:Driver={$conf['dns_driver']};Server={$conf['dns_server']};" .
		"Database={$conf['dns_db']};Uid={$conf['dns_user']};Pwd={$conf['dns_pass']};".
		"charset={$conf['dns_charset']}");
}
catch ( Exception $ex ) {
	print '{"error": "接続できませんでした: ' . $ex->getMessage() . '"}';
	exit();
}

//print "<pre>";
//print "接続されました\n";
//print_r($conf);

//print_r($cn1);

// **********************************************************
// SQL
// **********************************************************
$query = mb_convert_encoding( $_GET["q"], "sjis", "utf8" );

// **********************************************************
// 結果セット
// **********************************************************
$rs = $cn1->query( $query );
if ( $rs === false ) {
	$er = $cn1->errorInfo();
	print '{ "error" : "' . $er[2] . '" }';
	exit();
}

// フィールド数
$field_cnt = $rs->columnCount();
// 文字列バッファ
$buffer = "";
$update_cnt = 0;
while( $result = $rs->fetch(PDO::FETCH_ASSOC) ) {
	// ループの最初で列名一覧を作成する
	if ( $buffer == "" ) {
		// 配列に列名を取得
		$field_names = array_keys($result);
		$entry = build_field( $field_names );
		for( $i = 0; $i < $field_cnt; $i++ ) {
			if ( $buffer != "" ) {
				$buffer .= ",";
			}
			$buffer .= $field_names[$i];
		}
	}

	// ***************************************************************
	// 最終 eval に埋め込む為の変数セット( フィールド個々の内容 )
	// $myfield(n) という変数に実際の値をセットしておいて、
	// $myfield(n) という変数を最終文字列に埋め込んで eval する
	// ***************************************************************
	for( $i = 0; $i < $field_cnt; $i++ ) {
		$wk = "$" . "myfield" . ($i+1) . ' = "' . mb_convert_encoding( $result[$field_names[$i]], "utf8", "sjis" ) . '";';
		eval($wk);
	}

	// JSON 文字列に変換する為の配列を作成する文字列
	$x = '$my_json["items"][] = array( ' . $entry  .  ');';
	// eval で $my_json["items"] を作成
	eval($x);
}

// JSON 文字列化
$my_json_string =json_encode($my_json);
print $my_json_string;


// *********************************************************
// フィールド文字列( 連想配列部分作成 )
// 列名が日本語の場合は、item_(n) に変更する
// 指定したい場合は select の 列名記述を as で作成する
// *********************************************************
function build_field( $fields ) {

	$buffer = "";

	$field_cnt = count( $fields );

	for( $i = 0; $i < $field_cnt; $i++ ) {
		if (preg_match("/[^0-9a-zA-Z_\-]+/", $fields[$i])) {
			$field_name = "item_" . ($i+1);
		}
		else {
			$field_name = $fields[$i];
		}
		if ( $buffer != "" ) {
			$buffer .= ",";
		}
		$buffer .= '"' . $field_name . '" => "' . "$" . "myfield" . ($i+1) .  '"';
	}

	return $buffer;

}
?>

関連する記事

PHP : PDO : SQLExpress(SQLServer)の読み込みと同時更新
VB.net 2008 : System.Data.Odbc 接続テスト( MySQL 5.1 )


▼ 『?q=select+%2A+from+%E7%A4%BE%E5%93%A1%E3%83%9E%E3%82%B9%E3%82%BF
+limit+4』で出力したもの 
{"items":[{"item_1":"0001","item_2":"\u6d66\u5ca1 \u53cb\u4e5f","item_3":"\u30a6\u30e9\u30aa\u30ab \u30c8\u30e2\u30e4","item_4":"0003","item_5":"0","item_6":"2013-05-04 00:00:00","item_7":"2013-07-20 00:00:00","item_8":"270000","item_9":"9000","item_10":""},{"item_1":"0002","item_2":"\u5c71\u6751 \u6d0b\u4ee3","item_3":"\u30e4\u30de\u30e0\u30e9 \u30d2\u30ed\u30e8","item_4":"0003","item_5":"1","item_6":"2013-02-06 00:00:00","item_7":"2013-05-10 00:00:00","item_8":"300000","item_9":"","item_10":""},{"item_1":"0003","item_2":"\u591a\u5ca1 \u51ac\u884c","item_3":"\u30bf\u30aa\u30ab \u30d5\u30e6\u30e6\u30ad","item_4":"0002","item_5":"0","item_6":"2013-04-05 00:00:00","item_7":"2013-07-06 00:00:00","item_8":"250000","item_9":"","item_10":""},{"item_1":"0004","item_2":"\u9ad8\u7530 \u51ac\u7f8e","item_3":"\u30bf\u30ab\u30bf \u30d5\u30e6\u30df","item_4":"0003","item_5":"1","item_6":"2013-02-02 00:00:00","item_7":"2013-05-27 00:00:00","item_8":"250000","item_9":"","item_10":""}]}

▼ 以下は整形したもの
{
    "items": [
        {
            "item_1": "0001",
            "item_2": "浦岡 友也",
            "item_3": "ウラオカ トモヤ",
            "item_4": "0003",
            "item_5": "0",
            "item_6": "2013-05-04 00:00:00",
            "item_7": "2013-07-20 00:00:00",
            "item_8": "270000",
            "item_9": "9000",
            "item_10": ""
        },
        {
            "item_1": "0002",
            "item_2": "山村 洋代",
            "item_3": "ヤマムラ ヒロヨ",
            "item_4": "0003",
            "item_5": "1",
            "item_6": "2013-02-06 00:00:00",
            "item_7": "2013-05-10 00:00:00",
            "item_8": "300000",
            "item_9": "",
            "item_10": ""
        },
        {
            "item_1": "0003",
            "item_2": "多岡 冬行",
            "item_3": "タオカ フユユキ",
            "item_4": "0002",
            "item_5": "0",
            "item_6": "2013-04-05 00:00:00",
            "item_7": "2013-07-06 00:00:00",
            "item_8": "250000",
            "item_9": "",
            "item_10": ""
        },
        {
            "item_1": "0004",
            "item_2": "高田 冬美",
            "item_3": "タカタ フユミ",
            "item_4": "0003",
            "item_5": "1",
            "item_6": "2013-02-02 00:00:00",
            "item_7": "2013-05-27 00:00:00",
            "item_8": "250000",
            "item_9": "",
            "item_10": ""
        }
    ]
}



【PHP + データベースの最新記事】
posted by lightbox at 2013-08-31 22:55 | PHP + データベース | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり