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

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

ただいまの
回答率

90.51%

  • PHP

    20398questions

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

  • MySQL

    5871questions

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

入力をした内容をデータベースに反映をしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 345
退会済みユーザー

退会済みユーザー

前提・実現したいこと

PHPの入力フォームで入力した内容を
muSQLのデータベースに反映をさせたいのですが、
入力をした内容が反映されずに、Nullと表示されます
何が原因なのでしょうか?

該当のソースコード

<!-- input.php -->
<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <link rel="stylesheet" href="">
</head>
        <body>
        <form action=input_do.php method="post">
            <p>登録する情報を記入してください。</p>
              <form id="frmInput" name="frmInput" method="post" action="input_do.php">
                <dl>
                <dt>
                  <label for="maker_id">メーカーID</label>
                </dt>
                <dd>
                  <input name="maker_id" type="text" id="maker_id" size="10" maxlength="10 /">
                </dd>
                <dt>
                  <label for="item_name">商品名</label>
                </dt>
                <dd>
                  <input name="item_name" type="text" id="item_name" szie="35" maxlength="255" />
                </dd>
                <dt>
                  <label for="price">価格</label>
                </dt>  
                <dd>
                  <input name="price" type="text" id="price" szie="10" maxlength="10" /></dd>
                <dt>
                  <label for="keyword">キーワード</label>
                </dt>
                <dd>
                  <input name="keyword" type="text" id="keyword" size="50" maxlength="255" />
                </dd>
                </dl>
                <input type="submit" value="登録をする" />
              </form>        
        </body>
   </html>


修正前

<!-- input_do.php -->

<?php

try{
    $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8','root','suzusaga');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $stmt = $pdo->prepare('INSERT INTO my_items (maker_id, item_name, price, keyword) VALUES (:maker_id, :item_name, :price, :keyword)');

    $maker_id = htmlspecialchars($_POST["$d%"]);
    $item_name = htmlspecialchars($_POST["%s%"]);
    $price = htmlspecialchars($_POST["%d%"]);
    $keyword = htmlspecialchars($_POST["%s"]);

    $stmt->bindValue('maker_id', $maker_id);
    $stmt->bindParam('item_name', $item_name);
    $stmt->bindValue('price', $price);
    $stmt->bindParam('keyword', $keyword);

    $stmt->execute();

}

catch(PDOException $Exception) {
    die('接続エラー:'.$Exception->getMessage());
}

?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <link rel="stylesheet" href="">
</head>
<body>
    <p>登録完了しました。</p>
    <p><a href="input.php">TOPに戻る</a></p>

</body>
</html>    


修正後

<!-- input_do.php -->
<?php

try{
    $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8','root','suzusaga');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$sql = "SELECT * FROM my_items ORDER BY id DESC";
    $stmt = $pdo->query($sql);

print "接続に成功しました"."<br>";

    $stmt = $pdo->prepare('INSERT INTO my_items (maker_id, item_name, price, keyword) VALUES (:maker_id, :item_name, :price, :keyword)');

    $maker_id = htmlspecialchars($_POST["maker_id"]);
    $item_name = htmlspecialchars($_POST["item_name"]);
    $price = htmlspecialchars($_POST["price"]);
    $keyword = htmlspecialchars($_POST["keyword"]);

    $stmt->bindValue(':maker_id', $maker_id);
    $stmt->bindValue(':item_name', $item_name);
    $stmt->bindValue(':price', $price);
    $stmt->bindValue(':keyword', $keyword);

    $stmt->execute();
   var_dump($maker_id);
   var_dump($item_name);
   var_dump($price);
   var_dump($keyword);

}

catch(PDOException $Exception) {
    die('接続エラー:'.$Exception->getMessage());
}

?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <link rel="stylesheet" href="">
</head>
<body>
    <p>登録完了しました。</p>
    <p><a href="input.php">TOPに戻る</a></p>

</body>
</html>    

試したこと

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

MAMPを使用しています

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2017/04/18 16:57

    修正箇所を直した結果、無事直すことができました。ありがとうございます!

    キャンセル

  • m6u

    2017/04/18 17:00

    質問当初のかたちを質問文に残して、修正後も併記すれば、あとから似たようなトラブルに遭遇した人の助けになります。修正後のみでは、なぜ私がああいう回答をしたのか経緯がわからなくなってしまいます。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/04/18 17:08

    修正前のコードを書き足しました

    キャンセル

回答 1

checkベストアンサー

0

つきなみですが・・・

PHP: PDO::commit - Manual
commit()してない。
PHP: PDO::beginTransaction - Manual
beginTransaction()していなければ、オートコミットが働いてDBに反映されるはずかもしれませんが、一応動作モードを確認しておいたほうが良いかも。

$_POSTを参照してデータ抽出する箇所が、何かおかしい。
こうなんじゃない?

$maker_id = htmlspecialchars($_POST["maker_id"]);
$item_name = htmlspecialchars($_POST["item_name"]);
$price = htmlspecialchars($_POST["price"]);
$keyword = htmlspecialchars($_POST["keyword"]); 

さらに、
PHP: PDOStatement::bindValue - Manual
PHP: PDOStatement::bindParam - Manual
bindValue()するところで、上記リファレンスページの例1の事例に習うと

$stmt->bindValue(':maker_id', $maker_id);
$stmt->bindValue(':item_name', $item_name);
$stmt->bindValue(':price', $price);
$stmt->bindValue(':keyword', $keyword);


となりそうです。
bindParam()はSELECT文の実行結果を受け取るための変数のバインドであって、
今回のコードはbindValue()が適切です。
bindParam()と間違えて書いた箇所がNULLとして扱われ、
テーブルのNULL禁止に引っかかって反映されない、みたいな話なのかなと。

また、データ格納先テーブルの構造がわからないのであてずっぽうですが、
省略してはいけないカラムがあるのにNULLもしくは空文字列でINSERTしようとしているとか。
テーブルの構造も示してくれれば原因究明につながりやすいかも。

ところで、$maker_idがテーブルでの主キーになりそうな気がしますが、
それもフォーム上で入力させるんですか?
番号がかぶったりしても平気なのでしょうか。

【追記】
ちゃんとINSERT INTO文が動くかの確認として、
$stmt->execute();の直前にでも、

var_dump($maker_id);
var_dump($item_name);
var_dump($price);
var_dump($keyword);


を入れてみたり、また、$pdo = new PDO(~の直後にでも
SELECT文のクエリーを実行して値の取得ができるかを確認するとか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/18 16:27

    $maker_idですが、フォームで入力します
    データベースの接続は
    print"データベースに接続しました";
    と書いて確認しています

    キャンセル

  • 2017/04/18 16:39

    たぶん、bindParam()をbindValue()にすればいいんじゃないかな。

    キャンセル

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

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

関連した質問

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

  • PHP

    20398questions

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

  • MySQL

    5871questions

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