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

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

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

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

PHP

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

Q&A

1回答

735閲覧

フォームの内容をデータベースに入れたい

tranders1990

総合スコア25

MySQL

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

PHP

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

0グッド

2クリップ

投稿2017/08/29 06:11

編集2022/01/12 10:55

html

1<!DOCTYPE html> 2<head> 3<title> 4サンプルフォーム 5</title> 6</head> 7<body> 8<form action="0829post.php" method="post"><br> 9<p>お名前:<input type="text" name="name" width="50px"><br> 10<p>ご住所:<input type="text" name="address"><br> 11<p>ご年齢:<input type="text" name="age"><br> 12<p>TEL:<input type="text" name="tel"><br> 13<p>お問い合わせ:<br> 14<textarea name="contact" cols ="100px" rows="10px"></textarea> 15<input type="submit"> 16</form> 17</body> 18</html>

上記のようなフォームを作りました。
これの受取先のソースコードは以下になります

PHP

1<!DOCTYPE html> 2<head> 3<title> 4サンプルフォーム受け取り 5</title> 6</head> 7<body> 8<?php 9$data1 = $_POST['name']; 10$data2 = $_POST['address']; 11$data3 = $_POST['age']; 12$data4 = $_POST['tel']; 13$data5 = nl2br($_POST['contact']); 14echo '<form aciton="0829post2.php" method="POST">'; 15echo $data1.'<br>'; 16echo $data2.'<br>'; 17echo $data3.'<br>'; 18echo $data4.'<br>'; 19echo $data5.'<br>'; 20echo '<input type="submit">'; 21echo '</form>'; 22?> 23<input type="submit" value="戻る" onclick="history.back()"> 24</body> 25</html>

受け取りのphp側からmysqlにデータベースにフォームの内容を格納しようと思いPDO接続を
試みたりしていたのですが、なかなかうまくいかず。
詳しい方いらっしゃったら、アドバイスよろしくお願いいたします。

ーーーーここから追記ーーーーーー
皆様、コメントありがとうございます。
上の受取ページからさらに新規ページを追加し、データベースに入れられるかどうか試してみました。
結果は、何も表示されませんでした。
修正箇所などございましたら、アドバイスいただければと思います。
皆様のお力添え賜りたく思います。
宜しくお願いいたします。

PHP

1<?php 2try{ 3$dataname = $data1; 4$dataaddress = $data2; 5$dataage = $data3; 6$datatel = $data4; 7$datacontact = $data5; 8 9$dsn = 'mysql:dbname=sampleform;host=localhost;charset=utf8'; 10$user = 'tobe'; 11$password = 'VyPGbQPSVSibL5FW'; 12$dbh = new PDO($dsn,$user,$password); 13$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 14 15$sql = 'insert into test(お名前, 住所,ご年齢,TEL,お問い合わせ)values(?,?)'; 16$stmt = $dbh->prepare($sql); 17$data[] = $dataname; 18$data[] = $dataaddress; 19$data[] = $dataage; 20$data[] = $datatel; 21$data[] = $datacontact; 22$stmt->execute($data); 23$dbh = null; 24if($data[] = ''){ 25print '無事追加できました'; 26}

上記までのコードでは0829post.phpで何も表示されないという状況だったので
コメントいただいていた方から修正してもらっていたものを下記に記載いたしております。
それが下です↓
---------さらに追記-----------

php

1<!DOCTYPE html> 2<head> 3<title> 4サンプルフォーム受け取り 5</title> 6</head> 7<body> 8<?php 9$data1 = $_POST['name']; 10$data2 = $_POST['address']; 11$data3 = $_POST['age']; 12$data4 = $_POST['tel']; 13$data5 = nl2br($_POST['contact']); 14echo '<form action="0829post2.php" method="post">'; 15echo $data1.'<input type="hidden" name="name" value="'.htmlspecialchars($data1).'"><br>'; 16echo $data2.'<br>'; 17echo $data3.'<br>'; 18echo $data4.'<br>'; 19echo $data5.'<br>'; 20echo '<input type="submit">'; 21echo '</form>'; 22?> 23<input type="submit" value="戻る" onclick="history.back()"> 24</body> 25</html> 26コード

↓修正いたしました0829post2.phpです。

php

1<?php 2try{ 3$dataname = $_POST["name"]; 4$dataaddress = $_POST['address']; 5$dataage = $_POST['age']; 6$datatel = $_POST['tel']; 7$datacontact = nl2br($_POST['contact']); 8 9$dsn = 'mysql:dbname=sampleform;host=localhost;charset=utf8'; 10$user = 'tobe'; 11$password = 'VyPGbQPSVSibL5FW'; 12$dbh = new PDO($dsn,$user,$password); 13$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 14 15$sql = 'insert into test(お名前, 住所,ご年齢,TEL,お問い合わせ)values(?,?)'; 16$stmt = $dbh->prepare($sql); 17$data[] = $dataname; 18$data[] = $dataaddress; 19$data[] = $dataage; 20$data[] = $datatel; 21$data[] = $datacontact; 22$stmt->execute($data); 23$dbh = null; 24if($stmt->execute($data)){ 25 print '無事追加できました'; 26}else{ 27 print '追加失敗'; 28}

16時38分現在は以下のようなエラーがpost2.phpに出ています。
Fatal error: Cannot use try without catch or finally in C:\xampp\htdocs\3days\0829post2.php on line 30

17時31分現在の0829post2.phpのコードは下記になります。

php

1<?php 2/* 3var_dump($_POST);exit; 4*/ 5try{ 6$dataname = $_POST["name"]; 7$dataaddress = $_POST['address']; 8$dataage = $_POST['age']; 9$datatel = $_POST['tel']; 10$datacontact = nl2br($_POST['contact']); 11 12$dsn = 'mysql:dbname=sampleform;host=localhost;charset=utf8'; 13$user = 'tobe'; 14$password = 'VyPGbQPSVSibL5FW'; 15$dbh = new PDO($dsn,$user,$password); 16$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 17$sql = 'insert into test(お名前, 住所,ご年齢,TEL,お問い合わせ)values(?,?,?,?,?)'; 18$stmt = $dbh->prepare($sql); 19$data[] = $dataname; 20$data[] = $dataaddress; 21$data[] = $dataage; 22$data[] = $datatel; 23$data[] = $datacontact; 24$stmt->execute($data); 25$dbh = null; 26if($stmt->execute($data)){ 27 print '無事追加できました'; 28}else{ 29 print '追加失敗'; 30} 31}catch(Exception $e){ 32echo $e->message(); 33}; 34?>

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

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

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

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

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

aro10

2017/08/29 06:15 編集

受取先のソースコードにDBアクセスのコードが無い様なので、自身で試されたDBアクセスのコードを記述してどこが問題なのかを記載した方が回答を得やすいかと思います。
退会済みユーザー

退会済みユーザー

2017/08/29 06:17

どこがうまくいかないのでしょうか?MySQLへの接続が出来ませんか?テーブルへの挿入が出来ませんか?具体的にどこで詰まっているのかを詳しく書いていただければ回答も得られやすいかと思います。
tranders1990

2017/08/29 06:20

受け取りのページに一度はPDO接続をしてテーブルに受け取りデータの追加をしようとしていたのですが、接続はできても、追加はできないというところで詰まっており、質問内容では、データベース関連のことはあえて記載しておりません。受け取りのページでやるならどうすれば良いか、新しいページを作った場合にはどうするべきかなどを教えていただけたら幸いです。
m.ts10806

2017/08/29 06:28

なぜ追加ができなかったかはそのソースコードがないと判断が出来ません。間違いでも構いませんよ。だいたいのことが案外ちょっとした記述のミスや漏れが原因です。
tranders1990

2017/08/29 06:29

わかりました。それでは追記させていただきます。少々お待ちいただければと思います。お手数おかけいたしますがよろしく願いいたします。
tranders1990

2017/08/29 06:42

新規追加いたしましたので、アドバイスいただければと思います。実行結果のキャプチャも載せたほうがよかったでしょうか・・・。
guest

回答1

0

追加されたソースが0829post2.phpだとすると、
0829post2.phpに対しては何も送信されていないことになります。
0829post.phpを確認画面として入力内容を表示するところはひとまず良いのですが、
(本来はHTMLエスケープなどをすべきです)
HTML上表に出ているだけで、form送信のためのinputなどのformコントロールがsubmitボタンしかありません。
下記のようにして送信情報もform内に入れておきましょう。

html

1echo $data1.'<input type="hidden" name="name" value="'.htmlspecialchars($data1).'"><br>';

つまり、POST送信はactionで指定した先にしか送信されません。
上記のように0829post.phpを修正後、0829post2.phpで0829post.phpからPOST送信された値を受け取る記述が必要になります。

PHP

1修正前 2$dataname = $data1; 3 45修正後 6$dataname = $_POST["name"]; 7

このデータを受け渡す流れは下記の記事が参考になるかもしれません。

追記:
「何も表示されない」原因はおそらく下記にあります。

php

1if($data[] = ''){

これだと$data[]に空文字を代入しているだけになっています。
if文の条件としてはif($data[] == ''){のような書き方が正しいですね。
ただ、これだと「無事にデータが追加できた」担保にはならないですし、配列のエラーが出そうなので、
追加処理実行結果の成否で判断すると良いです。

php

1if($stmt->execute($data)){ 2 print '無事追加できました'; 3}else{ 4 print '追加失敗'; 5}

エラーについて追記:
try-catchの構文エラーです。
例外を捕捉する処理が書かれていません。
下記のような形式にする必要があります。

php

1try{ 2 //何かしらの処理 3 4}catch(Exception $e){ 5 //エラーが合った場合の処理 6}

サンプルコード

入力画面

html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="utf-8"> 5<title> 6投稿 7</title> 8</head> 9<body> 10<form action="confirm.php" method="post"><br> 11<p>名前:<input type="text" name="name"></p> 12<p>メッセージ:<br> 13<textarea name="message"></textarea></p> 14<input type="submit"> 15</form> 16</body> 17</html>

確認画面(confirm.php)

php

1<?php 2header('Content-Type: text/html; charset=UTF-8'); 3//POSTでなければアクセスさせない 4if($_SERVER["REQUEST_METHOD"] != "POST"){ 5 echo "直にアクセスは出来ません"; 6 exit; 7}else{ 8 //var_dump($_POST);exit; 9 $name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8'); 10 $message = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8'); 11} 12?> 13<!DOCTYPE html> 14<html> 15<head> 16<meta charset="utf-8"> 17<title> 18確認画面 19</title> 20</head> 21<body> 22<?php 23echo '<form action="complete.php" method="POST">'; 24echo '<p>名前:'.$name.'<input type="hidden" name="name" value="'.$name.'"></p>'; 25echo '<p>メッセージ:<br />'; 26echo nl2br($message).'<input type="hidden" name="message" value="'.$message.'"></p>'; 27echo '<input type="submit">'; 28echo '</form>'; 29?> 30</body> 31</html>

完了画面(complete.php)

php

1<?php 2header('Content-Type: text/html; charset=UTF-8'); 3//POSTでなければアクセスさせない 4if($_SERVER["REQUEST_METHOD"] != "POST"){ 5 echo "直にアクセスは出来ません"; 6 exit; 7}else{ 8 //var_dump($_POST);exit; 9 $dataname = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8'); 10 $datamessage = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8'); 11 try{ 12 $dsn = 'mysql:dbname=***;host=localhost;charset=utf8'; 13 $user = '****'; 14 $password = '****'; 15 $dbh = new PDO($dsn,$user,$password); 16 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 17 $sql = 'insert into test(name,message)values(?,?)'; 18 $stmt = $dbh->prepare($sql); 19 $data[] = $dataname; 20 $data[] = $datamessage; 21 $dbh = null; 22 if($stmt->execute($data)){ 23 $complete_message = '無事追加できました'; 24 }else{ 25 $complete_message = '追加失敗'; 26 } 27 }catch(Exception $e){ 28 $complete_message = $e->getMessage(); 29 }; 30} 31?> 32<!DOCTYPE html> 33<html> 34<head> 35<meta charset="utf-8"> 36<title> 37完了画面 38</title> 39</head> 40<body> 41<?php 42echo '<p>'.$complete_message.'</p>'; 43?> 44</body> 45</html>

投稿2017/08/29 06:52

編集2017/08/29 10:15
m.ts10806

総合スコア80731

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

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

tranders1990

2017/08/29 07:14

コメント書いてくださってありがとうございます。 エラーが出ました。 Parse error: syntax error, unexpected '>' in C:\xampp\htdocs\3days\0829post.php on line 16
tranders1990

2017/08/29 07:25

0829post.phpにボタンだけが表示されて内容は表示されず、かつ、データベースのテーブルにもフォームの内容が入っていないように思います。
m.ts10806

2017/08/29 07:26

どこの記述でしょう・・? syntax errorはPHP文法的に正しくない場合に出るものなので、どこかに記述ミスがあったんだと思います。
m.ts10806

2017/08/29 07:27

ソースコードを修正されたのでしたら修正後のソースコードをご提示ください。
m.ts10806

2017/08/29 07:31

あと、お手数かけますが、どのソースがどのファイルかも追記していただけると助かります。
tranders1990

2017/08/29 07:35

いえいえ、こちらこそお手数おかけさせてしまっていて大変申し訳ないです。 再編集いたしますので、少々お待ちください。 ほんとすいません。そしてありがとうございます。
m.ts10806

2017/08/29 07:35 編集

「サンプルフォーム受け取り」画面で入力画面からのhiddenに入れるように回答を書きましたが、全ての入力値に対して必要です。 今のままだとnameしか渡されていないはずです。 修正後、「サンプルフォーム受け取り」画面表示時にブラウザの「ソースを表示」をして入力値が正しくhiddenのvalueに設定されているかご確認ください。
m.ts10806

2017/08/29 07:36

また、「入力データを複数ページに渡って送る[hidden][PHP]」のリンクを貼りましたが参照されましたか?おそらく今回の対応に参考になるような記事のはずです・・
tranders1990

2017/08/29 07:39

見ていますよ。それとあわせてmts10806様のアドバイスも見ながら修正しております。
m.ts10806

2017/08/29 07:53

エラーについて追記しました。 またhiddenの件は完了画面(post2)に渡したい全ての入力値に対して設置しておいてくださいね。
m.ts10806

2017/08/29 07:59

あ、contactはtextareaなのでnl2br()をしていない$_POST['contact']をhiddenに設定した方がいいですね。nl2br()はあくまで表示のための関数ですし、DBには改行タグbrがないものを登録した方が良いです。
tranders1990

2017/08/29 08:00

mts10806様へ ありがとうございます。 catchを入れてその中に終了と出力するようにしたら、終了と画面に出力されるようになりました。 テーブルにはフォームデータが入らないままですが・・・。
tranders1990

2017/08/29 08:02

echo $data5のところにhiddenを入れていますよ。
m.ts10806

2017/08/29 08:04 編集

catchの中の処理が走るということはtryの中でエラーが起きているということです。(処理中に起きた異常=例外を捕捉するのが仕事です) echo $e->getMessage(); のように出力することでどのようなエラーが起きたのか確認できます。 その出力されたエラーメッセージをヒントに調整していってください。
m.ts10806

2017/08/29 08:06 編集

エラーメッセージは余程のことがない限りGoogle検索につっこめば解決につながるヒントの記事が出てきます。
tranders1990

2017/08/29 08:07

Fatal error: Call to undefined method PDOException::message() in C:\xampp\htdocs\3days\0829post2.php on line 30 このようなメッセージが出ました。 PDO接続がうまくできていないようですね・・・頑張ります!
m.ts10806

2017/08/29 08:10

insert文を見ていましたら、 insert into test(お名前, 住所,ご年齢,TEL,お問い合わせ)values(?,?) ↑指定しているカラムの数と入れようとしている値の数が合っていません。 カラムが5個で値が2個になっています。数を合わせないとSQL実行エラーとなります。
m.ts10806

2017/08/29 08:12

> Fatal error: Call to undefined method PDOException::message() in C:\xampp\htdocs\3days\0829post2.php on line 30 メッセージ内容からすると接続ができていないというよりPDOの存在しないメソッドにアクセスしようとしているように見受けられます。
tranders1990

2017/08/29 08:16

そしてそのエラーを治そうと13行目の$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXEPTION);を修正したらエラーが Fatal error: Undefined class constant 'ERRMODE_EXEPTION' in C:\xampp\htdocs\3days\0829post2.php on line 13 と出るようになりました。
m.ts10806

2017/08/29 08:17

DB登録処理の確認の前に、念のため、0829post2.php冒頭でvar_dump($_POST);exit;と入れて、入力画面の値が正しく渡っているか確認しておいてください。 (デバッグ記述なので正しく渡されていることが分かったらこの記述は消して構いません)
m.ts10806

2017/08/29 08:19 編集

「Undefined 」はPHPではよく使われるエラーの文言で「未定義」です。 覚えておくと良いです。
tranders1990

2017/08/29 08:20

var_dumpやりました。 結果は以下の通りです。 array(1) { ["name"]=> string(0) "" } そしてPDOの記述ミスも教えていただいてありがとうございます。
m.ts10806

2017/08/29 08:25

今現在のソースコードはどうなっているんでしょう・・? サンプルフォーム画面で「お名前」を入力して0829post.phpを経由して0829post2.phpに来たのであれば0829post2.phpには「お名前」は渡ってきているはずですが・・
tranders1990

2017/08/29 08:29

それがですね、こちらのエラーがまだ消えていないです。 Fatal error: Call to undefined method PDOException::message() in C:\xampp\htdocs\3days\0829post2.php on line 32 正しいものを貼らせていただいたのに、です。
tranders1990

2017/08/29 08:31

一番下のソースコードが一番新しいものになります。よろしくお願いします。
m.ts10806

2017/08/29 09:21

> echo $data5のところにhiddenを入れていますよ。 とあるので0829post.phpも修正されているはずですが・・?
tranders1990

2017/08/29 09:23

0829post.phpにほうに入れていたんですが、違うんですか?(汗)
m.ts10806

2017/08/29 09:27

あ、いえ、0829post.phpも修正されているはずなので0829post.phpの最新ソースもご提示くださいという意味です。 先ほど更新されたのは0829post2.phpのみですよね?
m.ts10806

2017/08/29 09:41

ちょっと収拾がつきにくくなってきたので、私の方でも同様の流れと機能を使った簡易サンプル作ってみます。 別回答になると思いますが、参考にしてみてください。
m.ts10806

2017/08/29 09:56

作ってて気づきました。 0829post.phpのformの送信先の属性名が「aciton」となってますね・・。(正しくは「action」) スペルミスがあるとブラウザにより正しく送信されないことがあります。
m.ts10806

2017/08/29 10:13 編集

「名前」と「メッセージ」だけを保存するサンプルコードを追加しました。htmlの装飾や戻るボタンは文字数削減のため(あと機能本筋とは関係ないため)省略しています。 DBにtest テーブルを作り id,name,messageとカラムを設定し、idにはオートインクリメント(要は自動採番)を指定しています。 このコードで私の方は正常に登録確認できています。 > Fatal error: Call to undefined method PDOException::message() これはcatchで出力しようとしているエラーメッセージ取得メソッド名が違っています。 正しくは 「getMessage()」です。 http://php.net/manual/ja/exception.getmessage.php 覚えるまではメソッド名はPHPマニュアルの各機能のページをコピペするのが確実です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問