2016-08-11 11 views
0

これは少し時間がかかることをお詫びしますが、私はコードを示して何も残したくありませんでした。URL識別子が存在する場合のPHPの未定義変数

ゴール:ユーザは、フォームにデータベースにフォームを送信する登録フォームを送信し、情報とユニークな文字列をデータベースに追加します。ユーザーは、それらが取られているリンクをクリックすると

xyz.com/activate.php?uid=292ca78b727593baad9a 

:ユーザーが電子メールを送信するとそのような終わりにURL識別子としてその固有の文字列を持っているPHPのページへのリンクが含まれているユーザーに送信されますそのページで別のフォームに記入し、送信ボタンをクリックするとアカウントが有効になります。

問題:

Undefined index: variable in process.php 

しかしURLのように示して、ユーザーがURL識別子を削除する場合:

ユーザーがリンクに行く、彼らはそうのように私の検証ページからエラーを受け取り提供しました
xyz.com/activate.php 

ユーザーにエラーが表示されず、検証ページ(process.php)が正常に動作します。私は$_GET['uid']で識別子を使用し、コードを実行する前にそれが存在するかどうかを確認しようとしましたが、結果は同じでした。私はこの問題をGoogleにしようとすると答えが見つからないので、これが以前に尋ねられた場合はお詫びします。

質問:なぜこれはURL識別子なしでは機能するのですか?私はURL識別子がを実行しているページが最初に読み込まれるときに基本的に$_REQUESTを実行することを認識しています。それを防ぐ方法はありますか?

あなたが私が作業しているコードを知っているので、私はそれを下に掲載しました。

activate.php:

<?php 

    // validate the form. 
    require_once('process.php'); 
    $validation_rules = array(
     'company_name' => array(
      'required' => true, 
      'min-length' => 2 
     ) 
    ); 
    $db_error = ''; 
    $validate = new validator(); 
    $validate->validate($validation_rules); 
    if ($validate->validate_result()) { 
     // the validation passed! 
    } 

?> 
     <div class="bg v-100 cm-hero-activate"> 
      <div class="v-100"> 
       <div class="v-set v-mid"> 
        <form class="v-mid v-bg-white <?php if(!$validate->validate_result() && $_POST || !empty($error)) { echo "shake"; } ?>" name="activation" action="" method="post"> 
         <fieldset> 
          <div class="form-content"> 
           <div id="content"> 
            <div class="form-inner in" data-id="1" data-name="activate"> 
             <h1>ACTIVATE YOUR ACCOUNT</h1> 
             <div class="form-section"> 
              <h2>Personal Info</h2> 
              <?php if (!empty($db_error)) { 
               echo $db_error; 
              } ?> 
              <div class="field-group"> 
               <input type="text" id="company_name" class="field required" name="company_name" value="<?php $validate->form_value('company_name'); ?>"> 
               <label for="company_name" class="placeholder">Company Name</label> 
               <?php $validate->error(array('field' => 'company_name', 'display_error' => 'single')); ?> 
              </div> 
             </div> 
             <div class="field-bottom"> 
              <button name="submit" data-name="activate" class="bttn btn-dark btn-hover-gloss">ACTIVATE MY ACCOUNT</button> 
             </div> 
            </div> 
           </div> 
          </div> 
         </fieldset> 
        </form> 
       </div> 
      </div> 
     </div> 

process.php:

<?php 

    class validator { 

    private $validation_rules; 
    private $errors = array(); 
    private $validate_result = array(); 

    public function validate($rules) { 
     $this->validation_rules = $rules; 
     if($this->validation_rules && $_REQUEST) { 
      foreach($this->validation_rules as $field => $rules) { 
       $result = $this->process_validation($field, $rules); 
       if($result == false) { 
        $this->validate_result[] = 0; 
       } elseif($result == true) { 
        $this->validate_result[] = 1; 
       } 
      } 
     } 
    } 

    public function form_value($field_name = '') { 
     if($this->validation_rules) { 
      if($_REQUEST && $_REQUEST[$field_name]) { 
       if(!$this->validate_result()) { 
        echo $_REQUEST[$field_name]; 
       } 
      } 
     } 
    } 

    public function validate_result() { 
     if($this->validation_rules) { 
      if($_REQUEST) { 
       $final_result = true; 
       $length = count($this->validate_result); 
       for($i=0;$i < $length; $i++) { 
        if($this->validate_result[$i] == 0) { 
         $final_result = false; 
        } 
       } 
       return $final_result; 
      } 
     } 
    } 

    private function process_validation($field, $rules) { 
     $result = true; 
     $error = array(); 
     foreach($rules as $rule => $value) { 
      if($rule == 'required' && $value == true) { 
       if(!$this->required($field, $value)) { 
        $error[] = "$field - required"; 
        $result = false; 
       } 
      } elseif($rule == 'min-length') { 
       if(!$this->minlength($field, $value)) { 
        $error[] = "$field - minimun length is $value"; 
        $result = false; 
       } 
      } 
     } 
     $this->errors[] = array($field => $error); 
     return $result; 
    } 

    public function error($data = '') { 
     if($this->validation_rules) { 
      if($_REQUEST) { 
       foreach($this->errors as $err) { 
        if(isset($data['field'])) { 
         foreach($err as $field => $field_error) { 
          if($data['field'] == $field) { 
           foreach($field_error as $error_data) { 
            if(isset($data['display_error']) == 'single') { 
             echo '<p class="error">' . $error_data . '</p>'; 
             goto next; 
            } else { 
             echo '<p class="error">' . $error_data . '</p>'; 
            } 
           } 
           next: 
          } 
         } 
        } else { 
         foreach($err as $field => $field_error) { 
          foreach($field_error as $error_data) { 
           if(isset($data['display_error']) == 'single') { 
            echo '<p class="error">' . $error_data . '</p>'; 
            goto next1; 
           } else { 
            echo '<p class="error">' . $error_data . '</p>'; 
           } 
          } 
          next1: 
         } 
        } 
       } 
      } 
     } 
    } 

    private function required($field, $value) { 
     if(empty($_REQUEST[$field])) { 
      return false; 
     } else { 
      return true; 
     } 
    } 

    private function minlength($field, $value) { 
     if(strlen($_REQUEST[$field]) < $value) { 
      return false; 
     } else { 
      return true; 
     } 
    } 

?> 

EDIT:if(strlen($_REQUEST[$field]) < $value)

:エラーが min-length機能に if statementで起こっているようです

EDIT 2:これはまた、 se。 <br /><font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'><tr><th align='left' bgcolor='#f57900' colspan=

をし、その下に、私はこのエラーが表示されます:テキストボックスは、これで満たされているNotice: Undefined index: company_name in C:\...\process.php on line 25 Call Stack #TimeMemoryFunctionLocation 10.0005369632{main}()...\activate.php:0 20.0029403928validator->form_value()...\activate.php:80 ">

+0

いいえ私はそうではありません。このコードは私のサーバー上でwampでホストされています。 (関連性があるかどうかは分かりませんが、今のところCodeIgniterが何であったのか分かりませんでした) – Matthew

+0

申し訳ありませんが、愚かなコメントでした。質問を正しく読まなかった。今すぐ削除する –

+0

「未確認のインデックス」がどの行にあるのか、コード – Jason

答えて

2

あなた$field_nameあなたは未定義のインデックスエラーを取得している理由である$_REQUEST配列には存在しません。

値が設定されているかどうかはチェックしていません。ifステートメントの$_REQUEST[$field_name]でアクセスするだけです。

変更

public function form_value($field_name = '') { 
    if($this->validation_rules) { 
     if($_REQUEST && $_REQUEST[$field_name]) { 
      if(!$this->validate_result()) { 
       echo $_REQUEST[$field_name]; 
      } 
     } 
    } 
} 

public function form_value($field_name = '') { 
    if($this->validation_rules) { 
     if($_REQUEST && isset($_REQUEST[$field_name])) { 
      if(!$this->validate_result()) { 
       echo $_REQUEST[$field_name]; 
      } 
     } 
    } 
} 

とは無関係のヒント。

清潔で簡潔なコードを目指してください。

$input = [ 
    'name' => 'Matthew', 
]; 

$rules = [ 
    'name' => 'required|string', 
]; 

$v = (new Validator())->validate($input, $rules); 
if ($v->fails()) { 
    // Do something with $v->errors(); 
    return; 
} 

// Do something with validated input 

試してみて、else or elseif可能な限りの使用は避けてください。これは、最初に否定的なものを探し出し、早期に終了することで実現できます。あまりにも多くのレベルの入れ子を持たないようにしてください。それはあなたのコードを読みにくくし、循環系の複雑さを増やします。

また、コードを構造化するのに役立つMVCフレームワークを見てください。良いスタートを使用すると、空の配列がfalsyおよび非で、PHPで

if($this->validation_rules && $_REQUEST) { 

のようなロジックを持っているので、あなたはこのエラーを取得しているhttps://laracasts.com/

+0

ありがとうございます!これはすごくうまくいった。 '$ _REQUEST [$ field_name]'が 'if文 'にあったインスタンスを' isset($ _REQUEST [$ field_name])'に変更するのは、まさに私が必要としたものです。あなたは最高です@Gravy – Matthew

+0

ええ、カスタム検証のチュートリアルに従っていたら、ネストは少し不必要だと思っていましたが、基本的に書き直すことなくどのようにトリミングするのか分かりません。私はちょうどあなたのコメントで推薦したバリデータパッケージと一緒に行くかもしれません。私は絶えずベストプラクティスを探していますし、物事を行う "正しい"方法です。私はlaravelの使い方を見て、それをより良く理解できるかどうかを見ていきます。既に開始されているプロジェクトに統合するのは簡単か、やり直すのがよいでしょうか?途中であなたの助けをありがとう。それは有り難いです。 – Matthew

+1

Laravelはかなり簡単/簡単です。上記のあなたのコードに基づいて - おそらく、フレームワークの使用を開始した後にそれを書き直したいと思うでしょう。 laracastチュートリアルに従ってください - それを知る前に、あなたはエンタープライズ品質のソフトウェアを書くでしょう。 – Gravy

1

の良いチュートリアルがあるLaravel https://laravel.com/ようなものになるだろう空のもの、真実

$_REQUESTは、$_GET,$_POSTおよび$_COOKIEの組み合わせである。

あなたはuidクエリパラメータを追加すると、$_REQUESTしたがって空ではありませんではないfalsyとあなたのバリデータを実行しようとしますが、期待されるPOSTデータのない(例えばcompany_nameなど)。

POSTデータの検証のみを行う場合は、$_POSTを検査する必要があります。

配列キーの存在を確認するより安全な方法については、Gravy's answerを参照してください。

+0

私は '$ _REQUEST'がそのように動作することを知っていたはずです。おそらく '$ _REQUEST'の全てを' $ _POST'に変更して、フォームがsubmitボタンをクリックするまで検証しないようにします。なぜ私がもう少し詳細にエラーを出していたのかを説明する+1。ありがとうございました! – Matthew

関連する問題