[PHP-users 13836] SQL文の作成

tamura php-users@php.gr.jp
Fri, 07 Mar 2003 21:40:12 +0900


田村です、まいど。
 (勝手ですが、subject「関数の戻り値の使い方」を変更いたしました)

中村@ActiveSeedさん、ありがとうございます。

 説明が下手でご迷惑をおかけします。整理して書きますので皆様よろしくお願
いいたします。

 通常UPDATEをする場合、例えば、

$sql = "UPDATE tbname SET category_code='$category_code', category_name='$category_name', category_explain='$category_explain' WHERE category_id=$category_id";
$result = mysql_query($sql);

とします。そしてテーブルが変わるたびに

$sql = "UPDATE tbnameA SET fdname1='$fdname1', Bfdname2='$Bfdname2',
fdname3='$fdname3' WHERE fdname0=$fdname0";

とか

$sql = "UPDATE tbnameB SET fdnameB='$fdnameB', fdnameC='$fdnameC',
fdnameD='$fdnameD' WHERE fdnameA=$fdnameA";

などとします。そこで、あるところで作ったものを、別のところで再利用できれ
ば効率が上がります。$sql文も汎用に作成できないかと考え、その関数を作るこ
とにしました。
 その関数をupdatesql('テーブル名','カラム/連想配列','検索条件')とする、
アイデアをキタムラさんからいただきました。


まず、テーブル名は、変数$tbnameに、利用するテーブル名を

$tbname=tbnameAや $tbname=tbnameB

とすることで、うまくいきます。

検索は、各テーブル共通名の項目id を常に使うように、固定することにして、
$where = "id=".$id;

で、よし。

カラムも、このような利用をしたいと、

$cnt=0;
$result=mysql_list_fields($dbname, $tbname, $conn);
while ($cnt<mysql_num_fields($result)){
  $fdname[$cnt]=mysql_fieldname($result, $cnt);
  $cnt++;
} --------<*1>
で、カラム名を汎用に取得し、
$COL_DATS = array (
     //例えば、
category_code=>$category_code, category_name=>$category_name,
category_explain=>$category_explain
     //を、この配列部分を 取得した$fdnameを使って
     //同一意味になるように(この部分がまだわからない---<*2>)
);
準備をして、

$sql=updatesql('テーブル名','カラム/連想配列','検索')

として、関数を呼ぶ。

その関数は以下です。(テストしやすいように、引数が多いですが、問題ないと
思います)

function updatesql($svname, $tbname, $usname, $psname, $COL_DATS,
$where){
  $set = ' SET ';
  foreach ($COL_DATS as $key => $dat){
    $set .= (strlen($dat) == 0)? "{$key}=NULL,": "{$key}='{$dat}',";
  }
  $set = chop($set, ',');
  $sql  = 'UPDATE '.$tbname.$set.' where '.$where;
  $conn = mysql_connect($svname, $usname, $psname);
  $result = mysql_query($sql, $conn);---<*3>
  return($result);
}



> しかし関数に渡す引数をわざわざ記述する手間があるなら関数など使わずに
> SQL文をそのまま記述したほうが早いだろって他の誰かに突っ込まれそうですけど
> (^^;
 そうです。ですから、<*1>で求めたものを、有効に使いたいのです。

> あと、わざわざ「SQL文」を独自の関数を利用して作成し戻り値で受け取り、
> 呼び出し元のルーチンで実行処理するっていうのも無駄が多いですよね
> 関数内で実行処理まで終わらせるほうがスマートです

 関数内で実行処理させております。<*3>


 <*2>を、いろいろやってみたのですが、$dat部に、データが入ってなくて、
$keyに$がついた、$datの中身が$category_name などとなってしまいます。値が
どうしても渡せません、と言うか、渡すほうの記述が悪いのだと。

以上大変長文で、ご迷惑をおかけ致しますが、よろしくお願いいたします。