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

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

詳細はこちら
PHP

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

Q&A

解決済

4回答

1968閲覧

php MySQLへの保存方法

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2019/10/06 10:19

編集2019/10/06 14:02

やりたいこと

MySQLに保存するプログラムを書いているのですが、保存されておらず、そのプログラムにより、表示されるはずのものが表示されていません。

なので、MySQLに保存するように指示しているコードでどこがよくない原因でどのように直せば良いのか教えてもらいたいです。

現在の状況

簡単なお問い合わせフォームを制作しています。

お問い合わせの流れ
【 index.html 】 
--お問い合わせ内容を記入
【 check.php 】
--記入漏れがあった際は、やり直させ
【 thanks.php 】
--データをMySQLに保存 
--お問い合わせ内容の表示 
--お問い合わせ内容をメールで保存

check.phpのコード

php

1<!DOCTYPE HTML PUBLIC="-//W3C//DTD/HTML 4.01Transitional//EN"> 2<html> 3 <head> 4 <meta http-equiv="content-type" charset="utf-8"> 5 </head> 6 7 8 <body> 9 10 <?php 11 $name=filter_input(INPUT_POST,"name"); 12 $content=filter_input(INPUT_POST,"content"); 13 $gread=filter_input(INPUT_POST,"gread"); 14 $greadnum=filter_input(INPUT_POST,"greadnum"); 15 $class=filter_input(INPUT_POST,"class"); 16 $iken=filter_input(INPUT_POST,"iken"); 17 18 19 $name=htmlspecialchars($name); 20 $content=htmlspecialchars($content); 21 $gread=htmlspecialchars($gread); 22 $greadnum=htmlspecialchars($greadnum); 23 $class=htmlspecialchars($class); 24 $iken=htmlspecialchars($iken); 25 26 27 28 29 if($name=="") 30{ 31 print"お名前が入力されていません。<br>"; 32} 33else 34{ 35 print"ようこそ"; 36 print$name; 37 print"様"; 38 print"<br>"; 39} 40 41 if($content=="") 42{ 43 print"報告内容が選択されていません。<br>"; 44} 45else 46{ 47 print"報告内容【"; 48 print$content; 49 print"】<br>"; 50 } 51 52 if($gread=="") 53{ 54 print"学校が選択されていません。<br>"; 55} 56else 57{ 58 print"学校【"; 59 print$gread; 60 print"】"; 61} 62 63 if($greadnum=="") 64{ 65 print"学年が選択されていません。<br>"; 66} 67else 68{ 69 print"学年【"; 70 print$greadnum; 71 print"】<br>"; 72} 73 74 if($class=="") 75{ 76 print"クラスが選択されていません。"; 77} 78else 79{ 80 print"クラス【"; 81 print$class; 82 print"】<br>"; 83} 84 85 if($iken=="") 86{ 87 print"ご意見が入力されていません。<br>"; 88} 89else 90{ 91 print"ご意見【"; 92 print $iken; 93 print"】<br>"; 94} 95 96if( $name==''||$content==''||$gread=''||$greadnum==''||$class=''||$iken=='') 97{ 98 print'<form>'; 99 print'<input type="button" onclick="history.back()" value="戻る">'; 100 print'</form>'; 101} 102else 103{ 104 print'<form method="post" action="thanks.php">'; 105 print '<input name="name" type="hidden" value="'.$name.'">'; 106 print '<input name="content" type="hidden" value="'.$content.'">'; 107 print '<input name="gread" type="hidden" value="'.$gread.'">'; 108 print '<input name="greadnum" type="hidden" value="'.$greadnum.'">'; 109 print '<input name="class" type="hidden" value="'.$class.'">'; 110 print '<input name="iken" type="hidden" value="'.$iken.'">'; 111 print'<input type="button" onclick="history.back()" value="戻る">'; 112 print'<input type="submit" value="OK">'; 113 print"</form>"; 114} 115?> 116 117</body> 118</html>

thanks.phpのコード

php

1<!DOCTYPE HTML PUBLIC="-//W3C//DTD/HTML 4.01Transitional//EN"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UFT-8"> 5</head> 6<body> 7 8 9<?php 10 11//mysql 12$dsn ='mysql:dbname=project;host=localhost'; 13$user= 'root'; 14$password= ''; 15$dbh = new PDO($dsn,$user.$password); 16$dbh->query('SET NAMES uft8'); 17 18$name=$_POST['name']; 19$content=$_POST['content']; 20$gread=$_POST['gread']; 21$greadnum=$_POST['greadnum']; 22$class=$_POST['class']; 23$iken=$_POST['iken']; 24 25$name=htmlspecialchars($name); 26$content=htmlspecialchars($content); 27$gread=htmlspecialchars($gread); 28$greadnum=htmlspecialchars($greadnum); 29$class=htmlspecialchars($class); 30$iken=htmlspecialchars($iken); 31 32// 表示内容 33print'報告内容'; 34print$name; 35print'様<br>'; 36print'ご報告ありがとうございます。<br>'; 37print'報告内容『'; 38print$goiken; 39print'』<br>'; 40print$email; 41print'メールに送りましたのでご確認ください。'; 42 43 44//メール内容 45$email_sub='ご報告を受け付けました。'; 46//$email_subにはメールタイトルが入る 47$mail_body=$name."様へ/nアンケートご協力ありがとうございました。"; 48//$mail_bodyにメール本文が入る 49$mail_body=html_entity_decode($mail_body,ENT_QUOTES,"UFT-8"); 50$mail_head='From:#'; 51//$mail_headでメールのヘッダー情報を記載 52mb_language('Japanese'); 53mb_internal_encoding("UFT-8"); 54mb_send_mail($email_sub,$mail_body,$mail_head); 55 56 57//自動保存機能 58$sql ='INSERT INTO anketo (nickname,email,goiken) VALUES("'.$name.'","'.$content.'","'.$gread.'","'.$greadnum.'","'.$class.'","'.$iken.'")'; 59$stmt = $dbh->prepare($sql); 60$stmt->execute(); 61 62$dbh = null; 63 64 65?> 66</body> 67</html>

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

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

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

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

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

kyoya0819

2019/10/06 10:39

何がわからないのですか?
kyoya0819

2019/10/06 10:47 編集

// 重複投稿してしまったため削除 //
退会済みユーザー

退会済みユーザー

2019/10/06 10:48

MySQLに保存するプログラムを書いているのですが、保存されておらず、そのプログラムにより、表示されるはずのものが表示されていません。 なので、MySQLに保存するように指示しているコードでどこがよくない原因でどのように直せば良いのか教えてもらいたいです。
kyoya0819

2019/10/06 10:49

と言うのは質問本文に追記してください。
退会済みユーザー

退会済みユーザー

2019/10/06 10:52

わかりました。
m.ts10806

2019/10/06 13:58

ひとつ前の質問もそうですし回答でも指摘されていましたが、起きている問題に対してタイトルが大きすぎます。もっと起きている問題寄せたり、要件のみを記載してください
guest

回答4

0

ベストアンサー

回答ではないです
コードがアンチパターンの塊です^^;
多分古めの教本を使用しているのだと思いますが、新しいものに切り替えたほうが良いです。基本的なところから間違って覚えてしまうので直すのが大変です。

ざっとですが気になったとこを記述しておきます。
・DOCTYPE が古い
・htmlspecialchars の適用が早すぎる。表示の際に適用してください
・比較箇所がゆるい比較になっている。php 初学者は厳密な比較を用いることをオススメします
・SET NAMES uft8 は適切ではないです。new PDO() する時に指定してください
・メールと DB 関連は問題だらけなので基礎から学習してください

以下は参考まで。
・ロジックとビューが混在しているので分離したほうが良いです
<br> の箇所は、スタイルで表現したほうが良いです
・filter_input を使用するのであれば簡易的なバリデーションもかけると良いです

投稿2019/10/06 20:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/10/07 18:49

教材を選ぶ上で、どれが最新か又どの教材が良いのかがわからないので苦労しています。 MySQLへの接続はインターネットを通して、できるようにと考えております。
退会済みユーザー

退会済みユーザー

2019/10/07 23:10

個人的見解ですが、入門書は「公式リファレンス」を読むまでのつなぎとして割り切り、さっさと「公式リファレンス」を中心とした学習に切り替えるのが良いと思います。 入門書には以下を求めると良いかなぁ。。。 ・基礎用語/基礎概念の理解 ・開発環境構築のサポート(教本の構築手順が自身の環境と全く同じ環境であることが理想です) ・デバッグ環境構築のサポート(これに踏み込んでいる教本は少ないかも) 3番目は学習効率を左右しますが、教本選びに時間を書けるのは本末転倒なので、上2つを教本から学び、「公式リファレンス」を読めるようになり、xdebug の導入に進むのが良いと思います。
guest

0

$userのあとが.(ピリオド)ではなく,(カンマ)

$dsn ='mysql:dbname=project;host=localhost'; $user= 'root'; $password= ''; $dbh = new PDO($dsn,$user.$password); $dbh->query('SET NAMES uft8');

try{ //mysql $dsn ='mysql:dbname=project;host=localhost'; $user= 'root'; $password= ''; $dbh = new PDO($dsn,$user.$password); $dbh->query('SET NAMES uft8'); }catch(PDOException $e){ print "接続できていません".$e->getMessage(); exit(); }

を付けてみようだめだったらエラーがでる

投稿2019/10/06 13:47

siratama_neko

総合スコア72

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

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

退会済みユーザー

退会済みユーザー

2019/10/07 18:50

ご回答ありがとうございます。 ご指摘くださった点を訂正・追加してみたところエラーが出ました。 MySQLへの接続ができていなかったみたいです。
guest

0

カラム指定に対して値の指定が多いからエラーになっているのでは

SQL

1$sql ='INSERT INTO anketo (nickname,email,goiken) VALUES("'.$name.'","'.$content.'","'.$gread.'","'.$greadnum.'","'.$class.'","'.$iken.'")';

 
なので、本来はこうなるのでは

SQL

1$sql ='INSERT INTO anketo (nickname,email,goiken) VALUES("'.$name.'","'.$email.'","'.$iken.'")';

 

また、
プリペアドステートメントを使ってINSERするのであれば、SQLインジェクション対策に必要なパラメータのエスケープ処理も自動で行ってくれるので以下のように書いたほうが良いかと思います。

SQL

1$sql =" 2INSERT INTO anketo ( 3 nickname, 4 email, 5 goiken 6) VALUES ( 7 :nickname, 8 :email, 9 :goiken 10) 11";

PHP

1$dbh = new PDO($dsn,$user,$password); 2$stmt = $dbh->prepare($sql); 3$stmt->bindValue( ':nickname', $name, PDO::PARAM_STR ); 4$stmt->bindValue( ':email', $email, PDO::PARAM_STR ); 5$stmt->bindValue( ':goiken', $iken, PDO::PARAM_STR ); 6$stmt->execute(); 7$dbh = null;

 

DBに登録されないのであれば、まずはDBに登録出来るかどうかの単純なSQLを書いて試して、
段階的に進めていけば自己解決出来るようになります。

面倒でも公式サイトのマニュアルをじっくり読むくせをつけると、今後何かしらではまったときに実は公式サイトに細かく書かれていたなんてことが結構あるので、マニュアルをちゃんと読む癖はつけておいた方が良いですよ。

投稿2019/10/06 13:45

編集2019/10/06 14:35
pinoko

総合スコア127

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

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

退会済みユーザー

退会済みユーザー

2019/10/06 14:00

カラム指定と値は、同じものがくるのでしょうか?
pinoko

2019/10/06 14:31

対比するようにちゃんと順番通りに書きます。カラム1には値1のように INSERT INTO テーブル名(カラム1, カラム2, カラム3,...) VALUES (値1, 値2, 値3,...); 登録したいカラムが3つだけの場合は3つのカラムを書いておけば、記載しなかったカラムには、 DEFAULT制約が設定されていればその値が格納され、設定されていなければNULLが自動で格納されます。
guest

0

  • commit() してないからでは?
  • SQLが間違っているかは、SQLの直前で SQLを echo して、それを直接 MySQL で実行できるか確認する

あたりを確認してみてはどうでしょう?

投稿2019/10/06 13:44

tanishi_a

総合スコア484

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問