забыл пароль появилось сообщение об ошибке

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

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$db = new mysqli("localhost", "username", "password", "databasename");
if(isset($_POST['submit'])){
    $email = $_POST['email'];
    $stmt = $db->prepare("SELECT * FROM `users` where `customer_email` = ?");
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $res = $stmt->get_result();
    if($res->num_rows < 1){
        echo "No such email has been found";
    } else{
        $fetch = $res->fetch_assoc();
        $userid = $fetch['user_id'];
        $token = bin2hex(openssl_random_pseudo_bytes(45));
        $from = "[email protected]";
        $url = 'https://www.domain.co.uk/account/passwordreset.php?token='.$token;
        if(mail($email, $url, $from)){
            //if(mail($to,$subject,$message,$url,$headers)){
            $stmt = $db->prepare("INSERT INTO `lost_password`(user_id, token) values(?,?)");
            $stmt->bind_param('is', $userid, $token);
            $stmt->execute();
            $to = $email;
            $subject = "New Password Instructions";
            $message = " Please visit $url to reset your password";
            // Always set content-type when sending HTML email
            $headers = "MIME-Version: 1.0" . "\r\n";
            $headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
            // More headers
            $headers .= 'From: <[email protected]>' . "\r\n";
            $mail=mail($to,$subject,$message,$headers);
            if($stmt->affected_rows == 1){
                echo "We have emailed you instructions on how to reset your password";
            } else {
                echo "there was an error";
            }
        }
    }
}
?>

person Ian Haney    schedule 28.12.2019    source источник
comment
Пожалуйста, сделайте отступ в коде. Это трудно читать. В настоящее время вы получаете echo "there was an error"; или около 500 страниц?   -  person user3783243    schedule 28.12.2019
comment
Я сделал отступ в коде, надеюсь, его будет легче читать. Что касается ошибки, да, я получаю echo "there was an error" на странице   -  person Ian Haney    schedule 28.12.2019
comment
До affected_rows условной попытки printf("Error: %s.\n", $stmt->error);. Кроме того, это будет отправка 2 электронных писем, это предназначено?   -  person user3783243    schedule 28.12.2019
comment
Я вставил printf("Error: %s.\n", $stmt->error);, и он показывает ошибку на странице Ошибка: поле «id» не имеет значения по умолчанию. Была допущена ошибка. Также не следует отправлять только одно электронное письмо, я предполагаю, что это потому, что у меня есть две почтовые строки в коде? if(mail($email, $url, $from)){' and '$mail=mail($to,$subject,$message,$headers);   -  person Ian Haney    schedule 28.12.2019
comment
Да, это правильно. Таким образом, похоже, что lost_password необходимо обновить свою схему, поэтому id автоматически увеличивается.   -  person user3783243    schedule 28.12.2019
comment
Теперь я сделал автоматическое увеличение идентификатора, но теперь, когда я снова отправил форму о забытом пароле, я получаю сообщение об ошибке Ошибка: неверное целочисленное значение: «bbd13c969f1b23c6709fa43dcbc4dc45b8365749194e13da46e8a750ebb0f6bd8e5aa73ec29cd3a631acf2b'1b' для столбца строки, отображаемого на странице с ошибкой.   -  person Ian Haney    schedule 28.12.2019
comment
Извините, я забыл сделать токен VARCHAR вместо INT таким образом отсортированным, что теперь и в сообщении теперь говорится, что электронное письмо было отправлено, но не получено, это связано с наличием двух строк почты?   -  person Ian Haney    schedule 28.12.2019
comment
Электронная почта, которая не отправляется, может быть большим количеством проблем, и это совсем другой вопрос. if(mail($email, $url, $from)){ следует удалить. Посмотрите, что такое $mail. stackoverflow.com/questions/4633227/why-mail-fails -in-php Обычно я использую swift или phpmailer, встроенная функция не самая лучшая stackoverflow.com/questions/5335273/   -  person user3783243    schedule 28.12.2019
comment
Я удалил строку if(mail($email, $url, $from)){, и, судя по тому, что я вижу, почтовая кодировка выглядит нормально, но электронная почта все еще не приходит? Я предпочитаю использовать почту, а не phpmailer, и почтовый код работает на моей странице регистрации, поэтому я пытаюсь сравнить два   -  person Ian Haney    schedule 28.12.2019
comment
Одна из причин использования phpmailer/switfmailer вместо mail() заключается в том, что они более переносимы, поскольку не зависят от каких-либо конкретных конфигураций сервера. Они также значительно упрощают создание электронных писем в формате HTML и использование надлежащего SMTP (что настоятельно рекомендуется).   -  person Magnus Eriksson    schedule 28.12.2019


Ответы (1)


Если вы работаете на локальном сервере, произойдет ошибка. Вы проверили это на живом сервере? Если нет, проверьте это на живом сервере.

ИЛИ

Вместо использования функции mail() используйте PHPMailer

person Nafish Ahmed    schedule 28.12.2019
comment
Да, я использую его на живом сервере, так как знаю, что на локальном сервере он не будет работать, я думаю, мне нужно взглянуть на phpmailer, как уже упоминалось. - person Ian Haney; 28.12.2019