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

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

ただいまの
回答率

90.34%

PHPでフォームから受け取ったデータをデーターベースに登録できません。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 618

andrew57

score 116

前提・実現したいこと

新規登録フォームを作成し、そこからmysqlに繋げて登録しようとしています。
エラー内容が出ずに、データーベースを見てみると登録されていないので困っています。
もしかしたら、文法の書き方に問題があるかと思われますが、自分では解決できないので
ご質問させていただきました。

なぜ、エラーが出ないのかわかりません。
index_db.phpはデーターベースに繋げる専用のファイルで、
それをregistration.phpというファイルにrewuire_onceで受け取っています。
registration.phpはinsertで登録しようとしているファイルです。

発生している問題・エラーメッセージ

なし

該当のソースコード

新規登録フォーム

<!DOCTYPE html>
<html lang=“ja”>
 <head>
  <meta charset="UTF-8">
  <title>My Web Site</title>
  <link rel="stylesheet" href="style2.css">

 </head>
 <body>



 <header>
    <div class="header-left">
      <img class="logo" src="https://www.fastpic.jp/images.php?file=3519571152.jpg" alt="ロゴ画像">
 </div>

</header>



<div class="main">
<ol class="topic-path">
  <li><a href="#">一覧へ</a></li>
  <li>登録</li>
</ol>


<div class="container">
<h1>登録</h1>
    <hr>


<form action="confirm.php" method="post">
<table  border="0" class="touroku">

  <tr>
    <td align="right"> 氏名: </td>
    <td><input type="text" size="25" name="yourname"></td>
  </tr>

  <tr>
    <td align="right"> 都道府県: </td>
    <td>  <select name="live">
            <option value="選択してください">選択してください</option>
            <option value="東京">東京</option>
            <option value="大阪">大阪</option>
            <option value="名古屋">名古屋</option>
           </select>
    </td>
  </tr>

  <tr>
    <td align="right"> 電話番号: </td>
    <td><input type="text" size="30" name="tel"></td>
  </tr>

  <tr>
    <td align="right"> 性別: </td>
    <td><label><input type="radio" name="gender" value="男性">男性</label>
        <label><input type="radio" name="gender" value="女性">女性</label>
        <label><input type="radio" name="gender" value="未回答">未回答</label>
    </td>
  </tr>

  <tr>
    <td align="right"> 趣味:</td>
    <td>
      <label><input type="checkbox" value="趣味" name="shumi[1]">映画</label>
      <label><input type="checkbox" value="趣味" name="shumi[2]">グルメ</label>
      <label><input type="checkbox" value="趣味" name="shumi[3]">スポーツ<br></label>
      <label><input type="checkbox" value="趣味" name="shumi[4]">読書</label>
      <label><input type="checkbox" value="趣味" name="shumi[5]">ファッション</label>
      <label><input type="checkbox" value="趣味" name="shumi[6]">アニメ</label>
    </td>
  </tr>

  <tr>
    <td align="right"> 備考欄: </td>
    <td><textarea name="kanso" rows="3" cols="40">感想</textarea></td>
  </tr>

</table>

<a href="index.html"><input type="button" value="一覧へ戻る"></a>
<a href="confirm.php"><input type="submit" value="確認する"></a>



</div>
</div>
</div>

<footer>




</footer>

</div>


 </body>
</html>

確認フォーム

<?php
// $_POSTで受け取る
$yourname = $_POST["yourname"];
$live = $_POST["live"];
$tel = $_POST["tel"];
$gender = $_POST["gender"];
$shumi = $_POST["shumi"];
$kanso = $_POST["kanso"];
?>



<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>My Web Site</title>
<link rel="stylesheet" href="style3.css">

</head>
<body>

  <div class="main">
    <div class="form-title"></div>
    <h2>確認画面</h2>


<table border="0" class="form-item">
<tr>
  <td align="right" class="form-item"> 氏名 : </td>
  <td align="left"><?php echo $yourname ?></td>
</tr>

<tr>
  <td align="right" class="form-item"> 都道府県 : </td>
  <td align="left"><?php echo $live ?></td>
</tr>

<tr>
  <td align="right" class="form-item"> 電話番号 : </td>
  <td align="left"><?php echo $tel ?></td>
</tr>

<tr>
  <td align="right" class="form-item"> 性別 : </td>
  <td align="left">
    <?php
    if (isset($_POST["gender"])) {//もしPOSTに[genderがあれば
    if ($_POST["gender"] == "男性") { //もし男性なら
    echo "男性";
    }
    elseif ($_POST["gender"] == "女性") { //女性なら
    echo "女性";
    }
    elseif ($_POST["gender"] == "未回答") { //未回答なら
    echo "未回答";
    }
    else {
      echo "どれかチェックしてから[送信]ボタンを押してください。";
    }
    }
    ?>
  </td>
</tr>

<tr>
  <td align="right" class="form-item"> 趣味 : </td>
  <td align="left">
    <?php
    if (isset($_POST["shumi"])) { //チェックされていれば
    $shumi = $_POST["shumi"]; //変数 $shumi に格納
    }
    if (isset($shumi[1])) {
      echo " 映画";
    }
    if (isset($shumi[2])) {
      echo " グルメ";
    }
    if (isset($shumi[3])) {
      echo " スポーツ";
    }
    if (isset($shumi[4])) {
      echo " 読書";
    }
    if (isset($shumi[5])) {
      echo " ファッション";
    }
    if (isset($shumi[6])) {
      echo " アニメ";
    }
    else {
      echo "";
    }
     ?>
  </td>
</tr>

<tr>
  <td align="right" class="form-item"> 備考欄 : </td>
  <td align="left"><?php echo $kanso ?></td>
</tr>
</table>


<a href="index2.html"><input type="button" name="back" width="30px" value="戻る"></a>
<a href="registration.php"><input type="submit" name="button1" width="30px" value="送信"></p></a>


</div>
</div>


</body>
</html>
(index.php データーベースに繋げるための専用のファイル)

<?php
//DBにMysql、データベース名・testを指定。
$dsn = 'mysql:dbname=uriage;host=localhost';

//DBに接続するためのユーザー名・パスワードを設定
$user = 'andrew';
$password = 'andrew135';


try{
//データーベースに接続
    $pdo = new PDO($dsn, $user, $password);


}

//接続に失敗した際のエラー処理
catch (PDOException $e){
    print('エラーが発生しました。:'.$e->getMessage());
    die();
}
?>
(registration.phpのコード)

<?php

require_once('index_db.php');


try {

//データーベースに接続


    //ここに処理を記載
    $stmt = $pdo->prepare("INSERT INTO member (yourname, live, tel, gender, hobby, shumi) VALUES (:yourname, :live, :tel, :gender, :hobby, :shumi)");
    $stmt->bindValue(':yourname', $yourname, PDO::PARAM_STR);
    $stmt->bindValue(':live', $live, PDO::PARAM_STR);
    $stmt->bindValue(':tel', $tel, PDO::PARAM_INT);
    $stmt->bindValue(':gender', $gender, PDO::PARAM_STR);
    $stmt->bindValue(':shumi', $shumi, PDO::PARAM_STR);
    $stmt->bindValue(':shumi', $kanso, PDO::PARAM_STR);
    $stmt->execute();
    if($stmt){
      echo 'stmt OK!!';
    }else{
      echo 'stmt NG...';
    }
    //接続終了
    $pdo = null;
}

//接続に失敗した際のエラー処理
catch (Exception $e){
  echo 'error';
    echo('エラーが発生しました。:'.$e->getMessage());
    die();
}


?>
<html>
<head>

<title>OK</title>
</head>
<body>

<p>登録完了!</p>
</body>
</html>

試したこと

registration.phpの中のtryの前にPOSTで受け取る内容のデーターを入れましたが解決できませんでした。

$yourname = $_POST["yourname"];
$live = $_POST["live"];
$tel = $_POST["tel"];
$gender = $_POST["gender"];
$shumi = $_POST["shumi"];
$kanso = $_POST["kanso"];

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

PHP 5.6.30, mysql  Ver 14.14

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • andrew57

    2017/08/18 15:21

    create table member( id INT(11) NOT NULL PRIMARY KEY, yourname varchar(255) NOT NULL, live varchar(255) NULL, tel varchar(20) NULL, gender varchar(255) NULL, shumi varchar(255) NULL, kanso varchar(255) NULL );

    キャンセル

  • m.ts10806

    2017/08/18 15:26

    回答しました。確認画面を介するのであればその旨も追記しておかないと正しい回答が得られません。自身の環境や、やろうとしていることの状況は正確書いていただけると助かります。

    キャンセル

  • andrew57

    2017/08/18 23:30

    ありがとうございます!無事、解決できました。これから、気をつけていきたいと思います。ご指摘ありがとうございました。

    キャンセル

回答 3

checkベストアンサー

+3

現状のつくりでは
入力画面から確認画面へ入力値(POST)は渡っていても、
確認画面から完了画面(registration.php)へは値が渡っていません。
POSTはあくまでformのactionに指定したプログラムへのみ渡します。

確認画面も<form>で囲いhiddenで同名で持たせてPOST値をそれぞれ設定しsubmitするか
確認画面で$_POSTをセッションに入れて完了画面でセッションを受け取るかして
完了画面に入力画面の入力値を渡すようにしてください。

追記:
formの閉じ</form>がありませんので念のためきちんと閉じておいてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

$stmt->bindValue(':shumi', $kanso, PDO::PARAM_STR);
↓
$stmt->bindValue(':kanso', $kanso, PDO::PARAM_STR);

で如何でしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

下記の様に、registration.phpを修正すると動作しました。hobbyに値を設定していないのがマズいのではないでしょうか。
エラーメッセージ:
Invalid parameter number: number of bound variables does not match number of tokens in ~/registration.php on line 25

あと、接続文字列には下記の様に文字コードを設定してあげると良いですよ。
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8';

<?php

require_once('index_db.php');


try {

//データーベースに接続

    $yourname = "name";
    $live = "tokyo";
    $tel = "012-345-6677";
    $gender = "male";
    $hobby = "tennis";
    $shumi= "baseball";
    //ここに処理を記載
    $stmt = $pdo->prepare("INSERT INTO member (yourname, live, tel, gender, hobby, shumi) VALUES (:yourname, :live, :tel, :gender, :hobby, :shumi)");
    $stmt->bindValue(':yourname', $yourname, PDO::PARAM_STR);
    $stmt->bindValue(':live', $live, PDO::PARAM_STR);
    $stmt->bindValue(':tel', $tel, PDO::PARAM_STR);
    $stmt->bindValue(':gender', $gender, PDO::PARAM_STR);
    $stmt->bindValue(':shumi', $shumi, PDO::PARAM_STR); 
    $stmt->bindValue(':hobby', $hobby, PDO::PARAM_STR);//←これが無い
    //$stmt->bindValue(':shumi', $kanso, PDO::PARAM_STR);←誤り?
    $stmt->execute();
    if($stmt){
      echo 'stmt OK!!';
    }else{
      echo 'stmt NG...';
    }
    //接続終了
    $pdo = null;
}

//接続に失敗した際のエラー処理
catch (Exception $e){
  echo 'error';
    echo('エラーが発生しました。:'.$e->getMessage());
    die();
}


?>
<html>
<head>

<title>OK</title>
</head>
<body>

<p>登録完了!</p>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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