0

我正在尝试向 php 学习面向对象的一面,并不断努力。一个可能只是固定的,但我无法弄清楚为什么通过 URL 从类函数传回的变量变量不会回显到我的页面。

索引.php

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

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

用户类.php

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

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

}
}

我认为这可能与我的 if 条件逻辑有关?

请指出我的任何其他愚蠢行为或不常见的做法,我宁愿尽可能多地学习,而不是只有一个解决方案。:)

谢谢!

4

3 回答 3

2

你的类是用大写字母定义的。用它。

$user = new User();

您的方法不返回值,并且还尝试执行重定向?

检查成功登录的代码需要一个布尔值。您需要return true;(或错误)。您列出的代码也不包含任何检查用户名或密码是否有效的逻辑,尽管我怀疑这是现阶段故意的,因为您正在测试。

为什么似乎在不知名的地方有一个重定向?

当您想要重定向时,您还需要终止脚本并阻止任何进一步的页面输出,否则重定向将不会发生。

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

其他小问题:

requireandrequire_once都是语句而不是函数。您正在混合使用括号和非括号语法。最好不要在语句中使用括号。

$_POST['username']在 Location 标头中直接返回。虽然较新版本的 PHP 可以防止标头注入,但这样做是一个非常糟糕的主意。

于 2012-08-02T13:15:30.180 回答
0

当您调用$user->login(...)它时,它会发送一个标题以转到另一个页面。它也不会返回任何有效值,例如true/false...添加返回值并删除标题,我认为这将解决您的问题...

于 2012-08-02T13:16:07.787 回答
0

if($user->login($_POST['username'], $_POST['password'])){将需要某种返回值对其进行评估,因此echo "poo";永远不会发生,因为您随后会被定向到另一个页面 ?uname=,其中未设置 $_POST。

如果满足某些条件,登录将需要返回 true,然后我认为标头位置可能应该在 index.php 内(如果您在成功登录后重定向。

于 2012-08-02T13:15:22.960 回答