2012-02-24 9 views
2

私はマイクロサイトを構築しており、パスワードリセットの動作に問題があります。PHP検証スクリプトのデバッグ

ユーザーにパスワードを2回入力するフォームがあります。私はパスワードナチではなく、唯一の要件はパスワードが5文字以上であることです。送信時に、フォームデータは$ _POST配列に追加され、サイト全体のPHP関数スクリプトのsetPass関数に送られます。私は、この例では、データベースの挿入コードを残している

function setPass(){ 
    $link= connectDB(); 

    $query= "select * from People where Username='" . $_SESSION['name'] . "' Limit 1"; 
    $result= $link->query($query); 

    if ($result->num_rows==0){ 
     $_SESSION['status']= 'invaliduser'; 
     header("location: ../index.php"); 
    } else { 
     $first = $_POST['firstPass']; 
     $second = $_POST['secondPass']; 

     if (($first == $second) && (strlen($first) > 5)){ 
      $password = sha1($first); 
     } 
    } 
} 

関数です。

私の問題は、このスクリプトecho $_SESSION['name'] . " and password: " . $first;がページ本体に含まれていて、ユーザー名を表示していますが、警告がunidentified variable: firstであるということです。これは変数$passwordにアクセスしようとしたときにも発生します。

以前のテストでは、ページがリダイレクトされないため、最初の条件が真であることがわかりました。

したがって、elseブロックの実行に失敗する原因は何ですか?

+0

あなたのコードに 'echo'が表示されません。どこで' echo'をしようとしていますか?あなたは 'setPass'関数の内部でそれをやっていますか? –

+0

私はいくつかのHTMLヘッダーとbodyタグをsetPass関数があるPHPページに追加しました。それがエコータグです。 – Jason

+0

ええ、 'setPass'関数の外でそれらの変数にアクセスしようとするならば、あなたは範囲外です。以下の答えと同様に、グローバルまたは '$ _SESSION'を使用してください。 –

答えて

4

あなたはsetPass関数の内部$first$passwordを設定しているので、それらは同じの身体の外には使用できません。

キーワードglobalを使用するか、外から使用したい場合は、関数から値を返す方がよいでしょう。

このコンセプトは、スコープの変数と呼ばれます。これらの変数は、関数内にローカルスコープを持ちます。 PHPでのスコープの包括的な説明については、hereを参照してください。

2

あなたはスクリプトの本文にエコーしていると言いますか?関数内で変数を定義したので、グローバルとして設定しない限り(一般的には良い考えではありません、PHP global in functionsを参照)、$は本当に存在しません。

1

私はスコープの問題のように見えます。セッションまたはより好ましくはグローバル変数のいずれかを使用することをお勧めします。

チェックアウトこの詳細は:http://php.net/manual/en/language.variables.scope.php

[EDIT]

またはより良い、Borealidが提案のような関数から最初の$を返します。