0

私はphpのオブジェクト指向の側面を学び、レンガの壁にぶつかり続けようとしています。おそらく単純に修正されたものですが、URLを介してクラス関数から返された変数変数が私のページにエコーされない理由がわかりません。

index.php

require_once('db.php');
require 'userclass.php';
$user = new user();

if(isset($_POST['submit'])){
    if($user->login($_POST['username'], $_POST['password'])){
        echo("poo");
    }
}

userclass.php

include('db.php');
session_start();
class User{

public function login($username, $password){
    $uname = $username;
    $pass = $password;
    header("location:index.php?uname=".$uname);

}
}

私のif条件ロジックと関係があるのではないかと思います。

私の側の他の愚かさや一般的でない慣行を指摘してください。私はただ1つの解決策を持っているのではなく、私がそれに取り組んでいる間にできるだけ多くを学びたいと思います。:)

ありがとう!

4

3 に答える 3

2

クラスは大文字で定義されます。これを使って。

$user = new User();

あなたのメソッドは値を返さず、リダイレクトも実行しようとしますか?

ログインが成功したかどうかをチェックするコードは、ブール値を期待しています。あなたはする必要がありますreturn true;(またはfalse)。リストしたコードには、ユーザー名またはパスワードが有効かどうかをチェックするロジックも含まれていませんが、テストしているため、この段階では意図的なものであると思われます。

どこの真ん中にリダイレクトがあるように見えるのはなぜですか?

リダイレクトする場合は、スクリプトを強制終了し、それ以上のページ出力を防ぐ必要があります。そうしないと、リダイレクトは発生しません。

public function login($username, $password){
    if ($username == 'testuser' && $password == 'testpass') {
        return true;
    }
    header("Location: index.php?uname=$uname");
    die();
}

他の小さなニグル:

requirerequire_onceは両方ともステートメントであり、関数ではありません。括弧で囲まれた構文と括弧で囲まれていない構文を混在させています。ステートメントに角かっこを使用しないことをお勧めします。

$_POST['username']Locationヘッダーでまっすぐにパスバックします。新しいバージョンのPHPはヘッダーインジェクションから保護しますが、これを行うのはかなり悪い考えです。

于 2012-08-02T13:15:30.180 に答える
0

if($user->login($_POST['username'], $_POST['password'])){評価するために何らかの戻り値が必要になるecho "poo";ため、$ _ POSTが設定されていない別のページ?uname =に移動するため、発生することはありません。

特定の条件が満たされた場合、ログインはtrueを返す必要があります。その場合、ヘッダーの場所はおそらくindex.php内にあるはずです(ログインが成功した後にリダイレクトする場合)。

于 2012-08-02T13:15:22.960 に答える
0

呼び出す$user->login(...)と、別のページに移動するためのヘッダーが送信されます。また、次のような有効な値は返されませんtrue/false...戻り値を追加し、ヘッダーを削除すると、問題が解決すると思います...

于 2012-08-02T13:16:07.787 に答える