类User的对象无法转换为字符串。

3

我目前正在开发一个论坛软件。

我有一个名为User的类,其中包含一个名为GetUserGroup的方法,用于确定用户所在的组。

我正在使用与所有其他查询相同的方式运行查询和关联,但我不确定我做错了什么,我已经检查了语法错误,但没有看到任何问题。

可捕获的致命错误:在C:\xampp\htdocs\forums\index.php的第22行中,无法将User类的对象转换为字符串。

以下是整个页面:

<?php 
include_once('connect.php');
session_start();

if (isset($_SESSION['username'])) {
    $username = $_SESSION['username'];

}

class User {

    public $usergroup;
    public $user;

    function __construct() {
        if (isset($_SESSION['username'])) {
            $this->user = $_SESSION['username'];
        }
    }

    public function GetUserGroup() {
        $find_group = "SELECT group FROM users WHERE username='$this->user'";
        $run_find_group = mysql_query($find_group);
        $find_group_assoc = mysql_fetch_assoc($run_find_group);
        $this->usergroup = $find_group_assoc['group'];
    }
}

class Forum {

    function __construct() {

    }

    public function DisplayForums() {

        $find = "SELECT id,name,description FROM forums";
        $run_find = mysql_query($find);

        while ($is = mysql_fetch_assoc($run_find)) {
            $forum_id = $is['id'];
            $forum_name = $is['name'];
            $forum_description = $is['description'];

            echo "<div  style='background:#FF6699;width:1000px;'>";
            echo "Forum: <a href='topics.php?t='$forum_id'>".$forum_name."</a><br/>".$forum_description."<br/><hr>";
            echo "</div>";
        }
    }
}

$forum = new Forum();
if (isset($_SESSION['username'])) {
    $_SESSION['username'] = new User();
    $_SESSION['username']->GetUserGroup();
}
?>
<html>
<head>
    <title>Home</title>
</head>
<body>
<?php 
if (isset($_SESSION['username'])) {
    echo "Welcome, " . $username . "!";
    if ($_SESSION['username']->usergroup==admin) {
        echo "<span align='right'><a href='/admin/index.php'>Admin CP</a></span>";
    }
    $forum->DisplayForums(); 
} else {
    $forum->DisplayForums(); 
    echo "
    <form action='login.php' method='post'>
    <table>
        <tr>
            <td>Username: </td>
            <td><input type='text' name='username' /></td>
        </tr>
        <tr>
            <td>Password: </td>
            <td><input type='text' name='password' /></td>
        </tr>
        <tr>
            <td><input type='submit' name='login_submit' value='Login' /></td>
        </tr>
    </table>
    </form>";
}
?>
</body>
</html>

1
这里似乎有什么问题,警官? - gen_Eric
错误不在您提供的代码片段中。我怀疑完整的错误输出将告诉您问题发生的行号。请发布完整的错误消息和源代码。 - user895378
顺便提一下 - 如果您之前没有进行任何验证,您的SQL查询就容易受到SQL注入攻击的影响。http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php - keyboardP
1
我遇到了“无法将User类的对象转换为字符串”的错误。出错代码在$find_group = "SELECT group FROM users WHERE username='$this->user'";这一行。此外,我知道这存在漏洞,但我刚开始写这个程序,还没有来得及添加保护措施。 - Darren
1
显然 $this->user 是一个对象。使用 var_dump 进行验证。作为替代方案,可以使用调试器来逐步执行代码以找出问题所在。如果你想让 $this->user 成为一个对象,在其中添加一个 __toString 方法以告诉它如何在字符串上下文中运行。 - Gordon
1
@Darren 软件安全不是开发的一个“阶段”。 - Mike B
3个回答

6

您的问题在这里:

$_SESSION['username'] = new User();

您正在将一个User对象分配给$_SESSION['username']。所以,当调用$_SESSION['username']->GetUserGroup()时,$this->user是一个User对象。
您需要将$_SESSION['username']设置为用户名,而不是一个对象。或者从对象中创建一个获取用户名的方法。您应该为User添加一个getUsername方法或类似的内容。
public function GetUserGroup() {
    $user = $this->user->getUsername();
    $find_group = "SELECT group FROM users WHERE username='$user'";
    $run_find_group = mysql_query($find_group);
    $find_group_assoc = mysql_fetch_assoc($run_find_group);
    $this->usergroup = $find_group_assoc['group'];
}

您还可以使用PHP的__toString方法。

function __toString(){
  return $this->getUsername();
}

如果使用__toString,那么:
$find_group = "SELECT group FROM users WHERE username='$this->user'";

将会工作。


所以我应该将 $_SESSION['username'] = new User(); 改为 $username = new User();,在将 $username 设置到 $_SESSION 后进行吗? - Darren
@Darren:问题在于$_SESSION['username']是一个User对象,而不是一个字符串。所以,当你执行$this->user = $_SESSION['username'];时,你将$this->user设置为一个对象,而不是一个字符串。你可以这样做$_SESSION['username'] = new User();,只要你知道它不是一个字符串。你需要像这样做$this->user = $_SESSION['username']->getUsername(),或者使用__toString()方法。 - gen_Eric
我该怎么修复它?比如,我该如何将 $this->user 转换为字符串? - Darren
我对应该在getUsername()方法中放什么感到困惑。你能指导我正确的方向吗? - Darren
@Darren:在 getUsername 中,您应该添加一种获取用户用户名的方式。您有一个 User 对象,您怎么知道是哪个用户呢? - gen_Eric

1

除了安全问题和缺乏凝聚力之外:在您的示例中,您将new User()分配给$_SESSION['username'],因此这就是$this->user的内容。

看起来您正在同时使用$_SESSION['username']作为用户名字符串和User对象。要么只存储其中一个,要么将它们分开存储(例如,作为$_SESSION['username']$_SESSION['user'])。


1

改变这行:

$find_group = "SELECT group FROM users WHERE username='{$this->user}'";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接