🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

764閲覧

#for文の多重ループがうまくできません

cambodia

総合スコア12

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/01/28 14:27

#for文の多重ループがうまくできません
初めまして。
phpでwebサイトを作っています。
プログラミングは、まだまだ初心者で、昨日、こちらのteratailの中で、アドバイスをいただき、for文について少し学んだ程度です。いろいろ調べながらサイトを作っています。

さて、ただいまクイズのサイトを作っています。
10問あるクイズの内、8問正解すると、
以下のテーブルにデータがINSERTされるようにしています。

イメージ説明
※user_idは、ユーザー名。ユーザーによって変わります。
※subject_idは、クイズの種類。クイズの種類によって1から10まであります。
※starは、8問正解を何回達成したかを示す数値です。

#やりたいこと
このテーブルのsubject_idカラムの値(数値)を入れた変数$starを作り、
その中に、starカラムの値を格納したいです。

例えば、

1行目のレコードは、subject_idが2で、starが3ですが、この場合は、
$star2 = 3; となるようにしたいです。

3行目のレコードは、subject_idが5で、starが1ですが、この場合は、
$star5 = 1; となるようにしたいです。

上記をfor文を使ってしたいです。
ユーザーによって、subject_idとstarカラムはバラバラです。レコード数が何件かもユーザーごとに違います。

以下が記述したスクリプトです。
テーブルのsubject_idカラムは、2、3、5、7と値があるので、
html箇所の
$star2
$star3
$star5
$star7

に、starカラムの値、3、1、1、1が表示されると思ったのですが、
何も表示されません。

for文の多重ループのところで、間違いがありますでしょうか?

php

1<?php 2 3session_start(); 4$user_id = $_SESSION['user_id']; 5 6$star1=""; 7$star2=""; 8$star3=""; 9$star4=""; 10$star5=""; 11$star6=""; 12$star7=""; 13 14require_once('config.php'); 15$dsn = 'mysql:host=' . $config['host'] . '; dbname=' . $config['database'] . '; charset=utf8'; 16$user = $config['user']; 17$password = $config['password']; 18 19//①user_idを条件にして starテーブルを読み込む 20//②指定したユーザーのレコードを複数取得する 21try{ 22 $dbh = new PDO($dsn, $user, $password); 23 $sql = " SELECT * FROM star WHERE user_id = :user_id"; 24 $stmt = $dbh->prepare($sql); 25 $stmt->bindValue(':user_id', $user_id); 26 $res = $stmt->execute(); 27 $data = $stmt->fetchAll();//③fetchAllで複数レコードの値を全て取得する 28 29 if(isset($data)){ //④もし、データがあれば 30 for($n = 0; $n <= 3; $n++){ //⑤for文で、$nに0から3を入れて繰り返す 31 for($i = 1; $i <= 7; $i++){ //⑥for文で、$iに1から7を入れて繰り返す 32 if($data[$n]['subject_id'] === $i){ 33     //⑦もし、$dataの配列の要素[$n]のsubject_idカラムの値が、$iの値と一致したら、 34 ${'star'.$i} = $data[$n]['star']; 35     //⑧$dataの配列の要素[$n]のstarカラムの値を、$star[$i]に格納する 36 } 37 } 38 } 39 } 40 41}catch(PDOException $e){ 42 echo $e->getMessage(); 43 exit; 44} 45 46 ?> 47 48 49 50<!DOCTYPE html> 51<html lang="ja"> 52<head> 53 <meta charset="UTF-8"> 54 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 55 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 56 <title>サンプル</title> 57 58 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> 59 60</head> 61<body> 62 63 <table> 64 65 <tr> 66 <td> 67 <small>クイズ1</small> 68 </td> 69 <td> 70 <?php echo $star; ?> 71 </td> 72 </tr> 73 74 <tr> 75 <td> 76 <small>クイズ2</small> 77 </td> 78 <td> 79 <?php echo $star; ?> 80 </td> 81 </tr> 82 83 <tr> 84 <td> 85 <small>クイズ3</small> 86 </td> 87 <td> 88 <?php echo $star; ?> 89 </td> 90 </tr> 91 92 <tr> 93 <td> 94 <small>クイズ4</small> 95 </td> 96 <td> 97 <?php echo $star4; ?> 98 </td> 99 </tr> 100 101 <tr> 102 <td> 103 <small>クイズ5</small> 104 </td> 105 <td> 106 <?php echo $star5; ?> 107 </td> 108 </tr> 109 110 <tr> 111 <td> 112 <small>クイズ6</small> 113 </td> 114 <td> 115 <?php echo $star6; ?> 116 </td> 117 </tr> 118 119 <tr> 120 <td> 121 <small>クイズ7</small> 122 </td> 123 <td> 124 <?php echo $star7; ?> 125 </td> 126 </tr> 127 128 129 130 </table> 131</body> 132</html> 133 134

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/28 15:13

前の質問で得たアドバイスは、なかったことになったんですね。
cambodia

2021/01/29 00:02

いえいえ、前の質問の時はfor文を使う方法や配列の出し方を知らなかったので、そのアドバイスをもとに進めることができました。 そこからさらに、調べて多重ループやbreakのことを知り、スクリプトを書きました。うまく表示されないのは、おそらくループがうまくいってないのかなと思いまして。
m.ts10806

2021/01/29 00:48 編集

forの中で出力してしまえば、わざわざクイズ何番とか手で書かなくて良いし、変数もひとつひとつ書かなくて済むのに。 回答した者としては、「伝わってなかった」という印象を受けたための指摘をしています。 なんのために「変数」と呼ばれるかを考えてみては。これでは固定でひとつひとつ書いてるのと変わらない。 結局ほぼ同じ回答をしました。
guest

回答2

0

ベストアンサー

for($i = 1; $i <= 7; $i++){

$iは半角数値

${'star'.$i} = $data[$n]['star'];

そのまま可変変数に。 

<?php echo $star1; ?>

全角じゃん。

大文字小文字も全角半角もプログラムにとっては別の記号です。
変数名は単にそういう文字列の集合体でしかないです。

「大別されるものとされないもの」確かにあるのですが、「大別されない機能はどっちでもいいや」という考え方だと、いとも簡単にハマって抜けられなくなります。
プログラムは書いたとおりにしか動かないので、短くてもコピペするくらい正確に。

エラー表示設定しておいたほうが良いですよ。今回変数未定義のNoticeは出てるはずです。
やり方は調べればすぐ出てきます。

それに、今回、可変変数使うほどの要件ではないように見えます。「とっておいて出力」ではなく、「ループの中で出力」
マジックナンバーも良くない。

前の質問にも書いた気がするけど、とりあえずなら
0. 全データ取得
0. クイズの種類分for。クイズ番号出力
0. その中で取得してきたデータをfor
0. データのsubject_idと一致すればstar出力。1つも一致しなければ0を出力

もしくは
0. クイズの種類分for。クイズ番号出力
0. その中でsubject_idを検索条件にselect。取得できればstar出力。1つも一致しなければ0を出力

もしくは
0. クイズマスタ(ないなら作ること)をstarテーブルとleft join。starがnullなら0を入れるselect
0. 取得データを出力

まあ
3番目ですね。
SQLで出力したい形のデータを作ってしまうのが最も軽く、ロジックでゴチャゴチャ書かなくて済む。

投稿2021/01/29 00:29

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/29 00:54

>if(isset($data)){ //④もし、データがあれば コメントと処理が合ってない >for($n = 0; $n <= 3; $n++){ データ4件固定なの? >for($i = 1; $i <= 7; $i++) クイズ番号は1から10じゃないの? 意図不明な実装が多いのも気になる。 「全部回す」ならforeachか、dataのsize分回す。PHPならcount だけど、SQLでも「全件取得しつつ件数も取得する」ができる。 SQL頑張れ。
cambodia

2021/01/29 03:44

m.ts10806さん 細かくご指導ありがとうございます! いろいろ理解していないことと読解力がまだまだ至らないこと反省します。 SQLで出力したい形のデータを作る 、というのがとてもシンプルですね!この考えに至りませんでした。 これでうまくいきそうです!(外出中のため戻ってやりますが、紙に書いてみてすっきり理解しました!) おかげで、for文やforeach、fetchAllについても少し理解を深めることができました。 ありがとうございます♪
m.ts10806

2021/01/29 04:00

できてから解決済みにしないとまた「同じ質問してる」となります。
cambodia

2021/02/04 08:15

失礼しました。 できました。 ありがとうございます。
m.ts10806

2021/02/04 08:28

結局、どう対応して「できた」のでしょうか。 アドバイスの意図から乖離した内容だとまた「分かってなかったか」になります。 質問本文でも自身で回答投稿しても良いので、「できた」内容を提示してください。 数回のやり取りから、この回答内容で理解がきちんと得られるとは思っておりません。
cambodia

2021/02/05 06:47

わかりました。 そのようにさせて頂きます。 (すみません。来週になります。)
guest

0

php

1 2if($data[$n]['subject_id'] === $i){ 3

この部分を

php

1 2if($data[$n]['subject_id'] == $i){ 3

にしてみたらいかがですか?

投稿2021/01/29 00:00

hiok

総合スコア595

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問