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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

phpMyAdmin

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

PHP

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

Q&A

解決済

3回答

8068閲覧

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

beginner_39

総合スコア77

MySQL

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

phpMyAdmin

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

PHP

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

0グッド

1クリップ

投稿2017/10/12 03:21

知恵をお貸しください。

下記フォームを作成しました。(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へ移動された後、フォームの値が無くなっており、
データベース自体は空の値を登録している形になっております。
なぜ値が空になってしまっているのか不明です。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

php

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

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

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

php

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

蛇足

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

投稿2017/10/12 03:46

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner_39

2017/10/12 07:18 編集

ご回答していただき、ありがとうございます。 とてもわかりやすい説明で理解がしやすかったです! 先ほど教えていただいた方法で試してみたところ、無事にデータベースに登録することができました! 一歩前進した気持ちです!誠にありがとうございます! 蛇足について >>商品画像(product_pic)なのにテキストを渡していますが、これは大丈夫なんですか? 一応、データベースには画像のURLのみを登録しようと思っていたため、 テキスト扱いにしております。 この方法はあまり良くないでしょうか? ※ちなみにテキストエリアがhiddenでも受け渡しができませんでした。 何か別の方法があるのでしょうか?
masaya_ohashi

2017/10/16 09:25

画像のURLというのがどこにおいてある画像かによります。あなたと無関係のサイトの画像のURLを勝手に使うと、練習ならまだいいのですが実務だと怒られる可能性があります。 input type="hidden"は「ユーザに見せないけど、こっちで勝手に値を入れておく」ためのタイプで、textarea type="hidden"というやり方は存在しません。type="hidden"が設定できるのはinputタグだけです。
beginner_39

2017/10/17 01:05

ご返信、ありがとうございます。 ≫画像のURLというのがどこにおいてある画像かによります。 ≫あなたと無関係のサイトの画像のURLを勝手に使うと、練習ならまだいいのですが実務だと怒られる可能性があります。 →実際には自社のサイトサーバーにアップしている画像URLのパスを記載する予定です。 それだと問題はないでしょうか? hiddenの件について、ありがとうございます。
退会済みユーザー

退会済みユーザー

2017/10/17 01:10

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

2017/10/17 01:24

beginner_39さん > →実際には自社のサイトサーバーにアップしている画像URLのパスを記載する予定です。 > それだと問題はないでしょうか? 問題はないかと思います。 te2jiさん > そもそも実務に耐えうるスクリプトでは無いと思いますが。。。 社内で使うツール程度であればクオリティは問題ないのではないでしょうか。
beginner_39

2017/10/17 01:29

te2jiさん ご返信、ありがとうございます。 ≫耐えうるスクリプトでは無いと思いますが。。。 →実際には使えないということでしょうか? それとも、実務で使うとセキュリティー面で危ないということでしょうか? masaya_ohashiさん ありがとうございます。 自分の考え的には社内用として考えております。 データを登録してユーザーが検索・表示・ご予約の流れを考えております。 それだと社内用とは言わず実務的になるということでしょうか?
masaya_ohashi

2017/10/17 01:38

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

2017/10/17 01:44

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

退会済みユーザー

2017/10/17 01:58

社内なら、なんでもありって言えばありですが。。。 masaya_ohashi さんは認識されていると思いますが、beginner_39 さん向けに横からコメント失礼しますね。 とりあえず、致命的なのは ・HTML 出力時にエスケープ処理されていない ・INSERT 時の prepare の使い方が間違っている 実務対応するときには、入力値チェックを入れると思いますが、 ・POST 内容が空だった場合の対応がない あたりが、気になりました。 個人的には、DB の処理は素の php で一度学習したほうが良いと思っています。 実務では、フレームワークを導入すべきでしょうね。
beginner_39

2017/10/17 02:26

masaya_ohashiさん te2jiさん 貴重なアドバイス・ご指摘誠に感謝申し上げます。 まずは動作ができればと考えておりましたが、 お二人のお言葉をいただいたことで、開発段階からも意識するように 「気をつけなければ。。。」と感じました。 ありがとうございます。 初歩的な質問かと思いますが、下記の事だけ教えてください。 ・素のphpとはどうゆう事なのか?  →自分が今触っているphpのことを言っているのか? ・フレームワークとはどうゆう事なのか?  →元々作られているphpコード(またはsql文)のことなのか? どうぞよろしくお願いいたします。
masaya_ohashi

2017/10/17 03:02

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

2017/10/17 03:18

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

0

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

投稿2017/10/12 03:39

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner_39

2017/10/12 05:24

ご回答ありがとうございます。 >>session落とし込まないと... というのはform、phpとはまた別のやり方になるのでしょうか?
yambejp

2017/10/12 05:31

入力ページ-> postで渡す→確認ページ ですが 確認→セッションで渡す→登録ページ となります。 そうしないと、確認ページでフォームの再入力を許せば 確認ページの意味がなくなりますので
beginner_39

2017/10/12 07:27

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

2017/10/12 07:30

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

2017/10/12 07:35

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

0

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

php

1function getPostData($name) 2{ 3 if (isset($_POST[$name] && is_string($_POST[$name])) { 4 return $_POST[$name]; 5 } 6 return null; 7}

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

php

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

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

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

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

php

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

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

投稿2017/10/15 23:47

naohiro19_

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner_39

2017/10/16 09:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問