[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 で変数が汚染さ
> れていた場合等を考慮する必要はあるかとは思いますが。
はい、調べて試します。
>
> # 私にはこの方向性でのモジュール化にあまりメリットは感じられません。
モジュール化しなければ、うまくいきました。(ちょっと、意味のすれ違いが
あるかな〜)