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

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

ただいまの
回答率

90.62%

  • PHP

    19756questions

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

  • MySQL

    5678questions

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

  • phpMyAdmin

    625questions

    phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

データベースに値が登録できない

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 630

beginner_39

score 67

知恵をお貸しください。

下記フォームを作成しました。(aaa.php)

<form method="post" action="bbb.php">
<p>商品名<br><input type="text" size="15" name="product_name"></p>
<p>商品画像<br><input type="text" size="30" name="product_pic"></p>
<p>商品説明<br><textarea name="product_text" rows="4" cols="40"></textarea></p>
<p><input type="submit" value="送信"></p>
</form>

フォーム入力後、bbb.phpへpostされます。

<body>
<?php
$name = $_POST['product_name'];
$product_pic = $_POST['product_pic'];
$text = $_POST['product_text'];

if($name == '' || $product_pic == '' || $text == ''){
    print '<form method="post" action="aaa.php">';
    print '<p>入力されていないところがあります。</p>';
    print '<input type="button" value="戻る" onClick="history.back()">';
}else{
    print '<form method="post" action="ccc_thanks.php">';
    print '<p>'.$name.'</p>';
    print '<p>'.$product_pic.'</p>';
    print '<p>'.$text.'</p>';
    print '<input type="submit" value="内容を送信する">';
    print '<input type="button" value="修正する" onClick="history.back()">';
    print '</form>';
}
?>

内容が問題なければ、ccc_thanks.phpへ遷移してdbへデータを登録

<?php
//データベースへ接続
$dsn = 'mysql:dbname=hogedb;host=localhost';
$user = 'xxxxx';
$password = 'xxxxx';
$dbh = new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');


?>

〜〜〜〜
〜〜〜〜

<body>  
<?php
$name = $_POST['product_name'];
$product_pic = $_POST['product_pic'];
$text = $_POST['product_text'];


$sql = 'INSERT INTO hogelist(product_name,product_pic,product_text) VALUES ("'.$name.'","'.$product_pic.'","'.$text.'")';
$stmt = $dbh->prepare($sql);
$stmt->execute();

//データベース切断
$dbh = null;

print '登録しました。';
?>
</body>

3つのファイルを使用してフォーム入力、確認、dbへ登録の流れを作っています。
bbb.phpへはフォーム値はpostされるのですが、
ccc_thanks.phpへ移動された後、フォームの値が無くなっており、
データベース自体は空の値を登録している形になっております。
なぜ値が空になってしまっているのか不明です。

上記記述で間違っているところはありますでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+4

bbb.phpからccc_thanks.phpへ渡すためのformにproduct_nameproduct_picproduct_textも含まれていないからです。

「aaaからデータを引き継ぐ」という意識をとりあえずなくした上で、bbb.phpのフォームを見てください。

    print '<form method="post" action="ccc_thanks.php">';
    print '<p>'.$name.'</p>';
    print '<p>'.$product_pic.'</p>';
    print '<p>'.$text.'</p>';
    print '<input type="submit" value="内容を送信する">';
    print '<input type="button" value="修正する" onClick="history.back()">';
    print '</form>';


このフォームの中にproduct_nameproduct_picproduct_textもありませんね?あるのはpタグに囲まれた「文字」だけです。formのactionへ飛ばされる情報はあくまで「formの中にあるinputタグやselectタグなどの情報」だけですので、例え前の画面から値を受け取っていても、pタグに情報を書き込んでも、次のフォームへは引き継がれません。

ではこういうときどうするか?それは<input type="hidden">を使います。

    print '<form method="post" action="ccc_thanks.php">';
    print '<input type="hidden" name="product_name" value="' . $name . '">';
    print '<input type="hidden" name="product_pic" value="' . $product_pic . '">';
    print '<input type="hidden" name="product_text" value="' . $text . '">';
    print '<p>'.$name.'</p>';
    print '<p>'.$product_pic.'</p>';
    print '<p>'.$text.'</p>';
    print '<input type="submit" value="内容を送信する">';
    print '<input type="button" value="修正する" onClick="history.back()">';
    print '</form>';

 蛇足

商品画像(product_pic)なのにテキストを渡していますが、これは大丈夫なんですか?もし今後画像に変えるつもりでしたら、こういった「間に確認画面を挟むフォーム」で画像を扱うのは一手間増えるので、ここで説明した事以外にも知識が必要になりますのでお気をつけください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/12 16:17 編集

    ご回答していただき、ありがとうございます。
    とてもわかりやすい説明で理解がしやすかったです!

    先ほど教えていただいた方法で試してみたところ、無事にデータベースに登録することができました!
    一歩前進した気持ちです!誠にありがとうございます!

    蛇足について
    >>商品画像(product_pic)なのにテキストを渡していますが、これは大丈夫なんですか?
    一応、データベースには画像のURLのみを登録しようと思っていたため、
    テキスト扱いにしております。
    この方法はあまり良くないでしょうか?

    ※ちなみにテキストエリアがhiddenでも受け渡しができませんでした。
    何か別の方法があるのでしょうか?

    キャンセル

  • 2017/10/16 18:25

    画像のURLというのがどこにおいてある画像かによります。あなたと無関係のサイトの画像のURLを勝手に使うと、練習ならまだいいのですが実務だと怒られる可能性があります。

    input type="hidden"は「ユーザに見せないけど、こっちで勝手に値を入れておく」ためのタイプで、textarea type="hidden"というやり方は存在しません。type="hidden"が設定できるのはinputタグだけです。

    キャンセル

  • 2017/10/17 10:05

    ご返信、ありがとうございます。

    ≫画像のURLというのがどこにおいてある画像かによります。
    ≫あなたと無関係のサイトの画像のURLを勝手に使うと、練習ならまだいいのですが実務だと怒られる可能性があります。

    →実際には自社のサイトサーバーにアップしている画像URLのパスを記載する予定です。
    それだと問題はないでしょうか?



    hiddenの件について、ありがとうございます。

    キャンセル

  • 2017/10/17 10:10

    > 練習ならまだいいのですが実務だと怒られる可能性があります。
    そもそも実務に耐えうるスクリプトでは無いと思いますが。。。

    キャンセル

  • 2017/10/17 10:24

    beginner_39さん
    > →実際には自社のサイトサーバーにアップしている画像URLのパスを記載する予定です。
    > それだと問題はないでしょうか?
    問題はないかと思います。

    te2jiさん
    > そもそも実務に耐えうるスクリプトでは無いと思いますが。。。
    社内で使うツール程度であればクオリティは問題ないのではないでしょうか。

    キャンセル

  • 2017/10/17 10:29

    te2jiさん
    ご返信、ありがとうございます。

    ≫耐えうるスクリプトでは無いと思いますが。。。
    →実際には使えないということでしょうか?
    それとも、実務で使うとセキュリティー面で危ないということでしょうか?



    masaya_ohashiさん
    ありがとうございます。
    自分の考え的には社内用として考えております。
    データを登録してユーザーが検索・表示・ご予約の流れを考えております。
    それだと社内用とは言わず実務的になるということでしょうか?

    キャンセル

  • 2017/10/17 10:38

    ユーザというのが「お客様」なのか「社員」なのかによります。社員向けであっても「もしそのシステムが壊れたら業務に支障をきたす」のであれば、社員向けであっても実務と言えるでしょう。例えば「社員が棚からものを探すのを補助する」程度であれば、最悪壊れていたり間違っていてもそこまで損害は出ませんが、「発注」等であれば、なにかバグや障害があったりすると損害がでますよね?実務に耐えうるかどうかというのはそういう点です。

    キャンセル

  • 2017/10/17 10:44

    追記ですが、まず素のPHPで書いたスクリプトと言う時点で、あらゆる点において「実務に耐えない」ものだと思ってください。「拡張性の乏しさ」「安定性の乏しさ」「アルゴリズム的なバグの潜在」「セキュリティの問題」「負荷への対策」「ログの出力不足」「人的ミスへのセーフティの欠如」、挙げればキリがないほどです。そして、「定められたルールに従って作ればこれらのことをある程度担保してくれる」のがフレームワークと呼ばれるものです。フレームワークを使わずに素のPHPで書くというのは練習にはいいですが、実務には向いていないということを知っておいてください。

    キャンセル

  • 2017/10/17 10:58

    社内なら、なんでもありって言えばありですが。。。
    masaya_ohashi さんは認識されていると思いますが、beginner_39 さん向けに横からコメント失礼しますね。

    とりあえず、致命的なのは
    ・HTML 出力時にエスケープ処理されていない
    ・INSERT 時の prepare の使い方が間違っている
    実務対応するときには、入力値チェックを入れると思いますが、
    ・POST 内容が空だった場合の対応がない
    あたりが、気になりました。

    個人的には、DB の処理は素の php で一度学習したほうが良いと思っています。

    実務では、フレームワークを導入すべきでしょうね。

    キャンセル

  • 2017/10/17 11:26

    masaya_ohashiさん
    te2jiさん

    貴重なアドバイス・ご指摘誠に感謝申し上げます。
    まずは動作ができればと考えておりましたが、
    お二人のお言葉をいただいたことで、開発段階からも意識するように
    「気をつけなければ。。。」と感じました。
    ありがとうございます。

    初歩的な質問かと思いますが、下記の事だけ教えてください。
    ・素のphpとはどうゆう事なのか?
     →自分が今触っているphpのことを言っているのか?
    ・フレームワークとはどうゆう事なのか?
     →元々作られているphpコード(またはsql文)のことなのか?

    どうぞよろしくお願いいたします。

    キャンセル

  • 2017/10/17 12:02

    素のPHPという認識は正しいです。フレームワークについては「フレームワーク」という単語での検索、「Laravel」や「CakePHP」や「CodeIgnitor」といったPHPの代表的なフレームワークを実際に見てみるなどして勉強してみてください。いきなりフレームワークに手を付けるのは難しいので、素のPHPを勉強した上で、次のステップはMVCについての勉強、その後フレームワークといった流れがよいでしょう。わからない単語は調べてみてください。

    キャンセル

  • 2017/10/17 12:18

    masaya_ohashiさん
    勉強になります。
    貴重なお時間を割いていただきありがとうございます。

    キャンセル

+2

bbbで一度パラメータをsession落とし込まないとcccに引き継げません

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/12 14:24

    ご回答ありがとうございます。

    >>session落とし込まないと...
    というのはform、phpとはまた別のやり方になるのでしょうか?

    キャンセル

  • 2017/10/12 14:31

    入力ページ-> postで渡す→確認ページ
    ですが
    確認→セッションで渡す→登録ページ
    となります。

    そうしないと、確認ページでフォームの再入力を許せば
    確認ページの意味がなくなりますので

    キャンセル

  • 2017/10/12 16:27

    再入力をさせないためにセッションを使って、登録ページへ移動させる、
    という認識でいいのでしょうか?

    キャンセル

  • 2017/10/12 16:30

    そうです。逆に確認ページを省略してダイレクトに登録することも可能です。
    その場合きちんとしたバリデート処理をしたうえで登録処理でのエラーがあれば
    登録せずにユーザーに処理ができなかった旨をフィードバックしなくてはナリません

    キャンセル

  • 2017/10/12 16:35

    勉強になります。
    まだ曖昧にしか理解できていませんが、yambe.jp様のアドバイス、
    頭に入れながら進めさせていただきます。
    ありがとうございます。

    キャンセル

0

$_SESSION という変数に代入するには session_start(); と実行させる必要があります。

function getPostData($name)
{
    if (isset($_POST[$name] && is_string($_POST[$name])) {
       return $_POST[$name];
    }
   return null;
}


というような関数を作っておけば

$name = getPostData('product_name');
$product_pic = getPostData('product_pic');
$text = getPostData('product_text');


のようにフォームから入力されたデータを受け取ることができます。

また$_POSTはPHPに直接アクセスした場合は undefined index というエラーが発生してしまいます。

getPostData関数のような同等の処理をfilter_input関数を使ってフォームからの入力データを受け取ることができます。

$name = (string)filter_input(INPUT_POST,'product_name');
$product_pic = (string)filter_input(INPUT_POST,'product_pic');
$text = (string)filter_input(INPUT_POST,'product_text');

getPostData関数内で使っているif文は「$_POST[$name]という変数にセットされていてかつ文字列である場合はその値を返し、何もセットされていない場合はnullを返す」という意味を持っています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/16 18:24

    ご回答ありがとうございます。

    キャンセル

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

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

関連した質問

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

  • PHP

    19756questions

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

  • MySQL

    5678questions

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

  • phpMyAdmin

    625questions

    phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。