类对象无法转换为字符串

13

我创建了我的第一个类,但我在将对象转换回字符串方面遇到了问题。

class Cryption
{
    var $data;
    var $salt;

function __construct($data, $salt)
{
    $this->data = $data;
    $this->salt = $salt;
}

function sha512()
{
    $sodium = 'Na';
    return hash_hmac("sha512", $this->data . $this->salt, $sodium);
}

function encrypt()
{
    $salt = substr(sha512(($this->key), 'brownies'), 0, 30);
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $this->data, MCRYPT_MODE_CBC, md5($salt)));
}

当我使用它时:

$password = new Cryption(mysql_real_escape_string(trim($_POST['password'])), 'pepper');
$password->sha512();

这里显示“PHP Catchable fatal error: Object of class Cryption could not be converted to string(PHP可捕获致命错误:无法将Cryption类的对象转换为字符串)”。

我不知道如何将它转换回字符串。请有经验的开发者帮帮我吗?

谢谢。

编辑:

<?php
require("config.php");
include("includes/cryption/cryption.php");

$username = mysql_real_escape_string(trim($_POST['username']));
$password = new Cryption(mysql_real_escape_string(trim($_POST['password'])), 'pepper'); //use a different salt next time such as a special salt for each user
$password->sha512();

$result = mysql_query("SELECT * FROM `administrators` WHERE username='$username' and password='$password'");
$row = mysql_fetch_row($result);
$count = mysql_num_rows($result);

if ($count == 1) {
    if (isset($_POST['remember'])) {
        session_start();
        $_SESSION['user'] = array(
            'id' => $row[0],
            'username' => $row[1],
            'password' => $row[2]
        );
        $userid = new Cryption($_SESSION['user']['id'], 'kkfishing');
        $session = new Cryption($_SESSION['user']['username'], 'kkfishing');
        $validated = new Cryption($_SESSION['user']['password'], 'kkfishing');

        setcookie("uniqueid", $userid->encrypt(), time() + 60 * 60 * 24 * 100, "/"); //100 days
        setcookie("kksessionid", $session->encrypt(), time() + 60 * 60 * 24 * 100, "/");
        setcookie("kkuserid", $validated->encrypt(), time() + 60 * 60 * 24 * 100, "/");//disguised cookie name
    }
    session_start();
    $_SESSION['authenticated'] = $row[0];
    echo '1'; //true
    exit;
}
else
{
    echo '0'; //false
    exit;
}
?>

1
你展示给我们的代码不会返回那个错误。你在其他地方将它用作字符串。 - zerkms
你能发一下完整的代码吗?这段代码不可能产生那个异常。 - Daniel
@Kyle:错误指向哪一行?如果您希望解决问题,请提供所有可能的信息。这里没有人对询问细节感兴趣,以便与您玩“危险辞汇”游戏。 - zerkms
对不起,Zerk。Andreas刚刚指出了错误所在的片段。 - Kyle
@Kyle:我也是,但我删掉了我的答案,因为我来晚了。无论如何,兄弟,下次请指定相关的代码并指定您遇到问题的确切行 - zerkms
@zerk 我会做的,谢谢你提供的信息,我会将其用于今后参考。 - Kyle
2个回答

19

看看这几行代码:

$password->sha512();

$result = mysql_query("SELECT * FROM `administrators` WHERE username='$username' and password='$password'");

$password 是一个对象。它应该是:

$pw = $password->sha512();

$result = mysql_query("SELECT * FROM `administrators` WHERE username='$username' and password='$pw'");

谢谢,我不知道原来是这样的。这也帮助我处理其他设置为对象的变量。非常感谢Andreas。 :) - Kyle
我不知道这就是解决对象问题的方法。你说得对,它指引了我去寻找问题所在,只是我不确定该如何处理对象问题。我曾经困惑于是类还是其他部分出了问题。 - Kyle

5
在错误的方式下初始化构造函数变量,例如以下代码,可能会遇到相同的错误:
 function __construct($data, $salt)
{
    $this->$data = $data; //mistakenly using $ (dollar) sign after `$this->`
    $this->$salt = $salt;
}

正确的初始化方式如下:

function __construct($data, $salt)
{
    $this->data = $data;
    $this->salt = $salt;
}

这不是这个问题原贴的情况,但是我在以相同方式初始化时遇到了同样的错误。希望这能为某人节省时间 :) - Rakibul Haq

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