[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」を用いています。汚いコードで申し訳ないですが、自分ではわからなくなってしまいました。アドバイスの程宜しくお願い致します。
回答を見る
  • ベストアンサー

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

PHPスクリプトを勉強したての初心者です。 PHPでMySQLから値を取得し、取得した値を用いて、 更に別のSQLを発行しようとしているのですが、 どうも自分の意図したとおりの動作に出来ず悩んでいます。 アドバイスいただけますと、とてもありがたいです。 下記のようなPHPスクリプトで、 まずはSQL01の部分にて、 「uline」テーブルから、where句で指定した条件にマッチする 「station」カラムの値を引っ張ってこようと思います。 SQL01の部分で引っ張ってくる「station」カラムの値が2つであった場合、 具体的には、例えば「omiya」と「urawa」の2つであった場合、 このコードでは、 その後のSQLにある、 「upadte uline set flag='1' where station not in ('$_station') 」の部分で、 「upadte uline set flag='1' where station not in ('omiya) 」と 「upadte uline set flag='1' where station not in ('urawa') 」とで 2回のupdateが走るようになると自分では思っていますが、 これを、 「upadte uline set flag='1' where station not in ('omiya','urawa') 」と、 1回のupdate文で完結するようにするには、 どうするといいかが分からないでいます。 PHPは「PHP 5.3.9」でOSは「CentOS 5.9」を用いています。 汚いコードで申し訳ないですが、自分ではわからなくなってしまいました。 アドバイスの程宜しくお願い致します。 ---- <?php if(!$con=@mysql_connect("localhost","username","password")){ echo "error connect DB"; exit; } //stationカラムには、「omiya」,「urawa」の2レコード分が引っかかる想定 $SQL01="select distinct station as A from uline where station_type='1'"; if(!$ADATA=mysql_query($SQL01)){ echo "SQL errorA"; exit; } 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 mysql_close($con); ?> ----

  • PHP
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
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のやり方が悪いのかもしれません。 再度で大変申し訳無いですが、 アドバイスいただけますと大変ありがたいです。

関連するQ&A

  • PHPで、配列に値をうまく入れれません。

    PHP初心者です。 PHP、Mysqlを使い、検索サイトを作ろうとしています。 チェックボックスでチェックされた値を、一覧.phpに送り、 if(チェックされた値) { $sql1 = select * from table where like '%検索%'; } $sql1の結果を配列に入れて、そのidで以下のように絞込をしたいのですが・・・ $sql2 = select * from table id = $sql1(ここで例えば2,5,7とかって入ってほしい); ググってfetchやらなんやら試したのですが、2,5,7がはいってたとしたら、最後の7だけしか取り出せなかったりと苦戦しています。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • どんなSQL文にすればいいか悩んでいます

    MySQLは「5.1」をCentOS5.8上で使っています。 - date,station 2013-11-01,urawa 2013-11-01,omiya 2013-11-01,omiya 2013-11-02,omiya 2013-11-02,akabane 2013-11-02,ikebukuro 2013-11-02,omiya - 日付ごとのdistinctなstationの個数について、 1ヶ月分の合計数を出すためのSQLを作りたいと思っています。 上の例で言うと、 2013-11-01はdistinctなstationは2個 2013-11-02はdistinctなstationは3個なので、 2013-11分の合計として、 「5」個という数を出したいと思っています。 - select count(distinct station) from table_name where date like '2013-11-%' - とすると日付の区別もなく、 固有のstationの個数として「4」個と出てきてしまい、 どうしていいか分からないでいます。 どんなSQLを作れば、 日付ごとの「distinctなstation数」の1ヶ月分の合計値を出すことが出来るでしょうか。 教えていただけますと幸いです。

    • ベストアンサー
    • MySQL
  • 配列に値が入らない

    PHP初心者です。 <?php $sql = sprintf('SELECT * FROM image WHERE img_url="%s"', mysql_real_escape_string('img_url') ); $record = mysql_query($sql)or die(mysql_error()); while($data = mysql_fetch_assoc($record)) { $image = array($data['img_url']); } ?> これで $image にはデータベースの img_url のフィールドの値がすべて代入されるはずだったのですが なぜか配列には何も値が入りません。 何が悪いのか、配列についていろいろ調べてはみたのですが、どうしてもわかりませんでした。 どうやったら値が入るようになるか、教えていただけないでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • 配列で受け取った値がUPDATEできない

    お世話になります。質問させていただきます。 複数の一行テキストに入力された値を配列にして受け取り、 まとめてデータベースへUPDATEさせようと勉強しているのですが、 最終の値が全てのカラムにUPDATEされてしまいます。 -------------------------------------------------- if( isset( $_POST['comment'] )) { foreach ($_POST['comment'] as $value) { echo $value."<br>"; $sql = "UPDATE テーブル名 SET comment = ?"; $stmt = $conn->prepare($sql); $stmt->execute(array($value)); } } -------------------------------------------------- echo $valueと吐き出すと、正常に値が反映されているのですが、 UPDATE文の「 comment 」カラムには最終の値が全ての 「 comment 」カラムに入ってしまいます。 例えば、4つの一行テキストがあって、 【 id1→「 a 」 】、【 id2→「 b 」 】、【 id3→「 c 」 】、【 id4→「 d 」 】と したいのですが、 【 id1→「 d 」 】、【 id2→「 d 」 】、【 id3→「 d 」 】、【 id4→「 d 」 】と 最終の「 d 」が全てのカラムに入ってしまいます。 UPDATEさせる前にどの様な処理を施せば良いのでしょうか? ご存知の方がいらっしゃいましたらアドバイスをお願いいたします。 各バージョンは、 PHP5.3.3、MySQL5.0.95 を使用しています。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • フォームから送信した値とMySQLの値と比較したい

    PHP初心者です。 フォームから送信した値とMySQLの値を比較したいのですが、行き詰まっています。 以下の、”//(1)↓”のところが動作しません。どなたか助けていただけないでしょうか? MYSQLの値は1レコードのみの抽出し、そのカラム”seikai”と、フォームから送信された”rad”と比較したいのです。 <?php //区画 $kukaku = "1"; // ファイルインクルード include("db.php"); // データベース接続 $conn = mysql_connect($host, $user, $pw) or die("データベース接続エラー"); mysql_select_db($db, $conn) or die("接続エラー"); // データ抽出 $sql = "SELECT * FROM $table where id = '$kukaku'"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); // データを受け取る $rad = @$_POST["rad"]; ?> <table width="200" border="1"> <?php while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { ?> <tr> <td>DBの正解<?php echo $row["seikai"]?><br> 送信された答え=<?php echo $rad?> </td> </tr> <?php } ?> </table> <?php if ($rad == ""){ echo "<p><font color=#FF0000><b>答えを選択して下さい!</b>"; echo "<p><a href=\"form.php\">戻る</a>"; exit (); } //(1)↓ if ($seikai == $rad){ echo "<p><font color=#FF0000><b>正解です!</b></font>"; exit (); } // 接続解除 mysql_close($conn); ?>

    • ベストアンサー
    • MySQL
  • PHPでデータベース(mySQL)から値を取りだすには

    PHPで値をmySQLに保存するコードを作成するのに 成功したのはいいのですが、値を取り出して 出力するコードがうまく書けません ネットで調べてみたり、参考書を読んで やっているのですがうまくいきません こういうコードを書いたのですが <?php $conn=mysql_connect("localhost", "user", "pass"); if (!$conn) { die('接続失敗です。'.mysql_error()); } mysql_select_db("database", $conn); mysql_query("SET NAMES 'ja-utf8'", $conn); $sql='SELECT caram, FROM table'; $row=mysql_query($sql, $conn); $res=mysql_fetch_assoc($row); echo htmlspecialchars($res, ENT_QUOTES); mysql_close(); ?> どこが間違っているかご指摘いただけると ありがたいです。

    • 締切済み
    • PHP
  • 配列として受け取った値を配列でない値に戻すには?

    お世話になります。 server_management.php(フォーム)から、server_management_remove_all.php(受け取り側ファイル)に配列としてデータを渡し、データを一括で更新するフォームを作成したのですが、server_management_remove_all.phpにおいて、header("Location: https://www.hogehoge/hogegege/server_management.php?id=".$id);というように戻り先のURLを指定し指定したURLに戻りたいのですが、変数$idに入れたい数字 (category_id)が配列として渡されてきているためかうまく変数$idに入れる事が出来ません。 【server_management.php】のソース ------------------------------------------------------------------ echo "<form action = \"server_management_remove_all.php\" method = \"post\">"; while($row = mysql_fetch_array($result)){ echo "<input type = \"hidden\" name = \"category_id[$row[item_id]]\" value =\""; echo $row["category_id"]; echo "\">"; 中略 } echo "<p>利幅1:<input type = \"text\" name = \"all\" value =\""; echo $row["all"]; echo "\" size = \"40\"></p>"; echo "<p>利幅2:<input type = \"text\" name = \"all2\" value =\""; echo $row["all2"]; echo "\" size = \"40\"></p>"; echo "<p>利幅3:<input type = \"text\" name = \"all3\" value =\""; echo $row["all3"]; echo "\" size = \"40\"></p>"; echo "<input type=\"submit\" value=\"一斉更新\">"; echo "</form>"; ?> ------------------------------------------------------------------ 【server_management_remove_all.php】のソース ------------------------------------------------------------------ $id=$_POST[category_id][$item_id]; header("Location:https://www.hogehoge/hogegege/server_management.php?id=".$id); if(isset($_POST['server_name'])){ foreach($_POST['server_name'] as $item_id=>$server_name) { $sql="update hametome_item set"; $sql.=" profit1='".$_REQUEST[all]."',"; $sql.=" profit2='".$_REQUEST[all2]."',"; $sql.=" profit3='".$_REQUEST[all3]."',"; 中略 $sql.=" category_id='".$_POST[category_id][$item_id]."'"; $sql.=" where item_id = ".$item_id; mysql_query($sql); } } ------------------------------------------------------------------ データを入力する際には、https://www.hogehoge/hogegege/server_management.php?id=15といったようなURL(戻りたいURL)から入力する形になっていて、同一のカテゴリーであれば、category_idは同じ数字です。 このような場合、どのようにすればよいのでしょうか?どうかご教授のほどよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで空の値を表示させたくない場合

    PHPでデータベースから値を取り出し 出力させるというスプリクトを作成してるのですが どうしても、入力フォームに空を値を 入れても空の値まで出力されてしまいます こういう場合はどうやって空の値を 弾くコードを書けばいいのか教えて もらえないでしょうか? ちなみに自分が書いたコードはこれです <?php $conn=mysql_connect("localhost", "username", "pass"); if (!$conn) { die('接続失敗です。'.mysql_error()); } mysql_select_db("database", $conn); mysql_query("SET NAMES 'ja-utf8'", $conn); mysql_query("INSERT INTO tablename (caram) VALUES ('$title_a')", $conn); $sql='SELECT title FROM tablename'; $rs=mysql_query($sql, $conn); $res=mysql_fetch_assoc($rs); if (isset($res)) { while ($res=mysql_fetch_assoc($rs)) { echo "<br>"; echo htmlspecialchars($res["caram"], ENT_QUOTES); } } else { echo ""; } mysql_close($conn); ?> どなたかよろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQL/PHP IN文

    SQLのIN文の用途に関する質問です。 普段は SELECT columns FROM tables WHERE column1 in (value1, value2, .... value_n); のように使いますが、 WHERE value1 in column1; のようにすればできないのでしょうか? column1の値は 1,4,7,3というような内容になっています。 その中にvalue1が含まれているかどうかを判定したい場合はどうすればいいのでしょうか? PHPかSQLでこのような問題を解決する方法をおわかりの方がいらっしゃいましたら、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースで値をインクリメントする方法

    このジャンルでお願いします。 例えばあるカラムをインクリメントする場合に MySQLだと UPDATE mytable SET col=col+1 WHERE id=1; というSQL文でできますが、 一方でプログラム(PHPなど)側で一旦その行を取り出して $id = 1; $col += 1; UPDATE mytable SET col={$col} WHERE id={$id}; というやり方もあると思います。 どちらが良いとか悪い(?)とかあるのでしょうか? 実際にみなさんはどちらのやり方でやっているのでしょうか?またできれば理由もお願いします。 というのも、PHPなどのフレームワークでは値をインクリメントしたい場合は ほとんどが後者のやり方になると思います。 自分的には前者のSQL文でやった方がなんとく良いのでは?と思ってるのですが、 フレームワークなどを使って更新処理を行うと後者のやり方になってしまうので

    • ベストアンサー
    • PHP