• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[PHP] 配列内の値の料理の仕方で分からないです)

[PHP] 配列内の値の料理の仕方で分からないです

このQ&Aのポイント
  • PHPスクリプトを勉強したての初心者です。PHPでMySQLから値を取得し、取得した値を用いて、更に別のSQLを発行しようとしているのですが、どうも自分の意図したとおりの動作に出来ず悩んでいます。
  • まずはSQL01の部分にて、「uline」テーブルから、where句で指定した条件にマッチする「station」カラムの値を引っ張ってこようと思います。SQL01の部分で引っ張ってくる「station」カラムの値が2つであった場合、具体的には、「omiya」と「urawa」の2つであった場合、このコードでは、その後のSQLにある「upadte uline set flag='1' where station not in ('$_station') 」の部分で、2回のupdateが走るようになると自分では思っていますが、これを、「upadte uline set flag='1' where station not in ('omiya','urawa') 」と、1回のupdate文で完結するようにするには、どうするといいかが分からないでいます。
  • PHPは「PHP 5.3.9」でOSは「CentOS 5.9」を用いています。汚いコードで申し訳ないですが、自分ではわからなくなってしまいました。アドバイスの程宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

私のコードをそのままコピペしてそうなるとは考えにくいですが、ご自分で編集されたのでしょうか?同一のSQL文をコマンドラインから発行するのとPHPから発行するので差がある場合はPHPのバグってことも考えられなくは無いですが・・・それにしてもちょっとあり得ない気がします・・・

vfr_rooom
質問者

お礼

To_aru_User さん 大変失礼しました。 どこを間違えたか、未だにわからないのですが、 改めて書き換えをしたところ、 きちんと、意図したSQLにすることができました! 本当にありがとうございました。 リンクでご案内いただきましたページも 今後の勉強の参考に是非させていただきます。 ありがとうございました。

その他の回答 (2)

回答No.2

>>while ($row=mysql_fetch_array($ADATA)){ >> $_station=$row["A"]; >> if(!$res=mysql_query("upadte uline set flag='1' where station not in ('$_station') ")){ >> echo "SQL errorA<br>"; >> exit; >> } >> } //while end 上記の部分を次のようにします。 $_station = array(); //変数の初期化 while ($row=mysql_fetch_array($ADATA)){ $_station[] = $row["A"]; //配列に格納します。 } //while end $updateSQL = "upadte uline set flag='1' where station not in ('".implode("', '", $_station)."')"; if (!$res=mysql_query($updateSQL)){ echo "SQL errorA<br>"; exit; } 配列に「omiya」「urawa」の文字列を格納しておき、 implode関数により、「','」という文字列で配列の値「omiya」「urawa」を連結します。 これにより、クエリ文を生成し、実行します。

vfr_rooom
質問者

お礼

Onuma0519 様 ご教示いただきましてありがとうございました。 無事解決いたしました! そして、勉強になりました! お忙しい中、本当にありがとうございました。

vfr_rooom
質問者

補足

Onuma0519 様 ご丁寧にご教示いただきまして、本当にありがとうございます。 ちょっと私の説明が足りなかったんだと思います。 意図していた内容と異なる結果を得てしまいました。 $SQL01の結果ですが、下記のように表示される中で、 mysql> select distinct station as A from uline where station_type='1' +--------+ | A | +--------+ | omiya | | urawa | +--------+ 2 rows in set (0.00 sec) implodeを用いたところ、 「update uline set flag = 1 where station not in ('omiya','urawa')」 としたいところ、 「update uline set flag = 1 where station not in ('omiya')」 となってしまいました。 私のimplodeのやり方が悪いのかもしれません。 私の何が悪いか目につく部分がありましたら、ご指摘いただけますとありがたい次第です。 度々大変恐縮でありますが、 アドバイスいただけますと大変ありがたいです。

noname#244856
noname#244856
回答No.1

implode http://php.net/manual/ja/function.implode.php この関数を使えば簡単にできるでしょう。 (全角スペースでインデントしているので半角スペースに直してください) 【書き換え前】 while ($row = mysql_fetch_array($ADATA)) {  $_station = $row["A"];  if (!$res = mysql_query("upadte uline set flag='1' where station not in ('$_station') ")) {   echo "SQL errorA<br>";   exit;  } } 【書き換え後】 $stations = array(); while ($row = mysql_fetch_assoc($ADATA)) {  $stations[] = mysql_real_escape_string($row['A']); } if ($stations) {  $sql = sprintf('UPDATE `uline` SET `flag` = 1 WHERE `station` NOT IN (%s)',   implode(',', $stations)  );  if (!$res = mysql_query($sql)) {   echo 'SQL errorA<br>';   exit;  } } 提示されたコードは "やってはいけないこと" を何か所もやってしまっているので、こちらを参考に見直してください。 http://qiita.com/mpyw/items/b00b72c5c95aac573b71 クラスとオブジェクトを扱うのがはじめての場合はこちらもどうぞ。 http://ponk.jp/php/basic/object 「PDO」はPHPの組み込みクラス(C言語で最初から定義されているクラス)ですが、使い方はPHPで定義されたクラス同様です。

vfr_rooom
質問者

補足

To_aru_User 様 ご丁寧にご教示いただきましてありがとうございました。 色々と参考になる内容で、本当にありがたいです。 ちょっと私の説明が足りなかったんだと思います。 意図していた内容と異なる結果を得てしまいました。 $SQL01の結果ですが、下記のように表示される中で、 mysql> select distinct station as A from uline where station_type='1' +--------+ | A | +--------+ | omiya | | urawa | +--------+ 2 rows in set (0.00 sec) implodeを用いたところ、 「UPDATE uline SET flag = 1 WHERE station NOT IN ('omiya','urawa')」としたいところ、 「UPDATE uline SET flag = 1 WHERE station NOT IN ('omiya')」となってしまいました。 私のimplodeのやり方が悪いのかもしれません。 再度で大変申し訳無いですが、 アドバイスいただけますと大変ありがたいです。