[PHP-users 12668] SQL queryを外部ファイルより取得する方法

php-users@php.gr.jp php-users@php.gr.jp
Mon, 20 Jan 2003 17:39:23 +0900 (JST)


澤井といいます。

SQL queryを外部ファイルより取得するソースを作成しています。
 処理の内容としては、
 1.queryを外部ファイルとして定義する(xxxx.sql)
  (queryの可変部の記述を、{$XXXX}形式で記述する) 

 queryの例
 ---------------------------------
 select * from test_master
 where host_id="{$host_id}"
 and     class_id="{$class_id}"   #可変部分を{$XXXX}形式で定義する。
 and     class_val={$class_val}
 -----------------------------------

 2.phpよりユーザ関数を呼び出し、可変部分が置換された結果を戻り値とする。
 

下記に示すソースで、とりあえず実現可能だという手応えはつかめましたが。
 もっとスマートな記述ができないかと思っています。
(phpの経験が少ない為、自信が有りません)

  #処理抜け、考慮不足、間違いの指摘、あるいは、
  現在同様な処理を行っている場合は、そのやり方等、
  アドバイスお願いします。
   
     
   
## php4.2.4 ##
<?
/*==============================================*/
/*	外部クエリー読込みSUB			*/
/*==============================================*/
function external_query_set($file_path){
	//外部クエリーの読み込み
	$external_query=join(file($file_path)," ");
	if(!$external_query){		//エラーCHK
		print "file 読込みエラー\n file_path=".$file_path."\n";
		return false;
	}
	//置換キー("{$XXXX}"形式の文言)の抽出
	$match_count=preg_match_all("/
\{[\$].*\}/",$external_query,$row);
	if($match_count==0){ 		//エラーCHK(No match)
		print "置換キーなし\n";
		return false;
	}
/*-- Loop 1 start 置換キー回数のLoop(重複キーはskip)---*/
	foreach (array_count_values($row[0]) as $key=>$val){
		//不要部を削除
		$rep_key=ereg_replace("[\{\$\}]","",$key); 
		//エラーCHK(変数名の妥当性)
		if(!ereg("^[a-zA-Z_][a-zA-Z0-9_]*",$rep_key)){
	
			print "置換キーが変数名として正しくない。\n";
			return false;			
	
		}
		
		global ${$rep_key};
		$var_chk=${$rep_key};
		if(gettype($var_chk) == "NULL"){
			print "変数($rep_key)が定義されていない。\n";
			return false;
		}
		$external_query=str_replace
($key,${$rep_key},$external_query); //
	}
/*-- Loop1 end -----------------------------------------*/
		return $external_query;
}

/*==============================================*/
/*	MAIN					*/
/*==============================================*/
$host_id="testserv01";
$class_id="testcls01";
$err_test="";
$class_val=1111;
$query=external_query_set("./test.sql");
if($query !=false){
	print "QUERY=".$query."\n";
}
?>


################################
## SQLファイル(test.sql)         ##
################################

select * from test_master
where host_id="{$host_id}"
and     class_id="{$class_id}"
and     class_val={$class_val}

################################