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

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

ただいまの
回答率

90.45%

  • PHP

    24602questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 834

YukaSaku

score 34

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

<?php
/*  Program name: register.php
 *  Description:  Program displays the blank form and checks
 *  all the form fields for blank fields.
 */

ini_set("display_errors","on");
error_reporting(E_ALL | E_STRICT);
ini_set("include_path","./includes");
include("dbinfo.inc");
$gen="Gender";
$rows = 0;
$last_id = 0;


if(isset($_POST['submitted']) and $_POST['submitted'] == "yes")
{
    if(!isset($_POST['gen']))
    {
     $blank_data[] = $gen;
    }
  foreach($_POST as $field => $value)
  {
    if(empty($value))
    {
              $blank_data[] = $field;
    }
    else
    {
      $good_data[$field] = strip_tags(trim($value));
    }
  }
  if(@sizeof($blank_data) > 0)
  {
    $message = "<p style='color: red; margin-bottom: 0;
                 font-weight: bold'>
                 You didn't fill in one or more required fields.
                 You must enter:
                 <ul style='color: red; margin-top: 0;
                 list-style: none' >";
 /* display list of missing information */
    foreach($blank_data as $value)
    {
      $message .= "<li>$value</li>";
    }
    $message .= "</ul>";
    //extract($good_data);
     echo $message;
   include("form.inc");
    exit();
  }
  foreach($_POST as $field => $value)
  {
    if(!empty($value))
    {
    //validations
      $name_patt = "/^[A-Za-z0-9' -]{1,15}$/";
      $email_patt = "/^.+@.+\\..+$/";
        $phone_patt = "/^[0-9)(xX -]{7,20}$/";
      $passwd_patt = "/^[A-Za-z0-9' -]{1,60}$/";

    $field = htmlspecialchars($field, ENT_QUOTES);
    $value = htmlspecialchars($value, ENT_QUOTES);

     if(preg_match("/username/i",$field))
      {
        if(!preg_match($name_patt,$value))
        {
          $error_array[] = "$value is not a valid Username";
        }
      }
         if(preg_match("/phone/i",$field))
      {
        if(!preg_match($phone_patt,$value))
        {
          $error_array[] = "$value is not a valid Phone";
        }
      }
      if(preg_match("/email/i",$field))
      {
        if(!preg_match($email_patt,$value))
        {
          $error_array[] = "$value is not a valid Email";
        }
      }

    if(preg_match("/password/i",$field))
      {
        if(!preg_match($passwd_patt,$value))
        {
          $error_array[] = "$value is not a valid password";
        }
      }
      echo "<div class='field'>";
    }
   }

  if(@sizeof($error_array) > 0)
  {
    $message = "<ul style='color: red; list-style: none' >";
    foreach($error_array as $value)
    {
      $message .= "<li>$value</li>";
    }
    $message .= "</ul>";
    echo $message;
    @extract($clean_data);
    include("form.inc");
    exit();
  }
  else
  {
    $cxn = mysqli_connect($host,$user,$passwd,$dbname)
             or die("Couldn't connect to server");
    $clean_data = array();
    foreach($_POST as $field => $value)
    {
      $clean_data[$field] = mysqli_real_escape_string($cxn,$value);
    }
   $date = date("Y-m-d H:i:s");
    ?>

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

   <?php
        if (!empty($good_data['username'])  ) { // Confirm the username on the DB that user input
            //$sql = "SELECT username FROM login";
            $sql = "SELECT username FROM login WHERE username = " . $good_data['username'];
              if ($result = $cxn->query($sql)) {
                   $username_result = $good_data['username'];
                  $rows =1;
       }
  if ($rows == 1)
  {
      echo "Username already exists";
      include("form.inc");
      exit;
             } else {


               /* 接続状況をチェックします */
               if (mysqli_connect_errno()) {
                   printf("Connect failed: %s\n", mysqli_connect_error());
                   exit();
               }
               mysqli_query($result, "CREATE TABLE login LIKE cust_ID");


 /* loop that displays the form */
    $sql = "INSERT INTO login (username,phone,email,password,gen,date)
  VALUES ('".$clean_data['username']."',
  '".$clean_data['phone']."',
  '".$clean_data['email']."',
  '".$clean_data['password']."',
  '".$clean_data['gen']."',
  '$date')";
  }
    $result = mysqli_query($cxn,$sql)
          or die("Couldn't execute query1");
          $sql = "SELECT LAST_INSERT_ID() AS id;";
          $newID = mysqli_query($cxn,$sql) or die("Couldn't execute query");

          print_r($newID);


            printf ("New Record has id %d.\n", mysqli_insert_id($result));

            /* 接続を閉じます */
            mysqli_close($sql);


/*$sql = "SELECT LAST_INSERT_ID() AS id;";
    $newID = mysqli_query($cxn,$sql) or die("Couldn't execute query");

    print_r($newID);*/

    $signUpMessage =
  ' <br>Username is '.$clean_data['username'].' <br>'.
  ' Phone is '.$clean_data['phone'].' <br>'.
  ' Email is '.$clean_data['email'].' <br>'.
 ' Gender is '.$clean_data['gen'].' <br>'.
  ' The registration date is '.$date.' <br>'.
  ' Keep your password for your security.';
    echo  $signUpMessage;
    include("stored.inc");
  }
  }
}
else
{
  include("form.inc");
}
?>


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

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


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

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

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

追加

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 11:13

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

    キャンセル

+3

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 11:20

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

    キャンセル

  • 2017/05/26 11:31

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

    キャンセル

  • 2017/05/26 11:36

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

    キャンセル

  • 2017/05/26 11:49

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

    キャンセル

  • 2017/05/26 11:59

    IPAとは結構有名なところなんですね。皆さんが影響受けるなんて。

    キャンセル

  • 2017/05/26 12:19

    IPA は国内の情報産業に関わる人なら知っていなければならない団体です。

    IPA の発行するドキュメントは、実務の取っ掛かりとして適切な精度であるモノが多く、非常に大きな影響を与えます。教材としても優秀なドキュメントが多くあるので、学生にも有用だと思います。
    いろいろ漁ってみるとイイです。

    ちなみに、その優秀なドキュメントを断定的に否定できる人物に関しても、確認しておいたほうがイイです。

    キャンセル

  • 2017/05/26 12:25

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

    キャンセル

+2

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 08:58

    両方の表示しないという共通点を見て、こういう質問になってしまいました。
    エラーがあっても出さないという@は個人的にはあまり好きではないのです。

    ⚪️ @の方がよほどバグを隠すはずなのに、なぜ先生は@を積極的に使うのか、
    ⚪️ そしてhiddenのコードの箇所はなぜバグを生むと言っているのか、

    この2点を聞きたかったのです。

    hiddenと対照になるのはSESSIONなのですね。知らなかったです。
    ありがとうございます。

    キャンセル

  • 2017/05/26 09:22

    解決済みではありますが、
    先生の考えがちょっとわかりかねるので、やはり先生に納得がいくように聞くべきだと思います。

    もしかすると、エラーとか出して先に進めないのが嫌で@つけて強引に先に進もうとしている?かもしれませんし、そのエラーのせいでhiddenに値が入らなかったりすることで違うエラーが出るのが嫌とかあるかもしれません。

    それなら、そのエラーを対応する力を身につけないと意味はないと思いますので、先生に聞いたほうがいいでしょう。

    hiddenと対照っていう言葉があっているかどうかですが、、、
    hiddenは簡単に持たせることができますが、ソースコード見ると値とかは見えますよね。
    でもSESSIONで持たせればそこらへんは見えないまま保持できます。
    でもhiddenならそれで終わりますが、SESSIONだとそのままって訳にもいかないので、unsetとかでSESSIONを破棄するタイミングとかは考える必要性は出てきます。

    キャンセル

  • 2017/05/26 12:07

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 09:03

    hiddenとSESSIONが対なのですね。

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24602questions

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