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

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

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

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

Q&A

2回答

10509閲覧

データベースの一覧画面と詳細画面について[PHP]

star24star

総合スコア115

PHP

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

0グッド

2クリップ

投稿2015/05/06 14:41

現在データベースを利用したお問い合わせフォームを作成中なのですが、分からない点が2つあり質問させて頂きました。

■流れ
・お問い合わせフォームから入力されたデータをDBへ格納
・DBに格納されたデータを一覧表示させる。表示しているのは番号・名前・日付
・一覧画面の番号をクリックすると詳細画面へ飛ぶ
・詳細画面で表示しているものはお問い合わせフォームの項目・番号・日付・selectタグ
・selectタグのプルダウンから完了か未完了を選択し、「更新」ボタンを押すとDBへ変更が格納される
(1=完了、null or 0=未完了)
・画面にプルダウンで選んだ完了または未完了が表示される

■質問1.GETとPOSTを同時に取得する方法
一覧画面から番号クリックで詳細画面へ飛ぶ際にGETを使用
詳細画面でselectタグを選択したあと更新ボタンを押してページの更新をする際にはPOSTを使用
⇒更新ボタンを押すとそれまで表示していたデータが消えてしまう
GETとPOSTを同時に取得するにはREQUESTを使うと出てきたが、どのように変更すればいいのか?
また、更新ボタンを押すとデータが消えてしまうのはGETで送ったものが受け継がれていないからということだが、
$no = $_GET['no'];はどこに書くのか?(REQUESTにかえるのか?)

■質問2.updateを使用して更新情報をDBに格納する方法
DBに格納するにはinsertを使うとあったのですが、格納から表示の実行するまでの流れが不明

現在出来ているソースコード

詳細画面.php

lang

1<?php 2require_once( "DBクラス.php" ); //クラスファイルへリンク 3//一覧画面から詳細画面へデータを受け継いでいる。番号 4$no = $_GET['no']; 5// データベースクラス 6$SQL = new DB( ); 7//DBの選択 8$Query = "select * from テーブル名 where no={$no}"; 9//SQL 10$Column = $SQL->QueryEx($Query); 11//アップデート(完了か未完了かを選択し更新ボタンを押すとDBへ格納・実行・画面へ表示) 12$QueryA = "update * from テーブル名 where pull = null "; 13$QueryA = "INSERT INTO テーブル名(pull)"; 14//データベースの切断 15$SQL->Close( ); 16?> 17 18<html><body><table> 19 <tr> 20 <td>No</td> 21 <td><?php print($Column['no']); ?></td> 22 </tr> 23 <tr> 24 <td>名前</td> 25 <td><?php print($Column['name']); ?></td> 26 </tr> 27 <tr> 28 <td>連絡先メールアドレス</td> 29 <td><?php print($Column['c_mail']); ?></td> 30 </tr> 31 <tr> 32 <td>お問い合わせ内容</td> 33 </tr> 34 <tr> 35 <td>日付</td> 36 <td><?php print($Column['date']); ?></td> 37 </tr> 38 <tr> 39 <td>ステータス</td> 40 <td><?php print($Column['pull']); ?></td> 41 </tr> 42</table> 43<form action="詳細画面.php" method="POST"> //更新した後同じページを表示 44 <select name="status"> 45 <option value="1" <?php if($Column['pull']==1){echo "selected";} ?>>完了</option> 46 <option value="0" <?php if($Column['pull']==0){echo "selected";} ?>>未完了</option> 47 </select> 48<input type="submit" name="update" value="更新する"><br> 49</form> 50<?php 51if ($QueryA){ 52 print('データの更新に成功しました<br>'); 53 }else{ 54 print('データの更新に失敗しました<br>'); 55} 56?> 57 58</body></html>

DBクラス.php

lang

1<?php 2//データベースクラス 3class DB { 4 var $Connect; 5 var $Result; 6 var $Debug; 7// コンストラクタ 8 function DB( $Server='サーバ', $DbName='テーブル', $User='ユーザ', $Password='パスワード' ) { 9 $this->Connect = mysql_connect( $Server, $User, $Password ); 10 mysql_select_db( $DbName, $this->Connect ); 11 $this->Debug = FALSE; 12 } 13// 接続解除 14 function Close( ) { 15 mysql_close( $this->Connect ); 16 } 17//クエリー 18 function Query( $SqlQuery ) { 19 $ret = mysql_query( $SqlQuery,$this->Connect ); 20 if ( $this->Debug ) { 21 if ( mysql_errno() != 0 ) { 22 print "<B>" . mysql_error() . "</B><BR>"; 23 }} 24 return $ret; } 25// フェッチ 26 function Fetch( $Result ) { 27 return mysql_fetch_array( $Result ); 28 } 29// クエリーとフェッチ 30 function QueryEx( $SqlQuery='' ) { 31 if ( $SqlQuery != '' ) { 32 $this->Result = $this->Query( $SqlQuery ); 33 if ( !$this->Result ) { 34 return FALSE; 35 } 36 return $this->Fetch ( $this->Result ); 37 } 38 else { 39 return $this->Fetch ( $this->Result ); 40}}} 41?>

インデントが揃っていない、説明が下手でごめんなさい!
よろしくお願い致します

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

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

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

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

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

guest

回答2

0

画面詳細.phpを変更するような形で回答します。

lang

1<?php 2require_once( "DBクラス.php" ); //クラスファイルへリンク 3//一覧画面から詳細画面へデータを受け継いでいる。番号 4//ここを$_GETから$_REQUESTに変更 5$no = $_REQUEST['no']; 6//statusを取得 7$status = filter_input(INPUT_POST, "status"); 8 9// データベースクラス 10$SQL = new DB( ); 11 12//ここから更新ボタンが押された場合の処理 13$update = filter_input(INPUT_POST, "update"); //更新があったかと表す変数 更新がない場合にはnullが入る 14if($update){ //更新がある場合 15 //トランザクションを開始 16 $QueryUpdate = 'set autocommit = 0'; 17 $SQL->Query($QueryUpdate); 18 $QueryUpdate = 'begin'; 19 $SQL->Query($QueryUpdate); 20 //テーブルを更新 21 $QueryUpdate = 'update テーブル名 set pull = ' . $status . ' where no = '. $no; 22 $rst = $SQL->Query($QueryUpdate); 23 if(!$rst){ 24 //更新に失敗した場合には、ロールバック 25 $QueryUpdate = 'rollback'; 26 $SQL->Query($QueryUpdate); 27 } else { 28 //更新に成功した場合にはコミット 29 $QueryUpdate = 'commit'; 30 $SQL->Query($QueryUpdate); 31 } 32} 33 34//DBの選択 35$Query = "select * from テーブル名 where no={$no}"; 36//SQL 37$Column = $SQL->QueryEx($Query); 38//アップデート(完了か未完了かを選択し更新ボタンを押すとDBへ格納・実行・画面へ表示) 39//以下は不必要 40//$QueryA = "update * from テーブル名 where pull = null "; 41//$QueryA = "INSERT INTO テーブル名(pull)"; 42 43//データベースの切断 44$SQL->Close( ); 45?> 46 47<html><body><table> 48 <tr> 49 <td>No</td> 50 <td><?php print($Column['no']); ?></td> 51 </tr> 52 <tr> 53 <td>名前</td> 54 <td><?php print($Column['name']); ?></td> 55 </tr> 56 <tr> 57 <td>連絡先メールアドレス</td> 58 <td><?php print($Column['c_mail']); ?></td> 59 </tr> 60 <tr> 61 <td>お問い合わせ内容</td> 62 </tr> 63 <tr> 64 <td>日付</td> 65 <td><?php print($Column['date']); ?></td> 66 </tr> 67 <tr> 68 <td>ステータス</td> 69 <td><?php print($Column['pull']); ?></td> 70 </tr> 71</table> 72<form action="詳細画面.php?no=<?php print($no); ?>" method="POST"> //更新した後同じページを表示 73 <select name="status"> 74 <option value="1" <?php if($Column['pull']==1){echo "selected";} ?>>完了</option> 75 <option value="0" <?php if($Column['pull']==0){echo "selected";} ?>>未完了</option> 76 </select> 77<input type="submit" name="update" value="更新する"><br> 78</form> 79<?php 80if($update){ 81 if ($rst){ 82 print('データの更新に成功しました<br>'); 83 }else{ 84 print('データの更新に失敗しました<br>'); 85 } 86} 87?> 88 89</body></html>

ある程度の解説をします。
まず質問に対する回答の説明をします。

質問1に対して
formでGETとPOSTを同時に送信する場合には、Tak1waさんの仰っている通り

lang

1<form action="詳細画面.php?no=<?php print($no); ?>" method="POST"> //更新した後同じページを表示 2 <select name="status"> 3 <option value="1" <?php if($Column['pull']==1){echo "selected";} ?>>完了</option> 4 <option value="0" <?php if($Column['pull']==0){echo "selected";} ?>>未完了</option> 5 </select> 6<input type="submit" name="update" value="更新する"><br> 7</form>

とやれば大丈夫です。そして、noを受け取る箇所で

lang

1$no = $_REQUEST['no'];

とします。こうすることで、noはGETでもPOSTでも受け取ることができます。
ちなみに、$_REQUESTはデフォルトでは$_GETにあるものが優先されます。

質問2に対して
今回の場合は、フォームの送信ボタンを押すと、$_POST['update']が送信されてくるはずです。
ですので、$_POST['update']が入っているかどうかで更新があったかを判断します。

lang

1$update = filter_input(INPUT_POST, "update");

上記のコードで$_POST['update']がある場合には、正常に受け取ることができ、ない場合はnullが入ります。したがって、

lang

1if($udpate){ 2}

で更新があったどうかを判断できます。その後、データベースの更新処理を行います。

lang

1 //トランザクションを開始 2 $QueryUpdate = 'set autocommit = 0'; 3 $SQL->Query($QueryUpdate); 4 $QueryUpdate = 'begin'; 5 $SQL->Query($QueryUpdate); 6 //テーブルを更新 7 $QueryUpdate = 'update テーブル名 set pull = ' . $status . ' where no = '. $no; 8 $rst = $SQL->Query($QueryUpdate); 9 if(!$rst){ 10 //更新に失敗した場合には、ロールバック 11 $QueryUpdate = 'rollback'; 12 $SQL->Query($QueryUpdate); 13 } else { 14 //更新に成功した場合にはコミット 15 $QueryUpdate = 'commit'; 16 $SQL->Query($QueryUpdate); 17 }

上記の処理がデータベース更新処理になります。
ここでは、トランザクション処理を行います。トランザクション処理は更新処理によってデータの整合性を失うことを避けるために行っています。

以上になります。何か分からなければコメントをください。解説できる箇所は解説します。

投稿2015/05/07 07:13

orange0190

総合スコア1698

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

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

0

こんにちは。

PHPを全く知らない私が回答するのも恐縮ですが、
少し調べてみたので、他の方からの叩き台がてら投稿しますね。

■質問1

lang

1<form action="詳細画面.php?no=hoge" method="POST">

のように、GETパラメータを
設定してやればサーバ側でGETで取得できそうですがダメなのでしょうか。
http://slumbers99.blogspot.jp/2011/05/action-get-url-methodget.html

■質問2
詳細画面に表示されているレコードは既にお問い合わせ画面で登録済のレコードだと思いますので、
完了または未完了をUPDATEすれば良さそうですね。
DBクラス.phpにはQuery関数が用意されているのでUPDATE文を流せば良いのでは無いでしょうか。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/php_s03.htm

登録後の流れは、以下のようにリクエストメソッドから判断してはどうでしょうか。
http://www.phpbook.jp/appli/keijiban/index3.html
※ひょっとするとセキュリティ的に微妙かな?

lang

1<?php 2 //POSTの時だけUPDATE 3 //POSTでもGETでもGETパラメータを使ってSELECT 4?> 5<html><body> 6</body></html>

投稿2015/05/06 16:41

Tak1wa

総合スコア4791

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問