Что такое Fatal error: Uncaught Error: Использование $ this, когда не в контексте объекта? - PullRequest
0 голосов
/ 29 января 2019

Я хочу зашифровать пароль в php с помощью функции md5, и у меня возникла ошибка.

Неустранимая ошибка: ошибка Uncaught: использование $ this, когда отсутствует в контексте объекта в .... (строка)

Этот код, который я отслеживаю с по этой ссылке , но это была ошибка.Я пытался найти похожий вопрос на 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 голосов
/ 29 января 2019

$this не особенно полезен вне класса.Как только вы узнаете о классах , вы можете вернуться на тот сайт, который вы нашли.

Если вы хотите использовать addUser(), вам нужен класс, в котором свойство класса $pdo являетсяэкземпляр класса PDO , а свойство класса $statement является экземпляром PDOStatement

На предыдущей странице был показан скрипт с именемdatabase.php содержит класс DB, модель в шаблоне проектирования модель-представление-контроллер .Он соответствует требованиям, указанным выше.

Самый прямой способ запустить его в работу - добавить определение класса DB в сценарий и поместить в него определение функции addUser().

Как только вы это настроите, и когда вы узнаете о наследовании , вы можете рассмотреть возможность сохранения класса 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::$pdo и DB::$stmt с privateв protected:

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

Это потому, что свойства класса private не могут использоваться («видимыми») классом, расширяющим первый класс, но свойства класса protected являются.Это часть концепции под названием visibility .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...