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

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

ただいまの
回答率

88.22%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 3,347

tranders1990

score 25

<!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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tranders1990

    2017/08/29 15:29

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

    キャンセル

  • tranders1990

    2017/08/29 15:42

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

    キャンセル

  • この投稿は削除されました

回答 1

+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>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/29 18:41

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

    キャンセル

  • 2017/08/29 18:56

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

    キャンセル

  • 2017/08/29 19:12 編集

    「名前」と「メッセージ」だけを保存するサンプルコードを追加しました。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マニュアルの各機能のページをコピペするのが確実です。

    キャンセル

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

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る