[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}
################################