フォームの内容をデータベースに入れたい
- 評価
- クリップ 2
- VIEW 3,347
<!DOCTYPE html>
<head>
<title>
サンプルフォーム
</title>
</head>
<body>
<form action="0829post.php" method="post"><br>
<p>お名前:<input type="text" name="name" width="50px"><br>
<p>ご住所:<input type="text" name="address"><br>
<p>ご年齢:<input type="text" name="age"><br>
<p>TEL:<input type="text" name="tel"><br>
<p>お問い合わせ:<br>
<textarea name="contact" cols ="100px" rows="10px"></textarea>
<input type="submit">
</form>
</body>
</html>
上記のようなフォームを作りました。
これの受取先のソースコードは以下になります
<!DOCTYPE html>
<head>
<title>
サンプルフォーム受け取り
</title>
</head>
<body>
<?php
$data1 = $_POST['name'];
$data2 = $_POST['address'];
$data3 = $_POST['age'];
$data4 = $_POST['tel'];
$data5 = nl2br($_POST['contact']);
echo '<form aciton="0829post2.php" method="POST">';
echo $data1.'<br>';
echo $data2.'<br>';
echo $data3.'<br>';
echo $data4.'<br>';
echo $data5.'<br>';
echo '<input type="submit">';
echo '</form>';
?>
<input type="submit" value="戻る" onclick="history.back()">
</body>
</html>
受け取りのphp側からmysqlにデータベースにフォームの内容を格納しようと思いPDO接続を
試みたりしていたのですが、なかなかうまくいかず。
詳しい方いらっしゃったら、アドバイスよろしくお願いいたします。
ーーーーここから追記ーーーーーー
皆様、コメントありがとうございます。
上の受取ページからさらに新規ページを追加し、データベースに入れられるかどうか試してみました。
結果は、何も表示されませんでした。
修正箇所などございましたら、アドバイスいただければと思います。
皆様のお力添え賜りたく思います。
宜しくお願いいたします。
<?php
try{
$dataname = $data1;
$dataaddress = $data2;
$dataage = $data3;
$datatel = $data4;
$datacontact = $data5;
$dsn = 'mysql:dbname=sampleform;host=localhost;charset=utf8';
$user = 'tobe';
$password = 'VyPGbQPSVSibL5FW';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'insert into test(お名前, 住所,ご年齢,TEL,お問い合わせ)values(?,?)';
$stmt = $dbh->prepare($sql);
$data[] = $dataname;
$data[] = $dataaddress;
$data[] = $dataage;
$data[] = $datatel;
$data[] = $datacontact;
$stmt->execute($data);
$dbh = null;
if($data[] = ''){
print '無事追加できました';
}
上記までのコードでは0829post.phpで何も表示されないという状況だったので
コメントいただいていた方から修正してもらっていたものを下記に記載いたしております。
それが下です↓
---------さらに追記-----------
<!DOCTYPE html>
<head>
<title>
サンプルフォーム受け取り
</title>
</head>
<body>
<?php
$data1 = $_POST['name'];
$data2 = $_POST['address'];
$data3 = $_POST['age'];
$data4 = $_POST['tel'];
$data5 = nl2br($_POST['contact']);
echo '<form action="0829post2.php" method="post">';
echo $data1.'<input type="hidden" name="name" value="'.htmlspecialchars($data1).'"><br>';
echo $data2.'<br>';
echo $data3.'<br>';
echo $data4.'<br>';
echo $data5.'<br>';
echo '<input type="submit">';
echo '</form>';
?>
<input type="submit" value="戻る" onclick="history.back()">
</body>
</html>
コード
↓修正いたしました0829post2.phpです。
<?php
try{
$dataname = $_POST["name"];
$dataaddress = $_POST['address'];
$dataage = $_POST['age'];
$datatel = $_POST['tel'];
$datacontact = nl2br($_POST['contact']);
$dsn = 'mysql:dbname=sampleform;host=localhost;charset=utf8';
$user = 'tobe';
$password = 'VyPGbQPSVSibL5FW';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'insert into test(お名前, 住所,ご年齢,TEL,お問い合わせ)values(?,?)';
$stmt = $dbh->prepare($sql);
$data[] = $dataname;
$data[] = $dataaddress;
$data[] = $dataage;
$data[] = $datatel;
$data[] = $datacontact;
$stmt->execute($data);
$dbh = null;
if($stmt->execute($data)){
print '無事追加できました';
}else{
print '追加失敗';
}
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
/*
var_dump($_POST);exit;
*/
try{
$dataname = $_POST["name"];
$dataaddress = $_POST['address'];
$dataage = $_POST['age'];
$datatel = $_POST['tel'];
$datacontact = nl2br($_POST['contact']);
$dsn = 'mysql:dbname=sampleform;host=localhost;charset=utf8';
$user = 'tobe';
$password = 'VyPGbQPSVSibL5FW';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'insert into test(お名前, 住所,ご年齢,TEL,お問い合わせ)values(?,?,?,?,?)';
$stmt = $dbh->prepare($sql);
$data[] = $dataname;
$data[] = $dataaddress;
$data[] = $dataage;
$data[] = $datatel;
$data[] = $datacontact;
$stmt->execute($data);
$dbh = null;
if($stmt->execute($data)){
print '無事追加できました';
}else{
print '追加失敗';
}
}catch(Exception $e){
echo $e->message();
};
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
追加されたソースが0829post2.phpだとすると、
0829post2.phpに対しては何も送信されていないことになります。
0829post.phpを確認画面として入力内容を表示するところはひとまず良いのですが、
(本来はHTMLエスケープなどをすべきです)
HTML上表に出ているだけで、form送信のためのinputなどのformコントロールがsubmitボタンしかありません。
下記のようにして送信情報もform内に入れておきましょう。
echo $data1.'<input type="hidden" name="name" value="'.htmlspecialchars($data1).'"><br>';
つまり、POST送信はactionで指定した先にしか送信されません。
上記のように0829post.phpを修正後、0829post2.phpで0829post.phpからPOST送信された値を受け取る記述が必要になります。
修正前
$dataname = $data1;
↓
修正後
$dataname = $_POST["name"];
このデータを受け渡す流れは下記の記事が参考になるかもしれません。
追記:
「何も表示されない」原因はおそらく下記にあります。
if($data[] = ''){
これだと$data[]に空文字を代入しているだけになっています。
if文の条件としてはif($data[] == ''){
のような書き方が正しいですね。
ただ、これだと「無事にデータが追加できた」担保にはならないですし、配列のエラーが出そうなので、
追加処理実行結果の成否で判断すると良いです。
if($stmt->execute($data)){
print '無事追加できました';
}else{
print '追加失敗';
}
エラーについて追記:
try-catchの構文エラーです。
例外を捕捉する処理が書かれていません。
下記のような形式にする必要があります。
try{
//何かしらの処理
}catch(Exception $e){
//エラーが合った場合の処理
}
サンプルコード
入力画面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
投稿
</title>
</head>
<body>
<form action="confirm.php" method="post"><br>
<p>名前:<input type="text" name="name"></p>
<p>メッセージ:<br>
<textarea name="message"></textarea></p>
<input type="submit">
</form>
</body>
</html>
確認画面(confirm.php)
<?php
header('Content-Type: text/html; charset=UTF-8');
//POSTでなければアクセスさせない
if($_SERVER["REQUEST_METHOD"] != "POST"){
echo "直にアクセスは出来ません";
exit;
}else{
//var_dump($_POST);exit;
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
$message = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
確認画面
</title>
</head>
<body>
<?php
echo '<form action="complete.php" method="POST">';
echo '<p>名前:'.$name.'<input type="hidden" name="name" value="'.$name.'"></p>';
echo '<p>メッセージ:<br />';
echo nl2br($message).'<input type="hidden" name="message" value="'.$message.'"></p>';
echo '<input type="submit">';
echo '</form>';
?>
</body>
</html>
完了画面(complete.php)
<?php
header('Content-Type: text/html; charset=UTF-8');
//POSTでなければアクセスさせない
if($_SERVER["REQUEST_METHOD"] != "POST"){
echo "直にアクセスは出来ません";
exit;
}else{
//var_dump($_POST);exit;
$dataname = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
$datamessage = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8');
try{
$dsn = 'mysql:dbname=***;host=localhost;charset=utf8';
$user = '****';
$password = '****';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'insert into test(name,message)values(?,?)';
$stmt = $dbh->prepare($sql);
$data[] = $dataname;
$data[] = $datamessage;
$dbh = null;
if($stmt->execute($data)){
$complete_message = '無事追加できました';
}else{
$complete_message = '追加失敗';
}
}catch(Exception $e){
$complete_message = $e->getMessage();
};
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
完了画面
</title>
</head>
<body>
<?php
echo '<p>'.$complete_message.'</p>';
?>
</body>
</html>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
aro10
2017/08/29 15:15 編集
受取先のソースコードにDBアクセスのコードが無い様なので、自身で試されたDBアクセスのコードを記述してどこが問題なのかを記載した方が回答を得やすいかと思います。
aozuki
2017/08/29 15:17
どこがうまくいかないのでしょうか?MySQLへの接続が出来ませんか?テーブルへの挿入が出来ませんか?具体的にどこで詰まっているのかを詳しく書いていただければ回答も得られやすいかと思います。
tranders1990
2017/08/29 15:20
受け取りのページに一度はPDO接続をしてテーブルに受け取りデータの追加をしようとしていたのですが、接続はできても、追加はできないというところで詰まっており、質問内容では、データベース関連のことはあえて記載しておりません。受け取りのページでやるならどうすれば良いか、新しいページを作った場合にはどうするべきかなどを教えていただけたら幸いです。
m.ts10806
2017/08/29 15:28
なぜ追加ができなかったかはそのソースコードがないと判断が出来ません。間違いでも構いませんよ。だいたいのことが案外ちょっとした記述のミスや漏れが原因です。
tranders1990
2017/08/29 15:29
わかりました。それでは追記させていただきます。少々お待ちいただければと思います。お手数おかけいたしますがよろしく願いいたします。
tranders1990
2017/08/29 15:42
新規追加いたしましたので、アドバイスいただければと思います。実行結果のキャプチャも載せたほうがよかったでしょうか・・・。
この投稿は削除されました