データベースの一覧画面と詳細画面について[PHP]
受付中
回答 2
投稿
- 評価
- クリップ 2
- VIEW 6,796
■流れ
・お問い合わせフォームから入力されたデータを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
<?php
require_once( "DBクラス.php" ); //クラスファイルへリンク
//一覧画面から詳細画面へデータを受け継いでいる。番号
$no = $_GET['no'];
// データベースクラス
$SQL = new DB( );
//DBの選択
$Query = "select * from テーブル名 where no={$no}";
//SQL
$Column = $SQL->QueryEx($Query);
//アップデート(完了か未完了かを選択し更新ボタンを押すとDBへ格納・実行・画面へ表示)
$QueryA = "update * from テーブル名 where pull = null ";
$QueryA = "INSERT INTO テーブル名(pull)";
//データベースの切断
$SQL->Close( );
?>
<html><body><table>
<tr>
<td>No</td>
<td><?php print($Column['no']); ?></td>
</tr>
<tr>
<td>名前</td>
<td><?php print($Column['name']); ?></td>
</tr>
<tr>
<td>連絡先メールアドレス</td>
<td><?php print($Column['c_mail']); ?></td>
</tr>
<tr>
<td>お問い合わせ内容</td>
</tr>
<tr>
<td>日付</td>
<td><?php print($Column['date']); ?></td>
</tr>
<tr>
<td>ステータス</td>
<td><?php print($Column['pull']); ?></td>
</tr>
</table>
<form action="詳細画面.php" method="POST"> //更新した後同じページを表示
<select name="status">
<option value="1" <?php if($Column['pull']==1){echo "selected";} ?>>完了</option>
<option value="0" <?php if($Column['pull']==0){echo "selected";} ?>>未完了</option>
</select>
<input type="submit" name="update" value="更新する"><br>
</form>
<?php
if ($QueryA){
print('データの更新に成功しました<br>');
}else{
print('データの更新に失敗しました<br>');
}
?>
</body></html>
DBクラス.php
<?php
//データベースクラス
class DB {
var $Connect;
var $Result;
var $Debug;
// コンストラクタ
function DB( $Server='サーバ', $DbName='テーブル', $User='ユーザ', $Password='パスワード' ) {
$this->Connect = mysql_connect( $Server, $User, $Password );
mysql_select_db( $DbName, $this->Connect );
$this->Debug = FALSE;
}
// 接続解除
function Close( ) {
mysql_close( $this->Connect );
}
//クエリー
function Query( $SqlQuery ) {
$ret = mysql_query( $SqlQuery,$this->Connect );
if ( $this->Debug ) {
if ( mysql_errno() != 0 ) {
print "<B>" . mysql_error() . "</B><BR>";
}}
return $ret; }
// フェッチ
function Fetch( $Result ) {
return mysql_fetch_array( $Result );
}
// クエリーとフェッチ
function QueryEx( $SqlQuery='' ) {
if ( $SqlQuery != '' ) {
$this->Result = $this->Query( $SqlQuery );
if ( !$this->Result ) {
return FALSE;
}
return $this->Fetch ( $this->Result );
}
else {
return $this->Fetch ( $this->Result );
}}}
?>
インデントが揃っていない、説明が下手でごめんなさい!
よろしくお願い致します
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
PHPを全く知らない私が回答するのも恐縮ですが、
少し調べてみたので、他の方からの叩き台がてら投稿しますね。
■質問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
※ひょっとするとセキュリティ的に微妙かな?
<?php
//POSTの時だけUPDATE
//POSTでもGETでもGETパラメータを使ってSELECT
?>
<html><body>
</body></html>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
<?php
require_once( "DBクラス.php" ); //クラスファイルへリンク
//一覧画面から詳細画面へデータを受け継いでいる。番号
//ここを$_GETから$_REQUESTに変更
$no = $_REQUEST['no'];
//statusを取得
$status = filter_input(INPUT_POST, "status");
// データベースクラス
$SQL = new DB( );
//ここから更新ボタンが押された場合の処理
$update = filter_input(INPUT_POST, "update"); //更新があったかと表す変数 更新がない場合にはnullが入る
if($update){ //更新がある場合
//トランザクションを開始
$QueryUpdate = 'set autocommit = 0';
$SQL->Query($QueryUpdate);
$QueryUpdate = 'begin';
$SQL->Query($QueryUpdate);
//テーブルを更新
$QueryUpdate = 'update テーブル名 set pull = ' . $status . ' where no = '. $no;
$rst = $SQL->Query($QueryUpdate);
if(!$rst){
//更新に失敗した場合には、ロールバック
$QueryUpdate = 'rollback';
$SQL->Query($QueryUpdate);
} else {
//更新に成功した場合にはコミット
$QueryUpdate = 'commit';
$SQL->Query($QueryUpdate);
}
}
//DBの選択
$Query = "select * from テーブル名 where no={$no}";
//SQL
$Column = $SQL->QueryEx($Query);
//アップデート(完了か未完了かを選択し更新ボタンを押すとDBへ格納・実行・画面へ表示)
//以下は不必要
//$QueryA = "update * from テーブル名 where pull = null ";
//$QueryA = "INSERT INTO テーブル名(pull)";
//データベースの切断
$SQL->Close( );
?>
<html><body><table>
<tr>
<td>No</td>
<td><?php print($Column['no']); ?></td>
</tr>
<tr>
<td>名前</td>
<td><?php print($Column['name']); ?></td>
</tr>
<tr>
<td>連絡先メールアドレス</td>
<td><?php print($Column['c_mail']); ?></td>
</tr>
<tr>
<td>お問い合わせ内容</td>
</tr>
<tr>
<td>日付</td>
<td><?php print($Column['date']); ?></td>
</tr>
<tr>
<td>ステータス</td>
<td><?php print($Column['pull']); ?></td>
</tr>
</table>
<form action="詳細画面.php?no=<?php print($no); ?>" method="POST"> //更新した後同じページを表示
<select name="status">
<option value="1" <?php if($Column['pull']==1){echo "selected";} ?>>完了</option>
<option value="0" <?php if($Column['pull']==0){echo "selected";} ?>>未完了</option>
</select>
<input type="submit" name="update" value="更新する"><br>
</form>
<?php
if($update){
if ($rst){
print('データの更新に成功しました<br>');
}else{
print('データの更新に失敗しました<br>');
}
}
?>
</body></html>
ある程度の解説をします。
まず質問に対する回答の説明をします。
質問1に対して
formでGETとPOSTを同時に送信する場合には、Tak1waさんの仰っている通り
<form action="詳細画面.php?no=<?php print($no); ?>" method="POST"> //更新した後同じページを表示
<select name="status">
<option value="1" <?php if($Column['pull']==1){echo "selected";} ?>>完了</option>
<option value="0" <?php if($Column['pull']==0){echo "selected";} ?>>未完了</option>
</select>
<input type="submit" name="update" value="更新する"><br>
</form>
とやれば大丈夫です。そして、noを受け取る箇所で
$no = $_REQUEST['no'];
とします。こうすることで、noはGETでもPOSTでも受け取ることができます。
ちなみに、
$_REQUEST
はデフォルトでは$_GET
にあるものが優先されます。
質問2に対して
今回の場合は、フォームの送信ボタンを押すと、
$_POST['update']
が送信されてくるはずです。
ですので、
$_POST['update']
が入っているかどうかで更新があったかを判断します。
$update = filter_input(INPUT_POST, "update");
上記のコードで$_POST['update']
がある場合には、正常に受け取ることができ、ない場合はnullが入ります。したがって、
if($udpate){
}
で更新があったどうかを判断できます。その後、データベースの更新処理を行います。
//トランザクションを開始
$QueryUpdate = 'set autocommit = 0';
$SQL->Query($QueryUpdate);
$QueryUpdate = 'begin';
$SQL->Query($QueryUpdate);
//テーブルを更新
$QueryUpdate = 'update テーブル名 set pull = ' . $status . ' where no = '. $no;
$rst = $SQL->Query($QueryUpdate);
if(!$rst){
//更新に失敗した場合には、ロールバック
$QueryUpdate = 'rollback';
$SQL->Query($QueryUpdate);
} else {
//更新に成功した場合にはコミット
$QueryUpdate = 'commit';
$SQL->Query($QueryUpdate);
}
上記の処理がデータベース更新処理になります。
ここでは、トランザクション処理を行います。トランザクション処理は更新処理によってデータの整合性を失うことを避けるために行っています。
以上になります。何か分からなければコメントをください。解説できる箇所は解説します。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる