- ベストアンサー
[PHP] 配列内の値の料理の仕方で分からないです
- 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」を用いています。汚いコードで申し訳ないですが、自分ではわからなくなってしまいました。アドバイスの程宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
私のコードをそのままコピペしてそうなるとは考えにくいですが、ご自分で編集されたのでしょうか?同一のSQL文をコマンドラインから発行するのとPHPから発行するので差がある場合はPHPのバグってことも考えられなくは無いですが・・・それにしてもちょっとあり得ない気がします・・・
その他の回答 (2)
- Onuma0519
- ベストアンサー率0% (0/1)
>>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」を連結します。 これにより、クエリ文を生成し、実行します。
お礼
Onuma0519 様 ご教示いただきましてありがとうございました。 無事解決いたしました! そして、勉強になりました! お忙しい中、本当にありがとうございました。
補足
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のやり方が悪いのかもしれません。 私の何が悪いか目につく部分がありましたら、ご指摘いただけますとありがたい次第です。 度々大変恐縮でありますが、 アドバイスいただけますと大変ありがたいです。
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で定義されたクラス同様です。
補足
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のやり方が悪いのかもしれません。 再度で大変申し訳無いですが、 アドバイスいただけますと大変ありがたいです。
お礼
To_aru_User さん 大変失礼しました。 どこを間違えたか、未だにわからないのですが、 改めて書き換えをしたところ、 きちんと、意図したSQLにすることができました! 本当にありがとうございました。 リンクでご案内いただきましたページも 今後の勉強の参考に是非させていただきます。 ありがとうございました。