質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

3回答

1969閲覧

チェックボックスのみ選択したのを表示

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

1クリップ

投稿2018/07/24 02:54

編集2022/01/12 10:55

データを取ってきた時のエラーについて

チェックボックスで選択したクラス、教科名を表示したいです。
チェックボックスでクラスはA、教科名を国語で選択したとき、氏名とクラスと国語の点数のみを出力したプログラムを作りたいです。
【選択なし】
イメージ説明

イメージ説明

【選択後】
イメージ説明

実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Notice: Undefined index: subject in C:\xampp\htdocs\tests\main_search.php on line 18 Warning: implode(): Invalid arguments passed in C:\xampp\htdocs\tests\main_search.php on line 18 Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\tests\main_search.php on line 29

該当のソースコード

<?php session_start(); // 管理者用 // ログイン状態のチェック if(!isset($_SESSION["USERID"])){ header("Location: logout.php"); exit; } if (isset($_POST["search"])){ $s = mysqli_connect("localhost", "root") or die("失敗しました"); mysqli_select_db($s, "tests"); $comma_separated = implode("','", $_POST["class"]); print $comma_separated; print "<BR>"; $comma_separated2 = implode(",", $_POST["subject"]); print $comma_separated2; print "<BR>"; ★ $re = mysqli_query($s, "SELECT students.name, classes.name , " .$comma_separated2 ." FROM students JOIN classes ON students.class_id = classes.id JOIN scores ON students.id = scores.student_id WHERE classes.name in ('" .$comma_separated ."')"); while($kekka = mysqli_fetch_array($re)){ for($i = 0; $i < 7; $i++){ print $kekka[$i]; print ": "; } print "<BR>"; } mysqli_close($s); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>main_search</title> </head> <body> <!-- クラスと教科を横に --> <form method = "post" action = "./main_search.php"> <h1>ログイン機能 サンプルアプリケーション</h1> <p>ようこそ<?=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん</p> <div> <table> <!-- tr要素は、表の行を定義するための要素 --> <tr> <!-- th要素では、表の「見出し」を作成 --> <th>クラス</th> </tr> <tr> <!-- td要素は、表のデータを入れるための要素 --> <td> <input type="checkbox" name="class[]" value="A">A </td> <td> <input type="checkbox" name="class[]" value="B">B </td> <td> <input type="checkbox" name="class[]" value="C">C </td> </tr> <tr> <th>教科</th> </tr> <tr> <td> <input type="checkbox" name = subject[] value = "janpanese">国語<br> </td> <td> <input type="checkbox" name = subject[] value = "math">数学<br> </td> <td> <input type="checkbox" name = subject[] value = "science">理科<br> </td> <td> <input type="checkbox" name = subject[] value = "social">社会<br> </td> <td> <input type="checkbox" name = subject[] value = "english">英語<br> </td> </tr> </table> </div> <br> <input type="submit" name="search" value="検索"><br> <input type="submit" name="back" value="戻る"><br> </body> </html>

試したこと

★のところを $re = mysqli_query($s, "SELECT students.name, classes.name, japanese, math, science, social, english ・・・
にすると選択クラスのみの表示はできます。
よろしくお願いいたします

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 02:56 編集

phpmyadminはあくまでmysql系DB管理プログラムであり、データベースプログラム名はmysqlではないかと思われます。正しく用語を使わないと伝わりませんよ。
guest

回答3

0

サンプル

テーブル定義

sql

1# テーブルのダンプ Classes 2# ------------------------------------------------------------ 3 4DROP TABLE IF EXISTS `Classes`; 5 6CREATE TABLE `Classes` ( 7 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', 8 `name` varchar(32) NOT NULL DEFAULT '' COMMENT 'クラスID', 9 PRIMARY KEY (`id`) 10) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 11 12LOCK TABLES `Classes` WRITE; 13/*!40000 ALTER TABLE `Classes` DISABLE KEYS */; 14 15INSERT INTO `Classes` (`id`, `name`) 16VALUES 17 (1,'A'), 18 (2,'B'), 19 (3,'C'); 20 21/*!40000 ALTER TABLE `Classes` ENABLE KEYS */; 22UNLOCK TABLES; 23 24 25# テーブルのダンプ Result 26# ------------------------------------------------------------ 27 28DROP TABLE IF EXISTS `Result`; 29 30CREATE TABLE `Result` ( 31 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 32 `student_id` int(11) unsigned NOT NULL COMMENT '生徒ID', 33 `subject_id` int(11) unsigned NOT NULL COMMENT '科目ID', 34 `point` int(11) unsigned DEFAULT NULL COMMENT '得点', 35 PRIMARY KEY (`id`) 36) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 37 38LOCK TABLES `Result` WRITE; 39/*!40000 ALTER TABLE `Result` DISABLE KEYS */; 40 41INSERT INTO `Result` (`id`, `student_id`, `subject_id`, `point`) 42VALUES 43 (1,1,1,71), 44 (2,1,2,98), 45 (3,1,3,76), 46 (4,1,4,85), 47 (5,1,5,99), 48 (6,2,1,39), 49 (7,2,2,96), 50 (8,2,3,64), 51 (9,2,4,29), 52 (10,2,5,53), 53 (11,3,1,79), 54 (12,3,2,37), 55 (13,3,3,46), 56 (14,3,4,17), 57 (15,3,5,49), 58 (16,4,1,94), 59 (17,4,2,21), 60 (18,4,3,21), 61 (19,4,4,44), 62 (20,4,5,56), 63 (21,5,1,47), 64 (22,5,2,68), 65 (23,5,3,98), 66 (24,5,4,85), 67 (25,5,5,32), 68 (26,6,1,6), 69 (27,6,2,30), 70 (28,6,3,32), 71 (29,6,4,68), 72 (30,6,5,46); 73 74/*!40000 ALTER TABLE `Result` ENABLE KEYS */; 75UNLOCK TABLES; 76 77 78# テーブルのダンプ Student 79# ------------------------------------------------------------ 80 81DROP TABLE IF EXISTS `Student`; 82 83CREATE TABLE `Student` ( 84 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '生徒ID', 85 `name` varchar(64) NOT NULL DEFAULT '' COMMENT '生徒名', 86 `class_id` int(11) unsigned NOT NULL COMMENT 'クラスID', 87 PRIMARY KEY (`id`) 88) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 89 90LOCK TABLES `Student` WRITE; 91/*!40000 ALTER TABLE `Student` DISABLE KEYS */; 92 93INSERT INTO `Student` (`id`, `name`, `class_id`) 94VALUES 95 (1,'佐藤',1), 96 (2,'鈴木',1), 97 (3,'加藤',1), 98 (4,'林',1), 99 (5,'山本',1), 100 (6,'田中',1); 101 102/*!40000 ALTER TABLE `Student` ENABLE KEYS */; 103UNLOCK TABLES; 104 105 106# テーブルのダンプ Subject 107# ------------------------------------------------------------ 108 109DROP TABLE IF EXISTS `Subject`; 110 111CREATE TABLE `Subject` ( 112 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 113 `name` varchar(32) NOT NULL DEFAULT '', 114 `column_name` varchar(16) DEFAULT '', 115 PRIMARY KEY (`id`) 116) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 117 118LOCK TABLES `Subject` WRITE; 119/*!40000 ALTER TABLE `Subject` DISABLE KEYS */; 120 121INSERT INTO `Subject` (`id`, `name`, `column_name`) 122VALUES 123 (1,'国語','japanese'), 124 (2,'数学','math'), 125 (3,'理科','science'), 126 (4,'社会','social'), 127 (5,'英語','english'); 128 129/*!40000 ALTER TABLE `Subject` ENABLE KEYS */; 130UNLOCK TABLES;

ソースコード

php

1<?php 2// エラーを表示する 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6/** 7 * htmlspecialchars 8 */ 9function h(string $string) 10{ 11 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 12} 13 14/** 15 * PDOオブジェクトを取得する 16 */ 17function get_connection() 18{ 19 $pdo = new PDO('mysql:host=127.0.0.1;dbname=sample;charset=utf8' 20 , 'root' 21 , 'password' 22 , [ 23 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 24 , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 25 ] 26 ); 27 return $pdo; 28} 29 30/** 31 * SELECT 32 */ 33function select($sql, array $params = []) 34{ 35 $pdo = get_connection(); 36 $stmt = $pdo->prepare($sql); 37 $stmt->execute($params); 38 return $stmt->fetchAll(); 39} 40 41/** 42 * クラスを取得する 43 */ 44function get_classes() 45{ 46 return select('SELECT * FROM `Classes`'); 47} 48 49/** 50 * 科目を取得する 51 */ 52function get_subjects() 53{ 54 return select('SELECT * FROM `Subject`'); 55} 56 57/** 58 * 検索する 59 * @return type 60 */ 61function search() 62{ 63 $classes = requested_class(); 64 65 $sql = 'SELECT '; 66 $sql .= 's.id AS student_id'; 67 $sql .= ', s.name AS student_name'; 68 $sql .= ', c.name AS class_name'; 69 $sql .= ', `japanese`.`point` AS `japanese`'; 70 $sql .= ', `math`.point AS `math`'; 71 $sql .= ', `science`.point AS `science`'; 72 $sql .= ', `social`.point AS `social`'; 73 $sql .= ', `english`.point AS `english`'; 74 $sql .= 'FROM `Student` s '; 75 $sql .= 'INNER JOIN `Classes` c ON s.class_id = c.id '; 76 $sql .= 'LEFT JOIN `Result` `japanese` ON japanese.student_id = s.id AND `japanese`.subject_id = 1 '; 77 $sql .= 'LEFT JOIN `Result` `math` ON `math`.student_id = s.id AND `math`.subject_id = 2 '; 78 $sql .= 'LEFT JOIN `Result` `science` ON `science`.student_id = s.id AND `science`.subject_id = 3 '; 79 $sql .= 'LEFT JOIN `Result` `social` ON `social`.student_id = s.id AND `social`.subject_id = 4 '; 80 $sql .= 'LEFT JOIN `Result` `english` ON `english`.student_id = s.id AND `english`.subject_id = 5 '; 81 $sql .= 'WHERE 1 '; 82 $params = []; 83 if (!empty($classes)) { 84 $sql .= sprintf('AND s.`class_id` IN (%s)', implode(', ', array_fill(0, count($classes), '?'))); 85 $params += $classes; 86 } 87 return select($sql, $params); 88} 89 90/** 91 * チェックされた科目を取得する 92 * @return type 93 */ 94function requested_subject_column_name() 95{ 96 return filter_input(INPUT_POST, 'subject', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY) 97 ?? []; 98} 99 100/** 101 * チェックされたクラスを取得する 102 * @return type 103 */ 104function requested_class() 105{ 106 return filter_input(INPUT_POST, 'class', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY) ?? []; 107} 108 109$result = search(); 110?> 111<!DOCTYPE HTML> 112<html lang="ja"> 113 <head> 114 <meta charset="UTF-8"> 115 <title></title> 116 </head> 117 <body> 118 <form action="" method="post"> 119 <h3>クラス</h3> 120 <div> 121 <?php foreach (get_classes() as $class) : ?> 122 <label> 123 <?php if (in_array($class['id'], requested_class())) : ?> 124 <input type="checkbox" name="class[]" checked="checked" value="<?php echo h($class['id']); ?>" /> 125 <?php else: ?> 126 <input type="checkbox" name="class[]" value="<?php echo h($class['id']); ?>" /> 127 <?php endif; ?> 128 <?php echo h($class['name']); ?> 129 </label> 130 <?php endforeach; ?> 131 </div> 132 <h3>教科</h3> 133 <div> 134 <?php foreach (get_subjects() as $subject) : ?> 135 <label> 136 <?php if (in_array($subject['column_name'], requested_subject_column_name())) : ?> 137 <input type="checkbox" name="subject[]" checked="checked" value="<?php echo h($subject['column_name']); ?>" /> 138 <?php else: ?> 139 <input type="checkbox" name="subject[]" value="<?php echo h($subject['column_name']); ?>" /> 140 <?php endif; ?> 141 <?php echo h($subject['name']); ?> 142 </label> 143 <?php endforeach; ?> 144 </div> 145 <p> 146 <input type="submit" value="検索" /> 147 </p> 148 </form> 149 150 <h2>結果</h2> 151 152 <table> 153 <thead> 154 <tr> 155 <th>氏名</th> 156 <th>クラス</th> 157 <?php foreach (get_subjects() as $subject) : ?> 158 <?php if (in_array($subject['column_name'], requested_subject_column_name())) : ?> 159 <th><?php echo h($subject['name']); ?></th> 160 <?php endif; ?> 161 <?php endforeach; ?> 162 </tr> 163 </thead> 164 <tbody> 165 <?php foreach ($result as $row) : ?> 166 <tr> 167 <td><?php echo h($row['student_name']); ?></td> 168 <td><?php echo h($row['class_name']); ?></td> 169 <?php foreach (get_subjects() as $subject) : ?> 170 <?php if (in_array($subject['column_name'], requested_subject_column_name())) : ?> 171 <td><?php echo h($row[$subject['column_name']]); ?></td> 172 <?php endif; ?> 173 <?php endforeach; ?> 174 </tr> 175 <?php endforeach; ?> 176 </tbody> 177 </table> 178 </body> 179</html>

投稿2018/07/24 16:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 23:27

ありがとうございます。 会社の先輩からPDOは使わないようにと言われてしまいました。。。
退会済みユーザー

退会済みユーザー

2018/07/25 01:17 編集

やることは大して変わらないので、書き換えてみたら? というか、課題??
guest

0

すでに回答があるとおり"subject[]"の問題でしょうね

ちなみに受ける側も

PHP

1$subject=filter_input(INPUT_POST,"subject",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);

的な処理にしたほうが汎用性があがります
なおmysqliでインジェクション対策なしのSQLを発行しているようですが
あまり得策とはいえません。
mysqliにも多少煩雑ですがprepare処理がありますので、そちらを使うか
pdoでparepare処理することをおすすめします

参考

プレースホルダの基本データ

PHP

1<?PHP 2$class=filter_input(INPUT_POST,"class",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3$subject=filter_input(INPUT_POST,"subject",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 4$sql ="select students.name, classes.name FROM students "; 5$sql.="JOIN classes ON students.class_id = classes.id "; 6$sql.="JOIN scores ON students.id = scores.student_id "; 7$sql.="WHERE 1 "; 8$params=[]; 9if(!is_null($class)){ 10 $sql.="and classes.name in (".implode(",",array_fill(0,count($class),"?")).") "; 11 $params_class =[str_repeat( 's', count($class))]; 12 $params=array_merge($params,$params_class); 13} 14if(!is_null($subject)){ 15 $sql.="and classes.name in (".implode(",",array_fill(0,count($subject),"?")).") "; 16} 17print $sql; 18?> 19<form method = "post"> 20<input type="checkbox" name="class[]" value="A">A 21<input type="checkbox" name="class[]" value="B">B 22<input type="checkbox" name="class[]" value="C">C<br> 23<input type="checkbox" name ="subject[]" value="janpanese">国語<br> 24<input type="checkbox" name ="subject[]" value="math">数学<br> 25<input type="checkbox" name ="subject[]" value="science">理科<br> 26<input type="checkbox" name ="subject[]" value="social">社会<br> 27<input type="checkbox" name ="subject[]" value="english">英語<br> 28<input type="submit" name="search" value="検索"><br> 29<input type="submit" name="back" value="戻る"><br> 30</form>

組み込み

一応ざっくり組み込んでみました
環境にあわせて調整してください

PHP

1<?PHP 2$class=filter_input(INPUT_POST,"class",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3$subject=filter_input(INPUT_POST,"subject",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 4 5$sql ="select students.name, classes.name FROM students "; 6$sql.="JOIN classes ON students.class_id = classes.id "; 7$sql.="JOIN scores ON students.id = scores.student_id "; 8$sql.="WHERE 1 "; 9$params=[]; 10$data=[]; 11if(!is_null($class)){ 12 $sql.="and classes.name in (".implode(",",array_fill(0,count($class),"?")).") "; 13 if(!isset($params[0])) $params[0]=""; 14 $params[0].=str_repeat( 's', count($class)); 15 $data=array_merge($data,$class); 16} 17if(!is_null($subject)){ 18 $sql.="and classes.name in (".implode(",",array_fill(0,count($subject),"?")).") "; 19 if(!isset($params[0])) $params[0]=""; 20 $params[0].=str_repeat( 's', count($subject)); 21 $data=array_merge($data,$subject); 22} 23print $sql; 24print_r($params); 25 26$mysqli = new mysqli("localhost", "myuser", "mypass", "mydb"); 27$stmp=$mysqli->prepare($sql); 28foreach ($data as $key=>$val){ 29 $params[] = &$data[$key]; 30} 31call_user_func_array([$stmt, 'bind_param'], $params); 32$stmt->execute(); 33$res = $stmt->get_result(); 34$rows=$res->fetch_all(MYSQLI_ASSOC); 35print_r($rows); 36 37?> 38<form method = "post"> 39<input type="checkbox" name="class[]" value="A">A 40<input type="checkbox" name="class[]" value="B">B 41<input type="checkbox" name="class[]" value="C">C<br> 42<input type="checkbox" name ="subject[]" value = "janpanese">国語<br> 43<input type="checkbox" name ="subject[]" value = "math">数学<br> 44<input type="checkbox" name ="subject[]" value = "science">理科<br> 45<input type="checkbox" name ="subject[]" value = "social">社会<br> 46<input type="checkbox" name ="subject[]" value = "english">英語<br> 47<input type="submit" name="search" value="検索"><br> 48<input type="submit" name="back" value="戻る"><br> 49</form> 50

投稿2018/07/24 03:36

編集2018/07/24 12:10
yambejp

総合スコア114572

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 04:52

ありがとうございました。 この結果を表示するにはどのようなプログラムがいいですか
yambejp

2018/07/24 05:54

組み込んでみました
退会済みユーザー

退会済みユーザー

2018/07/24 14:40

$stmp=$mysqli->prepare($sql); の部分なんですが、$stmtの入力ミスではないでしょうか? 間違っていたらすみません
guest

0

<input type="checkbox" name="subject[]" value="janpanese">
「subject[]」をダブルクオーテーションで括るとエラーメッセージが変わるかもよ。

投稿2018/07/24 02:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 03:04

回答ありがとうございます Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\tests\main_search.php on line 29 のように警告文がでました
退会済みユーザー

退会済みユーザー

2018/07/24 03:06

while($kekka = mysqli_fetch_array($re)){ の部分にエラーがあるようです
退会済みユーザー

退会済みユーザー

2018/07/24 03:07

それは、subjectに該当するチェックが1つの場合と2つ以上の場合とで変わったりするかな?
退会済みユーザー

退会済みユーザー

2018/07/24 03:14

mysqli_query() の引数内で連結せず直前に別の変数にでも連結したSELECT文を作成してそれを var_dump() したら原因が分かるかもしれません。 mysqli_fetch_array() に与えている変数にはmysqli_result型が必要ですがboolean型が与えられているということで、mysqli_query() が失敗しています。
退会済みユーザー

退会済みユーザー

2018/07/24 03:37

2つのときは Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\tests\main_search.php のように同じ警告文がでました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問