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

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

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

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

Q&A

解決済

4回答

5294閲覧

”@”はOK でhiddenはダメ?なぜ?

YukaSaku

総合スコア52

PHP

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

0グッド

2クリップ

投稿2017/05/25 17:56

編集2017/05/26 00:02

こちらのコード、 cust_id取得の部分がまだ解決していないので途中コードがおかしいですが、先生にhiddenの部分はなぜ存在するのか?hiddenというのはバグを作っているようなものだ。もしこれが無ければプログラムが動かないなら、他に問題があるはずだ。
と言われました。

php

1 2<?php 3/* Program name: register.php 4 * Description: Program displays the blank form and checks 5 * all the form fields for blank fields. 6 */ 7 8ini_set("display_errors","on"); 9error_reporting(E_ALL | E_STRICT); 10ini_set("include_path","./includes"); 11include("dbinfo.inc"); 12$gen="Gender"; 13$rows = 0; 14$last_id = 0; 15 16 17if(isset($_POST['submitted']) and $_POST['submitted'] == "yes") 18{ 19 if(!isset($_POST['gen'])) 20 { 21 $blank_data[] = $gen; 22 } 23 foreach($_POST as $field => $value) 24 { 25 if(empty($value)) 26 { 27 $blank_data[] = $field; 28 } 29 else 30 { 31 $good_data[$field] = strip_tags(trim($value)); 32 } 33 } 34 if(@sizeof($blank_data) > 0) 35 { 36 $message = "<p style='color: red; margin-bottom: 0; 37 font-weight: bold'> 38 You didn't fill in one or more required fields. 39 You must enter: 40 <ul style='color: red; margin-top: 0; 41 list-style: none' >"; 42 /* display list of missing information */ 43 foreach($blank_data as $value) 44 { 45 $message .= "<li>$value</li>"; 46 } 47 $message .= "</ul>"; 48 //extract($good_data); 49 echo $message; 50 include("form.inc"); 51 exit(); 52 } 53 foreach($_POST as $field => $value) 54 { 55 if(!empty($value)) 56 { 57 //validations 58 $name_patt = "/^[A-Za-z0-9' -]{1,15}$/"; 59 $email_patt = "/^.+@.+\\..+$/"; 60 $phone_patt = "/^[0-9)(xX -]{7,20}$/"; 61 $passwd_patt = "/^[A-Za-z0-9' -]{1,60}$/"; 62 63 $field = htmlspecialchars($field, ENT_QUOTES); 64 $value = htmlspecialchars($value, ENT_QUOTES); 65 66 if(preg_match("/username/i",$field)) 67 { 68 if(!preg_match($name_patt,$value)) 69 { 70 $error_array[] = "$value is not a valid Username"; 71 } 72 } 73 if(preg_match("/phone/i",$field)) 74 { 75 if(!preg_match($phone_patt,$value)) 76 { 77 $error_array[] = "$value is not a valid Phone"; 78 } 79 } 80 if(preg_match("/email/i",$field)) 81 { 82 if(!preg_match($email_patt,$value)) 83 { 84 $error_array[] = "$value is not a valid Email"; 85 } 86 } 87 88 if(preg_match("/password/i",$field)) 89 { 90 if(!preg_match($passwd_patt,$value)) 91 { 92 $error_array[] = "$value is not a valid password"; 93 } 94 } 95 echo "<div class='field'>"; 96 } 97 } 98 99 if(@sizeof($error_array) > 0) 100 { 101 $message = "<ul style='color: red; list-style: none' >"; 102 foreach($error_array as $value) 103 { 104 $message .= "<li>$value</li>"; 105 } 106 $message .= "</ul>"; 107 echo $message; 108 @extract($clean_data); 109 include("form.inc"); 110 exit(); 111 } 112 else 113 { 114 $cxn = mysqli_connect($host,$user,$passwd,$dbname) 115 or die("Couldn't connect to server"); 116 $clean_data = array(); 117 foreach($_POST as $field => $value) 118 { 119 $clean_data[$field] = mysqli_real_escape_string($cxn,$value); 120 } 121 $date = date("Y-m-d H:i:s"); 122 ?> 123 124 <form method="post"> 125 <input type="hidden" name='$field' value="<?php echo htmlspecialchars($good_data['value']); ?>"> 126 <input type="hidden" name="gen" value="<?php echo $gen; ?>"> 127 <input type="hidden" name="date" value="<?php echo $date; ?>"> 128 </form> 129 130 <?php 131 if (!empty($good_data['username']) ) { // Confirm the username on the DB that user input 132 //$sql = "SELECT username FROM login"; 133 $sql = "SELECT username FROM login WHERE username = " . $good_data['username']; 134 if ($result = $cxn->query($sql)) { 135 $username_result = $good_data['username']; 136 $rows =1; 137 } 138 if ($rows == 1) 139 { 140 echo "Username already exists"; 141 include("form.inc"); 142 exit; 143 } else { 144 145 146 /* 接続状況をチェックします */ 147 if (mysqli_connect_errno()) { 148 printf("Connect failed: %s\n", mysqli_connect_error()); 149 exit(); 150 } 151 mysqli_query($result, "CREATE TABLE login LIKE cust_ID"); 152 153 154 /* loop that displays the form */ 155 $sql = "INSERT INTO login (username,phone,email,password,gen,date) 156 VALUES ('".$clean_data['username']."', 157 '".$clean_data['phone']."', 158 '".$clean_data['email']."', 159 '".$clean_data['password']."', 160 '".$clean_data['gen']."', 161 '$date')"; 162 } 163 $result = mysqli_query($cxn,$sql) 164 or die("Couldn't execute query1"); 165 $sql = "SELECT LAST_INSERT_ID() AS id;"; 166 $newID = mysqli_query($cxn,$sql) or die("Couldn't execute query"); 167 168 print_r($newID); 169 170 171 printf ("New Record has id %d.\n", mysqli_insert_id($result)); 172 173 /* 接続を閉じます */ 174 mysqli_close($sql); 175 176 177/*$sql = "SELECT LAST_INSERT_ID() AS id;"; 178 $newID = mysqli_query($cxn,$sql) or die("Couldn't execute query"); 179 180 print_r($newID);*/ 181 182 $signUpMessage = 183 ' <br>Username is '.$clean_data['username'].' <br>'. 184 ' Phone is '.$clean_data['phone'].' <br>'. 185 ' Email is '.$clean_data['email'].' <br>'. 186 ' Gender is '.$clean_data['gen'].' <br>'. 187 ' The registration date is '.$date.' <br>'. 188 ' Keep your password for your security.'; 189 echo $signUpMessage; 190 include("stored.inc"); 191 } 192 } 193} 194else 195{ 196 include("form.inc"); 197} 198?> 199

このコードのhiddenの部分です。

php

1<form method="post"> 2 <input type="hidden" name='$field' value="<?php echo htmlspecialchars($good_data['value']); ?>"> 3 <input type="hidden" name="gen" value="<?php echo $gen; ?>"> 4 <input type="hidden" name="date" value="<?php echo $date; ?>"> 5 </form>

しかし、この先生、@については、かなり推奨していて、とてもusefulだと言います。

@は良くて、hiddenがダメな理由は何でしょうか。
また、実際にはこのhiddenの部分に一度データを入れないとインプットされたデータが表示されません。

もしこのhiddenがダメなら、何に変えればいいでしょうか。

追加

回答者さまから、質問の内容がわからないとのことなので、追加させていただこうと思います。
⚪️ @の方がよほどバグを隠すはずなのに、なぜ先生は@を積極的に使うのか、
⚪️ そしてhiddenのコードの箇所はなぜバグを生むと言っているのか、

この2点をお伺いしたいです。特に2番目です。

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

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

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

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

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

guest

回答4

0

ベストアンサー

hiddenも役に立つ場面は多いと思います。
例えばCSRF対策 → PHPでクロスサイトリクエストフォージェリ(CSRF)対策するときのメモ
hiddenはHTMLに出力されるため悪意があるユーザーによる改ざんは可能ですが、
その改ざんを逆手に取り「不正なアクセスである」と判断する方法ですね。

もう少し先生に正しい意図を確認した方がいいと思います。
(その先生が知識不足とか勘違いしている部分もないとは言えませんが・・・)

投稿2017/05/26 00:00

編集2017/05/26 00:41
m.ts10806

総合スコア80765

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

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

YukaSaku

2017/05/26 02:13

hiddenについての詳しい説明をありがとうございます。 いちゃもんつけるのが好きな先生なので、だからそう言ったのかというのが理解できたので、こちらをベストアンサーにさせていただきました。ありがとうございます。
guest

0

IPAの昔のドキュメントに「hiddenは危険」と銘打ったドキュメントが掲載されていました。今も参照できますが。

1-5. hiddenは危険(セッション変数を利用しよう)

他ならぬIPAのドキュメントなので「hiddenを使うと(無条件に)危ないのか」という誤解を生みましたが、それは間違いです。危険なのは、hiddenパラメータに権限とかログインユーザーの情報を保持するような使い方であって、通常の値の引き回しなどにhiddenを使うのはなんら問題ありません。
ただ、このドキュメントの影響を受けて「hiddenは危険なのだ」と思っている人は結構いますので、先生もそうなのかもしれません。

投稿2017/05/26 02:07

ockeghem

総合スコア11701

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

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

YukaSaku

2017/05/26 02:20

詳しい説明をありがとうございます。 さらに理解が深まりました。いちゃもんつけるのが好きな先生で、もうこのプログラムを2ヶ月もエクササイズとしてやってるので、これでなんとか対抗できそうです。
ockeghem

2017/05/26 02:31

ただ、なぜ日付時刻をhiddenで渡すのかというのは疑問に思いました。いつの日時を指定するのか仕様しだいだということと、クリティカルな応用だと、日時を改ざんされると困るという場合もあると思います。
YukaSaku

2017/05/26 02:36

そうなんですね。じゃ、やっぱりちょっとおかしいんですね。 データを一旦受け入れる箱が欲しかったのとそれを表示させたくなかったのでhiddenで対応しました。他の回答者の方が言うようにSESSIONでできるなら、SESSIONにしようと思います。ありがとうございます。
退会済みユーザー

退会済みユーザー

2017/05/26 02:49

このリンク先のドキュメントのせいで、結構悩みました。。。
YukaSaku

2017/05/26 02:59

IPAとは結構有名なところなんですね。皆さんが影響受けるなんて。
退会済みユーザー

退会済みユーザー

2017/05/26 03:19

IPA は国内の情報産業に関わる人なら知っていなければならない団体です。 IPA の発行するドキュメントは、実務の取っ掛かりとして適切な精度であるモノが多く、非常に大きな影響を与えます。教材としても優秀なドキュメントが多くあるので、学生にも有用だと思います。 いろいろ漁ってみるとイイです。 ちなみに、その優秀なドキュメントを断定的に否定できる人物に関しても、確認しておいたほうがイイです。
YukaSaku

2017/05/26 03:25

そうなんですね。勉強になります。情報産業に関わってるくせに疎いので、ちゃんと読み漁ります! ちなみに、IPAの海外版はご存知でしょうか?
guest

0

私も初心者なので、違う回答者さんのが適切かと思いますが。

@を使うこととhiddenを使うことは、ちょっと意味合い?は違うような気がするんですが、、、

@はエラーがあっても出さないって奴で、hid
denは見た目には見えないってやつで、それがエラーと関係するかってのは違うんじゃないですか?

hiddenを使うのか、SESSIONを使うのか?だったら意味合いとしてはわかります。

それに、どうしてもエラー制御しておかないといけない状況なら必要かもしれませんけど、スクリプト自体とまるようなエラーでも出さなくなって、原因わからずみたいになりかねないので、エラーが出たのを適切に対応して潰していくようにするのが良いのかな?って思います。

未定義のNOTICEエラーだって、表示させなければ動作はするでしょう。
でも、初期化などで、エラーが消えたほうがやっぱり良いですよ。

投稿2017/05/25 22:57

Z-TALBO

総合スコア525

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

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

YukaSaku

2017/05/25 23:58

両方の表示しないという共通点を見て、こういう質問になってしまいました。 エラーがあっても出さないという@は個人的にはあまり好きではないのです。 ⚪️ @の方がよほどバグを隠すはずなのに、なぜ先生は@を積極的に使うのか、 ⚪️ そしてhiddenのコードの箇所はなぜバグを生むと言っているのか、 この2点を聞きたかったのです。 hiddenと対照になるのはSESSIONなのですね。知らなかったです。 ありがとうございます。
Z-TALBO

2017/05/26 00:22

解決済みではありますが、 先生の考えがちょっとわかりかねるので、やはり先生に納得がいくように聞くべきだと思います。 もしかすると、エラーとか出して先に進めないのが嫌で@つけて強引に先に進もうとしている?かもしれませんし、そのエラーのせいでhiddenに値が入らなかったりすることで違うエラーが出るのが嫌とかあるかもしれません。 それなら、そのエラーを対応する力を身につけないと意味はないと思いますので、先生に聞いたほうがいいでしょう。 hiddenと対照っていう言葉があっているかどうかですが、、、 hiddenは簡単に持たせることができますが、ソースコード見ると値とかは見えますよね。 でもSESSIONで持たせればそこらへんは見えないまま保持できます。 でもhiddenならそれで終わりますが、SESSIONだとそのままって訳にもいかないので、unsetとかでSESSIONを破棄するタイミングとかは考える必要性は出てきます。
YukaSaku

2017/05/26 03:07

セッションにしようとしたら、セッションは次のレッスンの項目なので、今回のレッスンではセッションは使うなとのことです。私がそこにhiddenを持ってきたのも他の回答者様が言うには、すこしおかしいみたいですが、他に何が使えるのかよくわかりません。確かにこれを書いた当初はセッションの存在すら知らなかったのですが、すでにこのプログラムをエクササイズとして2ヶ月が経過しようとしてるところなので、ネットでセッションの使い方は覚えました。もしセッションとhiddenが使えないとなれば、何が使えるのでしょうか。
guest

0

いまいち質問の意味が分かりませんが
hiddenがソースに出力されるのがアレだというのなら
セッションを使うとか・・

投稿2017/05/25 22:46

yuki84web

総合スコア1857

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

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

YukaSaku

2017/05/26 00:03

hiddenとSESSIONが対なのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問