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

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

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

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

Q&A

解決済

1回答

1841閲覧

私のコードをチェックしていただけませんか。回答(session_startの位置、filter_input)

Junya42

総合スコア5

PHP

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

0グッド

1クリップ

投稿2019/08/20 01:42

編集2019/08/20 02:52

#至らない点を教えていただきたいです。
分量が多くなってしまうので、ご迷惑をおかけします。
もし可能であれば、コードをみて、ここ変じゃない?こうしたら?
というようなアドバイスを頂けたらと思います。

飲食店の注文システムを作りました。

↓3つがお客様が使用する画面側
2つがお店の人が管理する側です。

index.php

php

1<?php 2 3class DB 4{ 5 6 function dbconnect() 7 { 8 try { 9 return new PDO ('省略'); 10 //SQLinjection対策、けど最近はディフォルトらしい⇒ array(PDO::ATTR_EMULATE_PREPARES => false) 11 12 } catch (\Exception $e) { 13     exit('データベース接続失敗。'.$e->getMessage()); 14 } 15 } 16} 17 18$dbcon = new DB; 19 20try { 21 $pdo = $dbcon->dbconnect(); 22 $stmt = $pdo->prepare('select * from menus'); 23 $stmt->execute(); 24 $menus=$stmt->fetchall(); 25} catch (\Exception $e) { 26 exit(''.$e->getMessage()); 27} 28 29require 'tindex.php'; 30 31 ?> 32

tindex.php

php

1<!DOCTYPE html> 2<html lang="ja" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width"> 6 <link rel="stylesheet" href="style.css"> 7 <title>神田まつややぶそば</title> 8 9 </head> 10 <body> 11 <article class=""> 12 <header> 13 <h1>ご注文</h1> 14 <h3> 15 いらっしゃいませ。お越しいただきありがとうございます。 <br> 16 下記のメニューより注文をお決めくださいませ。 17 </h3> 18 </header> 19 <div class=""> 20 21 </div> 22      <form class="" action="thanks.php" method="post"> 23     <?php foreach ($menus as $menu) : ?> 24 25 <section class="contents"> 26 <img src="images/<?php echo($menu['name']); ?>.jpg" alt="a"> 27 <div class="商品名"> 28 <?php echo($menu['name']); ?> 29 </div> 30 31 <div class="値段"> 32 <?php echo($menu["price"]."円"); ?> 33 </div> 34 <a class="個数">個数 35 <?php $n = $menu['name']; ?> 36 <select class="select" name=<?php echo $n; ?>> 37 <?php for ($i=0; $i <10 ; $i++): ?> 38 <option value="<?php echo $i ;?>"><?php echo $i; ?></option> 39 <?php endfor; ?> 40 </select> 41 </a> 42 </section> 43 <?php endforeach; ?> 44 <a class="人数">テーブル番号 45 <select class="select" name="table" id="table"> 46   <?php for ($i=0; $i <15 ; $i++): ?> 47      <option value="<?php echo $i ?>"><?php echo $i.?></option> 48      <?php endfor; ?> 49 </select> 50 </a> 51 <a class="人数">人数 52 <select class="select" name="hito" id="hito"> 53 <?php for ($i=0; $i <30 ; $i++): ?> 54 <option value="<?php echo $i ?>"><?php echo $i.?></option> 55 <?php endfor; ?> 56 </select> 57 </a> 58 <input type="submit" name="" value="注文" class="注文 button" id="submit_btn"> 59 </form> 60 </body> 61</html> 62

thanks.php

php

1 2<?php if ($_POST['table'] == 0 ) : ?> 3 4 <!DOCTYPE html> 5 <html lang="ja" dir="ltr"> 6 <head> 7 <meta charset="utf-8"> 8 <meta http-equiv=refresh content=5;URL='index.php'> 9 <title></title> 10 </head> 11 <body> 12 13 14 すみませんが、テーブル番号と人数の入力をお願い致します 15 16 17 </body> 18 </html> 19 20 <?php else : //これじゃないとだめらしい。 ?> 21 22 <!DOCTYPE html> 23 <html lang="ja" dir="ltr"> 24 <head> 25 <meta charset="utf-8"> 26 <meta http-equiv=refresh content=5;URL='index.php'> 27 <title></title> 28 </head> 29 <body> 30 御注文ありがとうございます。 31 <?php 32 33 $n = $_POST['table']; 34 35 ${"ordertable".$n} = $_POST ; 36 session_start(); 37 $_SESSION['ordertable'.$n] = ${"ordertable".$n}; 38 39 ?> 40 41 <?php endif; ?> 42 </body> 43 </html> 44

tyuubou2.php

php

1 2 3<html lang="ja" dir="ltr"> 4 <head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width"> 7 <link rel="stylesheet" href="style2.css"> 8 <title></title> 9 </head> 10 <body> 11 <article class=""> 12 <header> 13 <h1>オーダー</h1> 14 </header> 15 16 17 <?php session_start(); 18 19 foreach ($_SESSION as $ordertable => $orders) :?> 20 <?php foreach ($orders as $menu => $num): ?> 21 22 <?php if(!0==($num)){ 23 if ($menu !== 'table'&& $menu !=='hito') { ?> 24   <section class=""> 25 26 27 <div class="商品名"> 28 <?php echo $menu; ?> 29 </div> 30 31 <form class="" action="uriage.php" method="post"> 32 <a class="個数">個数 33 <select class="select" > 34 <option> <?php echo $num; ?></option> 35 </select> 36 </a> 37 <input type="hidden" name="num" value="<?php echo $num; ?>"> 38 <input type="hidden" name="menu" value="<?php echo $menu; ?>"> 39 <input type="hidden" name="table" value="<?php echo $orders[table] ?>"> 40 <input type="hidden" name="hito" value="<?php echo $orders[hito] ?>"> 41 <input type="submit" value="完了"> 42 </form> 43 44 45 <a class="">テーブル番号 46 <select class="select" > 47      <option><?php echo $orders[table] ?></option> 48 </select> 49 </a> 50 51 52 <a class="">人数 53 <select class="select" name="hito" >?> 54 <option><?php echo $orders[hito] ?></option> 55 </select> 56 </a> 57 58 59 </section> 60 <?php } }?> 61 <?php endforeach;?> 62 <?php endforeach;?> 63 64 <br> 65 <br><br> 66 67 </body> 68</html> 69

uriage.php

php

1<?php 2 3session_start(); 4 5//unset($_SESSION[ordertable]); 6//print_r($_SESSION); 7 8switch ($_POST[menu]) { 9 case 'もりそば': 10 $id = 0; 11 break; 12 case 'ざるそば': 13 $id = 1; 14 break; 15 case 'たぬきそば': 16 $id = 2; 17 break; 18 case 'きつねそば': 19 $id = 3; 20 break; 21 case 'かもせいろ': 22 $id = 4; 23 break; 24 case '天ぷらそば': 25 $id = 5; 26 break; 27} 28 29$ordertablen = "ordertable" .$_POST[table]; 30 31array_splice($_SESSION[$ordertablen],$id,1,0); 32 33foreach ($_SESSION[$ordertablen] as $menu => $value) { 34 if ($value == 0) { 35 $i += 1; 36 37 if ($i==6) { 38 unset($_SESSION[$ordertablen]); 39 } 40 } 41} 42 43$name = $_POST[menu]; 44switch ($name) { 45 case 'もりそば': 46 $price = 600; 47 break; 48 case 'ざるそば': 49 $price = 700; 50 break; 51 case 'たぬきそば': 52 $price = 750; 53 break; 54 case 'きつねそば': 55 $price = 800; 56 break; 57 case 'かもせいろ': 58 $price = 900; 59 break; 60 case '天ぷらそば': 61 $price = 1300; 62 break; 63} 64 65class DB 66{ 67 68 function dbconnect() 69 { 70 try { 71 return new PDO ('省略); 72 array(PDO::ATTR_EMULATE_PREPARES => false) 73 74 } catch (\Exception $e) { 75     exit('データベース接続失敗。'.$e->getMessage()); 76 } 77 } 78} 79$dbcon = new DB; 80if (ctype_digit($_POST[table])) { 81 82 try { 83 $pdo = $dbcon->dbconnect(); 84 $stmt = $pdo->prepare('insert into uriage (name,num,price)value(:name,:num,:price)'); 85 $stmt -> bindParam(':name',$name); 86 $stmt -> bindParam(':num',$_POST['num']); 87 $stmt -> bindParam(':price',$price); 88 $stmt->execute(); 89 90 echo "完了"; 91 header( "Location: tyuubou2.php直していなかったです。すいません" ) ; 92 93 } catch (\Exception $e) { 94 exit('ログイン失敗 データが該当しません。'.$e->getMessage()); 95 } 96 97}else { 98 try { 99 $pdo = $dbcon->dbconnect(); 100 $stmt = $pdo->prepare('insert into uriage (name,num,price,cname,demae)value(:name,:num,:price,:cname,1)'); 101 $stmt -> bindParam(':name',$name); 102 $stmt -> bindParam(':num',$_POST['num']); 103 $stmt -> bindParam(':price',$price); 104 $stmt -> bindParam(':cname',$_POST[table]); 105 $stmt->execute(); 106 107 echo "完了"; 108 header( "Location: tyuubou2.php" ) ; 109 110 } catch (\Exception $e) { 111 exit('ログイン失敗 データが該当しません。'.$e->getMessage()); 112 } 113} 114 115 116 ?> 117

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

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

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

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

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

azuapricot

2019/08/20 01:44

チェックと質問は全くの別物です。 ここは質問サイトです。 別のサイトでどうぞ。
m.ts10806

2019/08/20 01:45

多すぎて無理です(これだけのために時間をかけるのは負担が大きすぎるし「質問」になっていない) もっと問題を絞ってください。
gentaro

2019/08/20 01:45

仕事の依頼になっちゃってますね。 クラウドソーシングとかで依頼してみては。
m.ts10806

2019/08/20 01:46

本当にコードレビューしてもらいたいのでしたらMENTAとかでお金払ってきっちりやってもらってください。あくまでQAサイトです。 作業依頼、デバッグ依頼を受けるサイトではありません。
azuapricot

2019/08/20 01:46

もし冗長だなと思うならその一部分を切り出して質問するなり何なりして下さい。 ここが上手く行かないというならそこを切り出して発生しているエラーを書いて下さい。 動いてるけどとりあえず見てほしいならこのサイトには合ってません
退会済みユーザー

退会済みユーザー

2019/08/20 01:47

作業に対して対価を払いたくないという強い意志だけは伝わってきますね。
gentaro

2019/08/20 01:49

MENTAってサービス初めて知った。こんなのあるのか。すごいピッタリな気がする。
m.ts10806

2019/08/20 01:51 編集

gentaroさん 暗にペアプロ求める質問者(そもそも質問になってないけど)にはもってこいです。
m.ts10806

2019/08/20 02:00 編集

azuapricotさん 例え「省略」のようなところが埋まってても動かないコードですけどね。 タグに入ってないので気づきにくいですけど前の質問からするとLaravel利用なので(一部の記述からそこは伺える) 「Laravelの適切な組み方にそって1から作り直し」という回答ならできます。言ってしまえば「全部ダメ」なので。
azuapricot

2019/08/20 01:57

MENTAって初めて聞きましたけどめちゃめちゃ良さそう・・・・ わ~良いもの知れて嬉しい
m.ts10806

2019/08/20 01:59

MENTAって書いたものの、この内容だとMENTA使ったとしても相当言われるのは間違いないですね。コードレビューではなく「Laravelの基本を最初から教えますね」という展開になること間違いなし。 (ただ、コードから、PHPのレベルもお世辞にも並とは言えないので相当覚悟したほうが良さそうですね)
退会済みユーザー

退会済みユーザー

2019/08/20 02:10 編集

全く本題ではないですがMENTAは価格崩壊(1ヶ月数千円とか)が激しくまともな収入源にするには厳しいし割にも合わない印象です。 報酬が発生しているだけマシとは言えますが、そのあたり従来のクラウドソーシングサービスと同じ問題を抱えていますね。
azuapricot

2019/08/20 02:14

うーん確かにこれを収入源にするのはキビシイですね。お小遣い程度になるかどうかといったところでしょうか
asakuta

2019/08/20 02:44

MENTAってこのレベルの質問に対してもマンツーマンで教え続けるとか新手の拷問かな?来世のために得を積むのには良さそう。
m.ts10806

2019/08/20 02:47

回答がつき、解決済みとした後で修正しまくるのはよろしくないですね。 コメントなり回答をしてくれた人に失礼です。 (それに回答にはすぐに反応しておきながら、指摘事項丸々無視しっぱなしなのも悪い印象しか与えません) >私のコードをチェックしていただけませんか。 この文言は不要ということに気づきませんか? また「クラスやセッション、POST/GETの利用方法」だと広すぎます。 PHPマニュアル読んできましょうというところからになりますよ。 回答にも「相当低レベルの処理を入れていますので基礎ができていないように見受けられます」とある通りです。 私が最初の方に指摘として書いた「多すぎて無理です」に全て集約されていると思ってください。 質問するのは全然良いですが、問題をもっと絞るべきですし、「コード見てください」と質問する領域にはありません。 もっとポイントポイントの精度を高めていくべきでしょう。
Junya42

2019/08/20 02:51

たいはんがあおり交じりのコメントで不快だったので、無視していました。 修正したのは、指摘して頂いた通り間違っているところを直したのと、 私の質問で得た、回答がその分野についてだったので、こうしました。 タイトルはじゃあかえときますね
m.ts10806

2019/08/20 02:55

煽りではなくガイドラインにそった指摘がほとんどです。 https://teratail.com/help/question-tips https://teratail.com/help/avoid-asking 「不快だった」と仰いますが「ガイドラインに沿っていない質問が投稿される」方が見ている方としては不快です。 ちゃんとしたアドバイスを得たいのでしたらちゃんとガイドラインに則ってください。
yambejp

2019/08/20 03:01

それだけみんな真面目に読んでくれたんですよ 私みたいに表面だけサラッと読んでアラの部分だけ指摘する分には さほど質問者さんの冗長なコードも気になりません。 逆にだらだらと書かれたものからロジック的なエラーが発生するので なんとかして・・・的な質問だったら私は無視していたと思います
Junya42

2019/08/20 04:03

そううことなんですかね、 やんべさんのようにかいとうしていただけるのを期待していました。 そこは私の質問の仕方ですね。ガイドラインも特に読んでませんでしたし、 なので、上3つのコメントに対しては、 そうでしたかすいません。と思いましたが、件数が増えて、何度も同じこと言っていたり、関係のない話していたりで、めんどくさかったので、 ただやんべさんとmtsさんはありがとうございました。 言葉足らずなのを棚にあげると、mtsさんの言い方は、 初心者には伝わりませんでした。あとちょっととげがあります。
m.ts10806

2019/08/20 04:13

特に言い訳するわけではないですが、 エンジニアの特性と思ってください。 なるべく必要最小限のコメントで無駄なことを省くものです(怠慢ではないです)。 伝わらなかったのは申し訳なかったですが、そこは都度聞くなり意図を確認してもらえれば良い話で、 指摘を無視し続けることで印象が悪化していったのは言うまでもありません。 そもそも赤の他人で、誰も悪意も恨みも何も持ってないので。 ただ赤の他人故、どういう意図があっての質問なのか、質問内容に書かれていることしか伝わりません。 質問を解決する責任はあくまで質問者のみにあるので、他者に確実に「何をしようとして」「何が問題で」「自分はその問題に対してどう取り組んだのか」の3つを伝える努力はしないといけません。
Junya42

2019/08/20 04:14

はい。 気を付けます。
guest

回答1

0

ベストアンサー

index.phpの中にあるclass DBがdbconnect()でdbへの接続を宣言していおり
その後tindex.phpをrequireしてその中にもclass DBが存在しdbconnect()が
同等の接続を宣言しているのはあまりに非効率ですね
また、tindex.phpから自分自身をreuireするというのは意図がわかりかねます

またPDOの記述が省略されていますが、きちんと
PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
をしていないとtryが機能しないので注意してください

thanks.phpの中で$_POST['table']を直接参照したり
tyuubou2.phpの中で session_start()のタイミングが遅かったり
相当低レベルの処理を入れていますので基礎ができていないように見受けられます
クラスやセッション、POST/GETの利用方法や動作条件などをよく学習してください

投稿2019/08/20 02:02

yambejp

総合スコア114839

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

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

Junya42

2019/08/20 02:13

回答ありがとうございます。 POSTを直接参照しない方法というのは、 どうするのですか? sessionは頭につけるということですかね?
yambejp

2019/08/20 02:16

> POSTを直接参照しない方法 filter_inputで変数に受けるのが妥当です $table=filter_input(INPUT,POST,'table'); これをしないと処理によってはNoticeが表示される場合があります > sessionは頭につける セッションを利用する場合はあらゆる出力より前にsession_start()しないとエラーになります
Junya42

2019/08/20 02:28

そうなのですね。 ありがとうございます! filter_inputは知りませんでしたので、見てみます。
m.ts10806

2019/08/20 02:38 編集

>header( "Location: {{route('tyuubou')}}" ) ; この記述からすると前の質問の続きであるLaravelですよね(Laravelでも動かない記述だけど) としたら全ての前提が崩れますし、この回答も無駄(というか参考にしても実装に一切使えない。Laravelを使えるようにはならない)になりますのでご注意を。
Junya42

2019/08/20 02:41

すみません。直してなかったです。 laravelの質問ではないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問