[PHP-users 13841] Re: SQL文の作成

tamura php-users@php.gr.jp
Sat, 08 Mar 2003 03:32:03 +0900


田村です、まいど。

草薙さん、ありがとうございます。
> 以前私のメールに記した、可変変数を使用されることで *2 の部分がご要望の形
> に近づくとは思います。可変変数についてはお調べになられましたでしょうか?
 大変申し訳ありません。教えていただいたときは、まだよく理解できず、自分
には使えないと、思い込んだままで過ごしてしまいました。重ね重ね申し訳あり
ません。

返事の順序が逆になりますが、
> お節介かも知れませんが、色々やってみた内容を全て書いて頂けると、田村様が
> 失敗した原因が特定できるかもしれませんし、私の方で同じ失敗をしてしまうこ
> とを防げるかもしれません。

 ご面倒をおかけしますが宜しくお願いいたします。趣旨了解いたしました。失
敗例ですが、関数は、

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);
  return($result);
}
で、汎用のカラム(連想配列)を、

$COL_DATS = array ($fdname[1]=>$fdname[1], $fdname[2]=>$fdname[2], $fdname[3]=>$fdname[3]);
$where = "$fdname[0]=".$category_id;

として、

$sql = updatesql($svname, $tbname, $usname, $psname, $COL_DATS, $where);

としますと、各項目に、category_code、category_name、category_explainのよ
うな項目名がデータとして入ります。そこで、---(イの部分を
   
$set .= (strlen($dat) == 0)? "{$key}=NULL,": "{$key}='${$dat}',";

に、変更しますと、各項目に、$category_code、$category_name、$category_explain
がデータとして入ります。
 以前は、ここまででした。

--------※うまくいきました※-------

今回、関数を呼ばずに実行部に、関数部分を直接書込みテストしました。
 うれしいことに、思い通りにできました。(大感謝)
 ただ、汎用性を高めるために、

$COL_DATS = array ($fdname[1]=>$fdname[1], $fdname[2]=>$fdname[2], $fdname[3]=>$fdname[3], $fdname[4]=>$fdname[4], $fdname[5]=>$fdname[5]);

のように、敢えて実際の項目数よりも多く書き込んでテストしますと、案の定、

UPDATE m_category SET category_code='006',category_name='創薬',category_explain='なにぬねの',=NULL where category_id=4Record 

「,=NULL」の部分が邪魔をして、動きません。
 現在は、ここまでですが、今回大きな前進をみました。皆様、ありがとうござ
います。

> 各フィールドと同じ名称の変数に代入すべき値が入っているとすれば、下記コー
> ドのような処理をすれば *1 〜 *2 の代替になるかと思います。未検証ですが。
> 
> $cnt      = 0;
> $COL_DATS = array();
> 
> $result   = mysql_list_fields( $dbname, $tbname, $conn);
> 
> while ( $cnt < mysql_num_fields( $result)) {
>     $fdname[$cnt]            = mysql_fieldname( $result, $cnt);
>     $COL_DATS[$fdname[$cnt]] = ${$fdname[$i]};
>     ++$cnt;
> }

 上のテストをしていたため、まだ試せておりません。後日、挑戦しまして、報
告致します。

> 
> もちろん、変数が未定義だった場合や、register_globals = On で変数が汚染さ
> れていた場合等を考慮する必要はあるかとは思いますが。
 はい、調べて試します。

> 
> # 私にはこの方向性でのモジュール化にあまりメリットは感じられません。
 モジュール化しなければ、うまくいきました。(ちょっと、意味のすれ違いが
あるかな〜)