#データベースから複数レコードを取得し、その複数レコードから条件にあった値を取得して変数に格納したい
初めまして。
php初心者です。
クイズのウェブサイトを作っています。
10問あるクイズの内、8問正解すると、
以下のテーブルにデータがINSERTされるようにしています。
※user_idは、ユーザー名。ユーザーによって変わります。
※subject_idは、クイズの種類。クイズの種類によって1から100まであります。
※starは、8問正解を何回達成したかを示す数値です。
1から3まであって、最終的に
1は、「1回クリア!」
2は、「2回クリア!」
3は、「3回クリア!」
と表示させる予定です。
このstarカラムの数値を、変数$starに格納して、result.phpの中で表示させたいと考えています。
result.phpは、クイズの種類ごとに分けており、以下のように記述しています。
コメントに番号をふっています。
私としては、コメント番号の④と⑤がダメだと思っています。
しかし、やり方がわからず、以下のような記述でストップしています。
result.php
php
1 2<?php 3session_start(); 4$user_id = $_SESSION['user_id']; 5 6$star1 =""; 7$star2 =""; 8$star3 =""; 9 ↓ 10<省略> 11 ↓ 12$star100 =""; 13 14 15//①user_idを条件にして starテーブルを読み込む 16//②指定したユーザーのレコードを複数取得する 17 18require_once('config.php'); 19$dsn = 'mysql:host=' . $config['host'] . '; dbname=' . $config['database'] . '; charset=utf8'; 20$user = $config['user']; 21$password = $config['password']; 22 23try{ 24 $dbh = new PDO($dsn, $user, $password); 25 $sql = " SELECT * FROM star WHERE user_id = :user_id"; 26 $stmt = $dbh->prepare($sql); 27 $stmt->bindValue(':user_id', $user_id); 28 $stmt->execute(); 29 $data = $stmt->fetchAll(); //③fetchAllで複数レコードの値を全て取得する 30 31 if($data['subject_id'] == 1){ //④もし、subject_idが1なら、 32 $star1 = $data['star']; //⑤そのレコードのstarカラムの値を$star1に格納する 33 34 }else if($data['subject_id'] == 2){ 35 $star2 = $data['star']; 36 37 }else if($data['subject_id'] == 3){ 38 $star3 = $data['star']; 39 } 40 41 ↓ 42 <省略> 43 ↓ 44 45 }else if($data['subject_id'] == 100){ 46 $star100 = $data['star']; 47 } 48 49 }catch(PDOException $e){ 50 echo $e->getMessage(); 51 exit; 52 } 53 54?> 55 56 57<!DOCTYPE html> 58<html lang="ja"> 59<head> 60 <meta charset="UTF-8"> 61 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 62 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 63 <title>サンプル</title> 64 65 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> 66 67</head> 68<body> 69 70 <table> 71 72 <tr> 73 <td> 74 <small>クイズ1</small> 75 </td> 76 <td> 77 <?php echo $star1; ?> 78 </td> 79 </tr> 80 81 <tr> 82 <td> 83 <small>クイズ2</small> 84 </td> 85 <td> 86 <?php echo $star2; ?> 87 </td> 88 </tr> 89 90 <tr> 91 <td> 92 <small>クイズ3</small> 93 </td> 94 <td> 95 <?php echo $star3; ?> 96 </td> 97 </tr> 98 99 ↓ 100 <省略> 101 ↓ 102 103 <tr> 104 <td> 105 <small>クイズ100</small> 106 </td> 107 <td> 108 <?php echo $star100; ?> 109 </td> 110 </tr> 111 112 113 </table> 114</body> 115</html> 116 117
#ご指導、よろしくお願いいたします
foreachやら、fetchAllの使い方をよく理解しておりません。
わかっているのは、
fetchは、SELECT文で取得したデータの一番上のレコードを取得する
fetchAllは、SELECT文で取得したデータをすべて取得する
foreachは、データを配列にして繰り返し処理をする。
という感じです。
私の記述では、fetchAllでデータベースのレコードを取得して、配列の状態になっていると理解しています。
そこから、if文の条件(今回では、subject_idの条件)にあったレコードのstarカラムの値を変数に格納するところでつまづいていると考えています。
どうぞよろしくお願いいたします。
#[追記]アドバイスを元にやってみた結果
tryの処理を以下の記述でやってみますと、
2131646
という表示を取得できました。
これは、subject_idカラムの値が4レコード分連なったものです。
1レコード目 2
2レコード目 13
3レコード目 16
4レコード目 46
このsubject_idカラムの値と同じレコードにあるstarカラムの値を変数に格納したいです。
例えば、
1レコード目であれば、$star2という変数に、starカラムの値である 3 を代入する
2レコード目であれば、$star13という変数に、starカラムの値である 1 を代入する
3レコード目であれば、$star16という変数に、starカラムの値である 1 を代入する
4レコード目であれば、$star46という変数に、starカラムの値である 1 を代入する
このやり方がさっぱりわかりません。
php
1//starテーブルを読み込んで、 2try{ 3 $dbh = new PDO($dsn, $user, $password); 4 $sql = " SELECT * FROM star WHERE user_id = :user_id"; 5 $stmt = $dbh->prepare($sql); 6 $stmt->bindValue(':user_id', $user_id); 7 $res = $stmt->execute(); 8 $list = $stmt->fetchAll(); 9 10 foreach($list as $data){ 11 12 for ($i = 1; $i <= 50; $i++){ 13 if($i == $data['subject_id']){ 14 echo $i; 15 } 16 } 17 18 } 19 20}catch(PDOException $e){ 21 echo $e->getMessage(); 22 exit; 23}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/27 08:20
2021/01/27 08:25
2021/01/27 08:30
2021/01/27 10:48
2021/01/27 11:52