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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PHP

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

Q&A

解決済

1回答

1159閲覧

MySQLに登録した値を「編集ページ」にて該当のチェックボックスに割り当てたい

skyline5105

総合スコア7

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/08/22 09:05

編集2019/08/22 09:14

前提・実現したいこと

お世話になります。PHPの勉強をしております。いろんな参考書や公式ドキュメントを参照しながら、PHPとMySQLを使用して実務に近い簡易的なものを作成しようとして行き詰っています。

流れとしましては、学習塾を想定し、生徒の「氏名」「フリガナ」「性別」「年齢」「好きな教科」を登録。
「氏名」→テキストボックス
「フリガナ」→テキストボックス
「性別」→ラジオボタン
「年齢」→テキストボックス
「好きな教科」→チェックボックス
とし、MySQLに登録しようとしました。
「好きな教科」については、そのままPOSTでデータを取得してMySQLに登録しようとすると1つの強化しか登録できなかったため、いろいろ調べて「implode」を使用して「,」で区切ることでMySQLに登録することができました。

「登録ページ」は作成できたので、内容変更の為に「編集ページ」を作成したところ、「implode」した「好きな教科」の値をどうやって「編集ページ」のチェックボックスに当てるかに悩んでいます。

色々調べてみましたが解決できません。

発生している問題

htmlにてチェックボックスにチェックされた値を「implode」で区切ってMySQLに登録された値を「編集ページ」にて該当のチェックボックスに割り当てたい

該当のソースコード

【input.html】:入力フォーム

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>入力</title> 8</head> 9<body> 10 <form method="post" action="s_add_c.php"> 11 お名前: 12 <input type="text" name="user_name"><br /> 13 フリガナ: 14 <input type="text" name="user_name_kana"><br /> 15 性 別: 16 <input type="radio" name="user_gender" id="" value="">17 <input type="radio" name="user_gender" id="" value=""><br /> 18 年 齢: 19 <input type="number" name="user_age" id=""><br /> 20 好きな教科: 21 <input type="checkbox" name="user_like_study[]" id="" value="国語">国語 22 <input type="checkbox" name="user_like_study[]" id="" value="数学">数学 23 <input type="checkbox" name="user_like_study[]" id="" value="社会">社会 24 <input type="checkbox" name="user_like_study[]" id="" value="理科">理科 25 <input type="checkbox" name="user_like_study[]" id="" value="英語">英語 26 <input type="checkbox" name="user_like_study[]" id="" value="美術">美術 27 <input type="checkbox" name="user_like_study[]" id="" value="体育">体育 28 <input type="checkbox" name="user_like_study[]" id="" value="保健">保健 29 <input type="checkbox" name="user_like_study[]" id="" value="技術">技術 30 <input type="checkbox" name="user_like_study[]" id="" value="家庭">家庭<br /> 31 <input type="submit" value="送信"> 32 </form> 33</body> 34</html>

該当のソースコード

【s_add_c.php】:入力チェック用

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>入力チェック</title> 8</head> 9<body> 10 <?php 11 12 $user_name=filter_input(INPUT_POST,'user_name',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 13 $user_name_kana=filter_input(INPUT_POST,'user_name_kana',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 14 $user_gender=filter_input(INPUT_POST,'user_gender',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 15 $user_age=filter_input(INPUT_POST,'user_age',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 16 $user_like_study=$_POST['user_like_study']; 17 $user_like_study=implode(',',$user_like_study); 18 $user_like_study=htmlspecialchars($user_like_study,ENT_QUOTES,'UTF-8'); 19 20 print 'お名前:'; 21 print $user_name; 22 print '<br />'; 23 print 'フリガナ:'; 24 print $user_name_kana; 25 print '<br />'; 26 print '性別:'; 27 print $user_gender; 28 print '<br />'; 29 print '年齢:'; 30 print $user_age; 31 print '<br />'; 32 print '好きな教科:'; 33 print $user_like_study; 34 print '<br />'; 35 36 print '<form method="post" action="s_add_d.php">'; 37 print '<input type="hidden" name="user_name" value="'.$user_name.'">'; 38 print '<input type="hidden" name="user_name_kana" value="'.$user_name_kana.'">'; 39 print '<input type="hidden" name="user_gender" value="'.$user_gender.'">'; 40 print '<input type="hidden" name="user_age" value="'.$user_age.'">'; 41 print '<input type="hidden" name="user_like_study" value="'.$user_like_study2.'">'; 42 print '<input type="button" onclock="history.back()" value="戻る">'; 43 print '<input type="submit" value="OK">'; 44 print '</form>'; 45 ?> 46</body> 47</html>

該当のソースコード

【s_add_d.php】:MySQLへ登録

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8</head> 9<body> 10<?php 11 try{ 12 13 $user_name=filter_input(INPUT_POST,'user_name',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 14 $user_name_kana=filter_input(INPUT_POST,'user_name_kana',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 15 $user_gender=filter_input(INPUT_POST,'user_gender',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 16 $user_age=filter_input(INPUT_POST,'user_age',FILTER_SANITIZE_FULL_SPECIAL_CHARS); 17 $user_like_study=$_POST['user_like_study']; 18 19 $dsn='mysql:dbname=test;host=localhost;charset=utf8'; 20 $user='root'; 21 $password=''; 22 $dbh=new PDO($dsn,$user,$password); 23 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 24 $sql='INSERT INTO learning_study (user_name,user_name_kana,user_gender,user_age,user_like_study) VALUE (?,?,?,?,?)'; 25 26 $stmt=$dbh->prepare($sql); 27 $data[]=$user_name; 28 $data[]=$user_name_kana; 29 $data[]=$user_gender; 30 $data[]=$user_age; 31 $data[]=$user_like_study; 32 $stmt->execute($data); 33 34 $dbh=null; 35 36 print $user_name; 37 print 'さんを追加しました<br />'; 38 39 }catch(Exception $e){ 40 print $e; 41 } 42?> 43</body> 44</html>

試したこと

htmlのフォームにて入力、送信した際、複数チェックされたチェックボックスを「implode」にて「,」区切りにてMySQL
登録しましたので、「explode」で「,」で区切り、配列に戻しましたが、それぞれ入力内容が異なるチェックボックスの内容を「編集ページ」内のチェックボックスにどう戻すかに苦慮しております。

php

1explode(',',$user_like_study);

を記述しましたが、それぞれのレコードにより順番が異なるため、どのように割り当てたらいいのでしょうか?
そもそも、新規登録のフォームからMySQLに登録する際に他のいい方法があるのでしょうか?
「新規作成」「編集」「削除」ページがあるという前提でご教授いただければ幸いです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

構造としてはこんな感じですかね

SQL

1create table user( 2id int primary key, 3unser_name varchar(20), 4unser_name_kana varchar(20), 5user_gender set('男','女','選択しない'), 6user_age int, 7user_like_study set('国語','数学','社会','理科','英語','美術','体育','保健','技術','家庭') 8); 9 10insert into user values 11(1,'山田太郎','ヤマダタロウ','男',20,'国語,社会,英語');

id=1で検索したuser_like_studyをphpでexplodeして各教科とマッチングすればいいでしょう

PHP

1$user_like_study='国語,社会,英語'; 2$studys=['国語','数学','社会','理科','英語','美術','体育','保健','技術','家庭']; 3foreach($studys as $study){ 4 $checked['user_like_study'][$study]=in_array($study,explode(",",$user_like_study))==false?"":" checked"; 5} 6print_r($checked); 7?> 8<form method="post"> 9お名前: 10<input type="text" name="user_name" required><br /> 11フリガナ: 12<input type="text" name="user_name_kana" required><br /> 13性 別: 14<label><input type="radio" name="user_gender" value="1"></label> 15<label><input type="radio" name="user_gender" value="2"></label> 16<label><input type="radio" name="user_gender" value="99" checked>選択しない</label><br> 17年 齢: 18<input type="number" name="user_age" min="10" max="100" required><br /> 19好きな教科: 20<label><input type="checkbox" name="user_like_study[]" value="国語"<?=$checked["user_like_study"]["国語"];?>>国語</label> 21<label><input type="checkbox" name="user_like_study[]" value="数学"<?=$checked["user_like_study"]["数学"];?>>数学</label> 22<label><input type="checkbox" name="user_like_study[]" value="社会"<?=$checked["user_like_study"]["社会"];?>>社会</label> 23<label><input type="checkbox" name="user_like_study[]" value="理科"<?=$checked["user_like_study"]["理科"];?>>理科</label> 24<label><input type="checkbox" name="user_like_study[]" value="英語"<?=$checked["user_like_study"]["英語"];?>>英語</label> 25<label><input type="checkbox" name="user_like_study[]" value="美術"<?=$checked["user_like_study"]["美術"];?>>美術</label> 26<label><input type="checkbox" name="user_like_study[]" value="体育"<?=$checked["user_like_study"]["体育"];?>>体育</label> 27<label><input type="checkbox" name="user_like_study[]" value="保健"<?=$checked["user_like_study"]["保健"];?>>保健</label> 28<label><input type="checkbox" name="user_like_study[]" value="技術"<?=$checked["user_like_study"]["技術"];?>>技術</label> 29<label><input type="checkbox" name="user_like_study[]" value="家庭"<?=$checked["user_like_study"]["家庭"];?>>家庭</label><br> 30<label><input type="submit" value="送信"> 31</form>

投稿2019/08/22 09:35

yambejp

総合スコア114775

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

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

skyline5105

2019/08/23 01:40

yambejp様 早速のご教授ありがとうございます。 教えていただいた方法でやってみたところすんなり解決しました。自分としてはまさに目からうろこ状態でした。 どのように処理をしているか1行ずつ確認してみました。 誠に恐れ入りますが、自分の理解が正しいかをご確認いただきたく思います。 まず、 $user_like_study='国語,社会,英語'; は、implodeしてデータベースに登録された値 $studys=['国語','数学','社会','理科','英語','美術','体育','保健','技術','家庭']; yambejp様がデモ用として作成されたのかと思いましたが、よくよく考えると次行のforeachの為の配列(あらかじめ「好きな教科」のすべてを準備する)という解釈でよろしいのかと思います。 foreach($studys as $study){ $checked['user_like_study'][$study]=in_array($study,explode(",",$user_like_study))==false?"":" checked"; } foreachで$studysを$studyとして繰り返す。 (ここでは$studysは10個の値があるので10回繰り返す) in_array($study,explode(",",$user_like_study)) in_arrayでexplode(",",$user_like_study)《$user_like_studyの値を「,」で配列に戻す》の中に$studyの値があるかの確認をし、 in_array($study,explode(",",$user_like_study))==false?"":" checked" 値がなければ「""」で値があれば「" checked"」を$checkedに格納する。 好きな教科: <label><input type="checkbox" name="user_like_study[]" value="国語"<?=$checked["user_like_study"]["国語"];?>>国語</label> <?=$checked["user_like_study"]["国語"];?> この場合、$checked配列"国語"の中の$checkedの値をあてる。 (配列"国語"の値が" checked"なら" checked"、""なら""が入る) ご教授いただきました記述にありますように $checked['user_like_study'][$study]とするのは何か意図があるのでしょうか? print_r($checked);を確認しますと、$user_like_study='国語,社会,英語';の場合、 Array ( [user_like_study] => Array ( [国語] => checked [数学] => [社会] => checked [理科] => [英語] => checked [美術] => [体育] => [保健] => [技術] => [家庭] => ) ) となりました。$checked['user_like_study'][$study]としてあるのは意図があるのでしょうか? 自分には理解できず、仮に$checked[$study]としても意図する動作になりました。 ※この文書を入力しているときに、もしかしたら「複数のチェックボックスの項目(「好きな教科」以外にチェックボックスの項目があった場合)にも対応できるため」かな...とも思ったりしました。
yambejp

2019/08/23 02:03

> $checked['user_like_study'][$study]としてあるのは意図 単にチェックボックスが複数あった際に場合分けができるようにしてあるだけです ひとつしかないならご指摘の通り「$checked[$study]」でも大丈夫だと思います
skyline5105

2019/08/23 02:09

yamabejp様 ありがとうございます。大変わかりやすくご教授いただいて理解が深まりました。 誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問