• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:for 文内の重複する'$'の書き方がわかりません。)

for文内の重複する変数の書き方がわかりません

このQ&Aのポイント
  • for文内で変数の添字をうまく扱いたい場合、以下の記述方法を使用してください
  • フィールドの値を取得する際には$row1[sname'$i']のような形で添字を指定します
  • この方法を使えば、for文でループさせることができます

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

  • ベストアンサー
  • togino
  • ベストアンサー率75% (97/129)
回答No.8

少し解説をしておきます。 まず下記のようなテーブル tapes があったとします ware_type | tape_no | title_no | sname ----------+---------+----------+------- Tape | t1 | 741859 | Suzuki Tape | t2 | 800000 | Yamada Tape | t1 | 900000 | Watanabe Tape | t1 | 750000 | Saito このテーブルに対し、以下のような SQL を実行すると $sql = "SELECT title_no, sname FROM tapes WHERE tape_no = 't1'" $result = mysql_query($sql, $con); title_no | sname ----------+------- 741859 | Suzuki 900000 | Watanabe 750000 | Saito の表が得られます。$result は、この表のことです。 この表には、初め先頭の1行目にカーソルがあります。   title_no | sname  ----------+------- ⇒ 741859 | Suzuki   900000 | Watanabe   750000 | Saito mysql_fetch_array() 関数は、このカーソルがある行を 連想配列として返し、カーソルを次の行に進めます。 つまり $row = mysql_fetch_array($result) の実行により $row["title_no"] = 741859 $row["sname"] = "Suzuki"   title_no | sname  ----------+-------   741859 | Suzuki ⇒ 900000 | Watanabe   750000 | Saito となるのです。 今、「表にある sname 欄のすべてのデータが欲しい」 とし、 $row1["sname0"] = "Suzuki" $row1["sname1"] = "Watanabe" $row1["sname2"] = "Saito" のように取得したいのであれば、 $i = 0; while ($row = mysql_fetch_array($result)) {  $row1["sname".$i] = $row["sname"];  $i ++; } とすればいいのが分かりますか? ただ僕なら、こうしますね。 $result = mysql_query($sql, $con); while ($row = mysql_fetch_array($result)) {  $field["sname"][] = $row["sname"]; } とした上で $i = 0 foreach($field["sname"] as $sname){ ?> <input name="sname<?php echo $i; ?>" type="text" value="<?php echo $sname; ?>"> <?php  $i ++; } とするかなっ。 まぁ、こんなのは人のすきずき(ケースバイケース)ですが(^^;) あと、最初にも回答しましたが <? echo $row1[sname1]; ?> は <? echo $row1["sname1"]; ?> または <? echo $row1['sname1']; ?> に改めるべきです。 define("sname1", "hogehoge") なんてされた日にはバグってしまいますから。

maigo100
質問者

お礼

toginoさん お返事遅くなってすいませんでした。ずっとあれ以来病気をしていました。それでこちらに来れなかったのです。 本当にご丁寧な説明ありがとうございます。こんな私でもすごく良くわかりました。 ご指摘通りにプログラムを修正したら、すべて動き始めました! 感謝しています。

その他の回答 (7)

  • togino
  • ベストアンサー率75% (97/129)
回答No.7

投稿した後、コピペで削除するのを忘れているのに 気がついたのですが、「maigo100 さん、気がついて くれるだろうなぁ」って思って再投稿しなかったん ですが・・・あぁすみません。 $sql = "select * from tapes where mem_no = '$mem_no'"; $result = mysql_query($sql, $con); // $row = mysql_fetch_array($result); ←★この行削除し忘れ!★ $i = 0; while ($row = mysql_fetch_array($result)) { $row1["sname".$i] = $row["sname"]; $i ++; } mysql_free_result($result);

  • togino
  • ベストアンサー率75% (97/129)
回答No.6

maigo100 さんは根本的に勘違いされてる? sname0, sname1, ... ってテーブルの横じゃなくて 縦に伸びるものじゃないでしょうか? $sql = "select * from tapes where mem_no = '$mem_no'"; $result = mysql_query($sql, $con); $row = mysql_fetch_array($result); $i = 0; while ($row = mysql_fetch_array($result)) { $row1["sname".$i] = $row["sname"]; $i ++; } mysql_free_result($result); $row はテーブルの1行を配列にしたものです。 1列ではありませんよ。

maigo100
質問者

補足

toginoさん ほんとお世話になっています。色々試していて、お返事が遅くなりました。 はい。まったくそのとおりだという事実に赤面です。 ただ、教えていただいたとおりにしてみましたが、 <input name="sname0" type="text" size="20" value="<? echo $row1[sname0]; ?>"> <input name="sname1" type="text" size="20" value="<? echo $row1[sname1]; ?>"> <input name="sname2" type="text" size="20" value="<? echo $row1[sname2]; ?>"> のうちのsname0だけが入るだけで、上手くいきません。 例えばSelect文の検索結果が、 Suzuki Watanabe Saito と3っつあったとすると、sname0がWatanabe、sname1がSaitoとなります。(期待している結果は、sname0がSUzuki、sname1がWatanabe、sname2がSaitoです。) 下のパターン1,2,3とかも色々自分なりに試してみたのですが、結果は、まったく同じです。 パターン1 $sql = "select * from tapes where mem_no = '$mem_no'"; $result = mysql_query($sql, $con); $row = mysql_fetch_array($result); $i = 0; while ($row = mysql_fetch_array($result)) { $row1["sname".$i] = $row["sname"]; $i ++; } mysql_free_result($result); パターン2 $sql = "select * from tapes where mem_no = '$mem_no'"; $result = mysql_query($sql, $con); $row = mysql_fetch_array($result); $i = 0; while ($row = mysql_fetch_array($result)) { $row1[sname.$i] = $row[sname]; $i ++; } mysql_free_result($result); パターン3 $sql = "select * from tapes where mem_no = '$mem_no'"; $result = mysql_query($sql, $con); $row = mysql_fetch_array($result); $i = 0; while ($row = mysql_fetch_array($result)) { $row1[sname.$i] = $row[sname]; $i ++; } mysql_free_result($result); しかし、初期値の$i = 0;を     $i = 1;にするとsname0は空白になり、sname1がWatanabe、sname2がSaitoが入ります。 同様に$i = 2;にするとsname0は空白になり、sname1も空白になり、sname2にWatanabe,sname3にSaitoが入ります。 同様に$i = 3;にするとsname0は空白になり、sname1も空白になり、sname2も空白になり、sname3にWatanabe,sname4にSaitoが入ります Suzukiはどこにも現れないですし、$iが増えれば結果が下へ下へと移動していきます。 まったくわけがわかりません。 宜しくお願いします。

  • imasyu
  • ベストアンサー率36% (19/52)
回答No.5

for ($i=0; $i<20; $i++) { $row1["sname".$i] = $row[$i]; } <input name="sname0" type="text" size="20" value="<? echo $row1["sname0"]; ?>"> <input name="sname1" type="text" size="20" value="<? echo $row1["sname1"]; ?>"> <input name="sname2" type="text" size="20" value="<? echo $row1["sname2"]; ?>"> としてみるとどうなりますか? 構文に誤りもあると思いますが print_rで出力した結果を見た感じでは、<input>内で参照している変数が定義されていないだけだと思います。

maigo100
質問者

補足

for ($i=0; $i<20; $i++) { $row1["sname".$i] = $row[$i]; } <input name="sname0" type="text" size="20" value="<? echo $row1["sname0"]; ?>"> <input name="sname1" type="text" size="20" value="<? echo $row1["sname1"]; ?>"> <input name="sname2" type="text" size="20" value="<? echo $row1["sname2"]; ?>"> 上記のとおり変更してやってみましたが上手くいきませんでしたので、下のようにprintを入れて中を見てみましたら、 for ($i=0; $i<20; $i++) { $row1["sname".$i] = $row[$i]; print("row[$i] = '$row[$i]'\n"); } row[0] = '' row[1] = '' row[2] = '' row[3] = '' ........ という感じで、全部空でした。 $resultをmysql_fetch_arrayで受けている今のsqlそのものに間違いがあるのでしょうか? $result = mysql_query($sql, $con); $row = mysql_fetch_array($result); 「mysql_fetch_array」以外で受けたほうが良いのでしょうか? ああ、今晩も寝れないのでしょうか。。。

  • togino
  • ベストアンサー率75% (97/129)
回答No.4

あうぅぅ > print_r("row= '$row'\n");の出力内容は、 勝手に変えないでください・・・ print_r($row) です・・・

maigo100
質問者

補足

ごめんなさい。 出力結果は、 Array ( [0] => Tape [ware_type] => Tape [1] => t1 [tape_no] => t1 [2] => 741859 [title_no] => 741859 [3] => Suzuki [sname] => Suzuki ) です。 宜しくお願いします。

  • togino
  • ベストアンサー率75% (97/129)
回答No.3

tapes テーブルの構成か、あるいは $sql = "select * from tapes where mem_no = '$mem_no'"; $result = mysql_query($sql, $con); $row = mysql_fetch_array($result); print_r($row) した結果、出力される内容を教えていただけませんか? maigo100 さん、そんなに間違っているとは 思いませんよ。ちょっとしたミスだと思いますが・・・

maigo100
質問者

補足

print_r("row= '$row'\n");の出力内容は、 row = 'Array' です。 宜しくお願いします。

  • togino
  • ベストアンサー率75% (97/129)
回答No.2

http://www.php.net/manual/ja/language.types.array.php#language.types.array.donts にもこう書いてありますし、"" でくくった方が よろしいかと・・・思います。

参考URL:
http://www.php.net/manual/ja/language.types.array.php#language.types.array.donts
maigo100
質問者

補足

toginoさん 下のとおりの結果でした。#1でtoginoさんだったらこういう風には書かないとのことでしたが、どのように書きますか?教えてください。PHPからmysqlコマンドの発行に慣れていなくて、resultやrowでの受ける時に用いているコマンドが間違っているのかとも思っています。for文の添字の$iも間違っているとも思っています。

  • togino
  • ベストアンサー率75% (97/129)
回答No.1

$row1["sname$i"] = $row["sname$i"]; ということではないのかな? $row1[sname0] という書き方は、僕は 全然しませんね。文字列リテラルなら""で 囲みますけど。

maigo100
質問者

補足

toginoさん ご回答ありがとうございました。でも教えていただいたままやってみましたが上手くいきません。 PHPからのmysqlコマンドでの取得の方法自体も間違っているのでしょうか。。。中身を見るためにprintで表示させたのですが、空です。でもコマンドラインで直接見に行くと、空じゃないのです。

関連するQ&A