Top > diary > 2007-01-28

***odbc_sql.inc.php [#s6d9f1a5]
 別件で色々調べていたらODBCの利用方法があったのでプラグイン化してみました。
-classの使い方がわからず色々と試しているのですが、これにも微妙に使ってみました。
-Windows環境で利用する目的なので、イントラネットしか想定していません。
-一応MS Accessで動作確認しました。SQLはAccessのクエリーで展開したものをコピペしてチェックしました。
-このプラグインを元にカスタマイズすれば自分好みに色々出来そうですね。
-寝ぼけながら作ったのでミスがあったら教えてください。

>
- Note/diary/2007-01-28 upkさんの指摘にもあるようにSQLがダイレクトで利用できるのはLAN上でも危険です。&br;これの利用は個人的なSQLチェックもしくはシステムDSNでReadOnlyを必ず有効にして置いてくださいorz。[http://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3#.E5.AF.BE.E5.BF.9C.E6.96.B9.E6.B3.95 SQLインジェクション] -- [[taru]] &new{2007-01-28 (日) 17:32:15};
- 続いて、アドバイス頂いて凍結時のみ動作するように変更してみました。又、内部文字コードがSOURCE_ENCODINGで定義されている事に今ごろ気が付いたので使うように修正しました。 -- [[taru]] &new{2007-01-29 (月) 20:59:48};

#ref(odbc_sql.inc.php.0.2)
//cut
#code(php){{{{
<?php

// odbc_sql.inc.php, 0.2 2007/01/29 taru		plugin

define( '_PLUGIN_ODBC_SQL_NAME',     'odbc_Access');	//ODBCに作ったDSN名
define( '_PLUGIN_ODBC_SQL_USER',     'taru');			//DNSに接続するユーザ名
define( '_PLUGIN_ODBC_SQL_PASSWORDP','');			//DNSに接続するパスワード
define( '_PLUGIN_ODBC_SQL_MB_C_E',    true);			//文字エンコーディング変換をする
define( '_PLUGIN_ODBC_SQL_MB_TO',     'SJIS');			//データベースの文字コード

function plugin_odbc_sql_convert()
{

	global $vars;	//'07.01.29追加
	if (! is_freeze($vars['page']) ) 
		return 'このプラグインはページが凍結されていないと有効になりません。';	//'07.01.29追加

	$args = func_get_args();	//オプションを取得

	$sql = array_pop($args);	//複数行オプションをSQL文とする
	if ( $sql == '' ) 
		return 'SQL文の指定がありません';	//SQL文が存在しない時メッセージを出力して終了

	if ( isset( $args[0] ) ) {	//通常オプションの指定があれば変数展開
		foreach ($args as $opt_data) {
			list($key, $val) = explode('=', $opt_data);
			$opt[strtolower($key)] = $val;
		}
	}
	//オプション、defineどちらの値を使うかは、オプション指定されているかで決める
	$dsn_name = (isset($opt['name'])) ? $opt['name'] : _PLUGIN_ODBC_SQL_NAME;
	$dsn_user = (isset($opt['user'])) ? $opt['user'] : _PLUGIN_ODBC_SQL_USER;
	$dsn_pass = (isset($opt['pass'])) ? $opt['pass'] : _PLUGIN_ODBC_SQL_PASSWORDP;
	$db_char  = (isset($opt['char'])) ? $opt['char'] : _PLUGIN_ODBC_SQL_MB_TO;

	$u_func = new OdbcSqlFunction($db_char);

	$body = '<pre>' . htmlspecialchars($sql) . '</pre>';

	$sql = $u_func->mb_chg($sql);	//文字エンコード

	//ODBCに接続
	$odbc_id = odbc_connect( $dsn_name, $dsn_user, $dsn_pass);

	//SQLの実行
	$db_data = odbc_exec($odbc_id, $sql);

	

	if (! $db_data) return 'データを取得できませんでした。';

////	データを表示する	////

	$column = odbc_num_fields($db_data);	//列数
	$row    = 1;							//行番号用変数


	//フィールド名
	$body .= "\n <thead><tr>\n";
	for( $i = 1; $i <= $column; $i++) {
		$body .= '   <td class="style_td">' . $u_func->mb_chg_chg(odbc_field_name($db_data, $i)) . '</td>';
	}
	$body .= "\n  </tr></thead>\n";

	//行データ
	while(odbc_fetch_row($db_data, $row++)){
		$body .= "\n  <tr>\n";
		for( $i = 1; $i <= $column; $i++) {
			$body .= '   <td class="style_td">' . $u_func->mb_chg_chg(odbc_result($db_data, $i)) . '</td>';
		}
		$body .= "\n  </tr>\n";
	}

	$body = '<table class="style_table" cellspacing="1" border="0">' . $body . '</table>';


	$ret = odbc_close($odbc_id);//データベースへの接続を閉じる
	
	return $body;
}

class OdbcSqlFunction
{
	var $char;

	function OdbcSqlFunction($db_char)
	{
		$this->char = $db_char;
	}
	function mb_chg($data)
	{
		if (! _PLUGIN_ODBC_SQL_MB_C_E) return $data;
		return mb_convert_encoding($data, $this->char, SOURCE_ENCODING);
	}
	function mb_chg_chg($data)
	{
		if (! _PLUGIN_ODBC_SQL_MB_C_E) return $data;
		return mb_convert_encoding($data, SOURCE_ENCODING, $this->char);
	}
}
?>
}}}}

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes