Все работает хорошо, если это не дает мне верный результат и ничего не меняется

Я пытаюсь написать сценарий смены пароля. Все идет правильно. Кроме этого. Он говорит мне, что это успешно, но ничего не меняется. Ничего не меняется в зашифрованном коде в моем mysql, а также, когда я пытаюсь войти в систему, я не могу использовать новый пароль, а только старый пароль. Вот код

<?php
session_start();
require_once('inc/functions.inc.php');
if (!isset($_POST['submit'])) {
    die(header("Location: settings.php"));
}
if (isset($_SESSION['updatePasswordError'])) {
    unset($_SESSION['updatePasswordError']);
}
$_SESSION['updatePasswordError'] = array();

if (isset($_SESSION['updatePasswordSuccess'])) {
    unset($_SESSION['updatePasswordSuccess']);
}
$_SESSION['updatePasswordSuccess'] = array();

if (strlen($_POST['newpassword'])  < 8) {
    $_SESSION['updatePasswordError'][] = "New Password must be at least 8 characters";
}
else if ($_POST['newpassword'] != $_POST['confirmnewpassword']) {
    $_SESSION['updatePasswordError'][] = "Passwords don’t match";
}

$mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DB);
if ($mysqli->connect_errno) {
    error_log("Cannot connect to MySQL: " .
              $mysqli->connect_error);
    return false;
}
$incomingOldPassword = $mysqli->real_escape_string(htmlspecialchars($_POST['currentpassword']));
$query = "SELECT * from Customer WHERE id = '{$user->id}'";
if (!$result = $mysqli->query($query)) {
    $_SESSION['updatePasswordError'][] = "Select Error. Try Again";
    error_log("Cannot retrieve account for {$user}");
    return false;
}
// Will be only one row, so no while() loop needed
$row = $result->fetch_assoc();
$dbPassword = $row['password'];
if (crypt($incomingOldPassword,$dbPassword) != $dbPassword) {
    $_SESSION['updatePasswordError'][] = "Old Password Incorrect";
}

if (count($_SESSION['updatePasswordError']) > 0) {
    die(header("Location: settings.php"));
} else {
    $cryptednewPassword = crypt($_POST['newpassword']);
    $newPassword = $mysqli->real_escape_string($cryptednewPassword);
    $result = "$updatePassword($newPassword)";
    if ($result) {
        $_SESSION['updatePasswordSuccess'] [] = "Successfully Updated";
        die(header("Location: settings.php"));
    } else {
        die(header("Location: settings.php"));
    }
}


function updatePassword($newPassword) {
    $mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DB);
    $query = "UPDATE customer SET password = ? WHERE id = $user->id";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("s", $newPassword);
    $result = $stmt->execute();
    $mysqli->close();
    return $result;
}
?>

Если я попытаюсь использовать неправильный пароль, не соответствующий пароль или менее 8 символов, я получаю сообщение об ошибке. Но все кажется в порядке кроме этого

Нет необходимости сбрасывать переменную прямо перед тем, как присвоить ей новое значение.

Barmar 04.03.2019 21:01

Не используйте htmlspecialchars() для кодирования параметров. Это следует использовать только при отображении пользовательских данных на веб-страницах, чтобы предотвратить эксплойты XSS.

Barmar 04.03.2019 21:02

Где вы устанавливаете $user?

Barmar 04.03.2019 21:03

Вы должны использовать password_hash() и password_verify() для шифрования пароля, а не crypt().

Barmar 04.03.2019 21:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
24
1

Ответы 1

Вы не вызываете функцию updatePassword(). Эта строка:

$result = "$updatePassword($newPassword)";

не вызывает функцию. Он просто создает строку, содержащую значения переменных $updatePassword и $newPassword. Поскольку $updatePassword не существует, это эквивалентно написанию:

$result = "($newPassword)";

Вы также должны были получить предупреждающее сообщение о неопределенной переменной.

Способ вызова функции:

$result = updatePassword($newPassword);

Вы не заключаете вызов функции в кавычки и не ставите $ перед именем функции.

Вам также необходимо установить $user в основном скрипте и передать его в качестве аргумента функции или использовать global $user; внутри функции.

Спасибо. Я изменил это. Но, все тот же ответ. Я пытаюсь вызвать переменную со страницы объекта. правильно ли это $query = "ОБНОВИТЬ пароль клиента SET = ? WHERE id = '{$user->id}'";

Olaiwola Ayoola 04.03.2019 21:30

Это правильно, если вы правильно установили $user. Разве вы не получаете предупреждение о неопределенной переменной?

Barmar 04.03.2019 21:31

Я не получаю сообщение об ошибке для неустановленной переменной. Я также использовал другие переменные этого в версии для печати. я не знаю, почему он не работает. Я использовал user->username и т.д.

Olaiwola Ayoola 04.03.2019 21:44

У вас включен error_reporting(E_ALL);? Кажется, ничего не настраивается $user, если только оно не установлено в functions.inc.php.

Barmar 04.03.2019 21:48

Даже если он установлен в основном скрипте, он не установлен в области действия функции. Прочтите последнюю строчку ответа.

Barmar 04.03.2019 21:49

Я проверю сообщения об ошибках. В файле функций есть требование classuser. Тем не менее, я попытался ввести скрытый ввод для идентификатора пользователя-> в файл настроек, а затем я использовал $_post, чтобы получить его в функции внутри переменной. Итак, у меня есть что-то вроде $userid=$_POST['userid];

Olaiwola Ayoola 04.03.2019 21:56

Затем я использовал, где id = $userid. И я получаю эту ошибку. Неустранимая ошибка: Uncaught Error: вызов функции-члена bind_param() для логического значения в C:\xampp\htdocs\two\inc\update-password.inc.php:64 Трассировка стека: #0 C:\ xampp\htdocs\two\inc\update-password.inc.php(49): updatePassword('$1$BC5V4zBN$00f...') #1 C:\xampp\htdocs\two\profile-update.php(5 ): include('C:\\xampp\\htdocs...') #2 {main} добавлено в C:\xampp\htdocs\two\inc\update-password.inc.php в строке 64

Olaiwola Ayoola 04.03.2019 21:57

Это означает, что prepare() получил ошибку. Вам нужно проверить, успешно ли это, и напечатать $db->error, когда это не удастся.

Barmar 04.03.2019 21:59

Должно быть $query = "UPDATE customer SET password = ? WHERE id = ?";, а потом $stmt->bind_param("si", $newPassword, $userid);

Barmar 04.03.2019 22:01

@Layoolar Вы не должны использовать real_escape_string для параметров, связанных с bind_param.

Barmar 04.03.2019 22:18

Спасибо. Теперь функция выглядит следующим образом: function updatePassword() { $mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DB); $cryptednewPassword = crypt($_POST['новый пароль']); $query = "ОБНОВИТЬ пароль клиента SET = ? WHERE id = '{$user->id}'"; $stmt = $mysqli->подготовить($запрос); $stmt->bind_param("s", $cryptednewPassword); $результат = $stmt->выполнить(); $mysqli->закрыть(); вернуть $результат; }

Olaiwola Ayoola 04.03.2019 22:32

if (count($_SESSION['updatePasswordError']) > 0) { die(header("Расположение: settings.php")); } else { $cryptednewPassword = crypt($_POST['новый пароль']); $результат = обновить пароль(); if ($result) { $_SESSION['updatePasswordSuccess'] [] = "Обновлено успешно"; die(header("Расположение: settings.php")); } else { die(header("Расположение: settings.php")); } }

Olaiwola Ayoola 04.03.2019 22:33

Вы до сих пор не установили $user нигде в функции. Вы понимаете переменную область видимости?

Barmar 04.03.2019 22:33

Я совсем запутался. Я просто добиваюсь успеха. больше не понимаю

Olaiwola Ayoola 04.03.2019 22:34

Поскольку $user не задано, $user->id пусто, поэтому выполняется WHERE id = ''.

Barmar 04.03.2019 22:34

Это не сообщит об ошибке, но обновлять нечего.

Barmar 04.03.2019 22:35

Почему вы настаиваете на использовании подстановки переменных вместо bind_param вместо $user->id?

Barmar 04.03.2019 22:36

Другие вопросы по теме