Возникла проблема с установкой переменной в качестве значения $ _GET - PullRequest
0 голосов
/ 05 октября 2018

Просто разбираюсь с SQL и PHP и пытаюсь создать простую систему учетных записей пользователей - по электронной почте с забытым паролем.

У меня есть скрипт ниже, который я пытаюсь использовать для обновления пароляПользователь.Они получают электронное письмо со ссылкой.Ссылка выглядит так: http://localhost:8887/email-password-reset.php?id=1.

Я знаю, что это небезопасно и легко взломать!Я планирую использовать случайно сгенерированную строку чисел, как только у меня получится!

Я пытаюсь использовать функцию $_GET, чтобы получить id.Однако я не верю, что $_GET["id"] передается в переменную $param_id.

Я новичок в этом, поэтому не знаю, как это исправить!

Как я могу получить этот параметр, устанавливающий param_id в значение $_GET?

По крайней мере, я думаю, что проблема связана с ошибкой в ​​консоли (Undefined variable: param_id!) Заранее спасибо!

<?php
//session_start();
require_once "config.php";

// Define variables and initialize with empty values
$new_password = $confirm_password = "";
$new_password_err = $confirm_password_err = "";
$param_id = ''; 

// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){

    // Validate new password
    if(empty(trim($_POST["new_password"]))){
        $new_password_err = "Please enter the new password.";
    } elseif(strlen(trim($_POST["new_password"])) < 6){
        $new_password_err = "Password must have atleast 6 characters.";
    } else{
        $new_password = trim($_POST["new_password"]);
    }

    // Validate confirm password
    if(empty(trim($_POST["confirm_password"]))){
        $confirm_password_err = "Please confirm the password.";
    } else{
        $confirm_password = trim($_POST["confirm_password"]);
        if(empty($new_password_err) && ($new_password != $confirm_password)){
            $confirm_password_err = "Password did not match.";
        }
    }

    // Check input errors before updating the database
    if(empty($new_password_err) && empty($confirm_password_err)){
        // Prepare an update statement
        $sql = "UPDATE users SET password = ? WHERE id = ?";

        if($stmt = mysqli_prepare($link, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "si", $param_password, $param_id);

            // Set parameters
            $param_password = password_hash($new_password, PASSWORD_DEFAULT);
            $param_id = (isset($_GET['id']) ? $_GET['id'] : '');


            // Attempt to execute the prepared statement
            if(mysqli_stmt_execute($stmt)){
                // Password updated successfully. Destroy the session, and redirect to login page
                session_destroy();
                header("location: login.php");
                exit();
            } else{
                echo "Oops! Something went wrong. Please try again later.";
            }
        }

        // Close statement
        mysqli_stmt_close($stmt);
    }

    // Close connection
    mysqli_close($link);
}
?>

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Они получают электронное письмо со ссылкой.Ссылка выглядит следующим образом:

<a href="http://localhost:8887/email-password-reset.php?id=1" rel="nofollow noreferrer">http://localhost:8887/email-password-reset.php?id=1</a>

Я предполагаю, что если пользователь щелкнет ссылку, появится форма "новый пароль".Затем форма отправляет данные по некоторому URL-адресу, содержащему используемый вами текст.Чтобы использовать $_GET['id'], вам нужно убедиться, что URL-адрес в форме (возможно, выглядит как action="http://localhost:8887/process.php") имеет параметр GET.Так что это будет выглядеть как action="http://localhost:8887/process.php?id=1"И ошибка Undefined variable: param_id! заключается в том, что вы используете param_id, прежде чем объявить его.Итак, предположим, что выглядит так:

if($stmt = mysqli_prepare($link, $sql)){

  // Set parameters
  $param_password = password_hash($new_password, PASSWORD_DEFAULT);
  $param_id = (isset($_GET['id']) ? $_GET['id'] : '');

  // Bind variables to the prepared statement as parameters
  mysqli_stmt_bind_param($stmt, "si", $param_password, $param_id);

  // Attempt to execute the prepared statement
  if(mysqli_stmt_execute($stmt)){
     // Password updated successfully. Destroy the session, and redirect to login page
     session_destroy();
     header("location: login.php");
     exit();
  } else{
     echo "Oops! Something went wrong. Please try again later.";
  }
0 голосов
/ 05 октября 2018

Краткий взгляд:

Это входит в ваш if только если это тип POST, по определению это будет тип GET.Возможно, вам придется удалить / изменить это.

Во-вторых, вы строите запрос, используя $param_id, прежде чем назначить $param_id для переменной GET.

Если единственное местои, похоже, вы устанавливаете $param_id, почему бы просто не объявить его в первой строке, где вы объявите его как ''?

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