什么是致命错误:未捕获错误:在不在对象上下文中时使用$ this?

时间:2019-01-29 03:49:38

标签: php encryption login

我想使用md5函数在php中加密密码,但出现错误。

  

致命错误:未捕获错误:....(行)不在对象上下文中时使用$ this

我从this link跟进了此代码,但这是错误的。我试图在stackoverflow上搜索类似的问题,但没有找到与我相同的情况。这是我的代码。有人可以帮助我吗?

发现错误的行。 $this->stmt = $this->pdo->prepare($sql);

这是我的代码

<?php
    require_once('connect01.php');

    function addUser($name, $password){
        $hash = md5($password);
        $sql = "INSERT INTO `user` (`username`, `pass`) VALUES ('$name','$password')";
        $this->stmt = $this->pdo->prepare($sql);
        return $this->stmt->execute([$name, $hash]);
    }

    if(isset($_POST['submit'])){

        addUser($_POST['username'], $_POST['pass']);
    }
    ?>

1 个答案:

答案 0 :(得分:1)

$this在类之外不是特别有用。 learn about classes后,您可以返回找到的站点。

如果要使用addUser(),则需要一个类,其中$pdo类属性是PDO类的实例,而$statement类属性是一个实例PDOStatement

The previous page向您展示了一个名为database.php的脚本,其中包含DB类,这是model-view-controller设计模式下的模型。符合上述要求。

最直接的启动和运行方法是在脚本中添加DB类定义,并将addUser()的函数定义放入其中。

设置完成后,一旦您了解了inheritance,就可以考虑将DB类保留在脚本中,但保留原来的样子,没有addUsers()。如果您extends,仍可以使用并添加到其中:

class User extends DB
{
    function addUser($name, $password)
    {
        $hash = md5($password);
        $sql = "INSERT INTO `user` (`username`, `pass`) VALUES ('$name','$password')";
        $this->stmt = $this->pdo->prepare($sql);
        return $this->stmt->execute([$name, $hash]);
    }
}

请记住,如果选择此方法,则需要将DB::$pdoDB::$stmtprivate更改为protected

class DB
{
    protected $pdo = null;
    protected $stmt = null;
/* keep the rest of the class the same */

这是因为private类的属性不能被扩展第一个类的类使用(“可见”),而protected类的属性却可以使用。这是称为visibility的概念的一部分。