Разрешить пользователю сменить пароль

Я пытаюсь разрешить зарегистрированным пользователям моего сайта изменить свой пароль, который затем будет обновлен в моей базе данных. Когда я нажимаю кнопку отправки, я получаю «Неизвестный столбец» [имя пользователя] в «предложении где». Я пробовал несколько вещей, и я не могу заставить его работать. Я новичок в PHP, поэтому у меня нет обширного набора навыков, поэтому я не уверен, в чем может быть проблема. Если бы кто-нибудь мог мне помочь, я был бы благодарен, спасибо.

<?php
session_start();require_once ("db_connect.php");
require_once($_SERVER['DOCUMENT_ROOT'] . '/functions/functions.php');$oldpw = ($_POST['oldpw']);
$newpw = ($_POST['newpw']);
$conpw = ($_POST['conpw']);
$currentpw = $_SESSION['password'];

if ($_POST['change'] == 'Change') {
if ($oldpw && $newpw && $conpw) {
if ($newpw == $conpw) {
if ($db_server){
mysqli_select_db($db_server, $db_database);
$oldpw = salt($currentpw);
// check whether username exists
$query = "SELECT password FROM users WHERE 'username'= '" . $_SESSION['username'] . "'";
$result = mysqli_query($db_server, $query);
if(!$result){
$message = "<p class='message'>Error: Coud not connect to the database.</p>" ;
}else{
$newpw = salt($newpw);
$query = "UPDATE users SET password = '$newpw' WHERE username = " . $_SESSION['username'] . "";
mysqli_query($db_server, $query) or
die("Insert failed. " . mysqli_error($db_server));
$message = "<p class='message'>Your password has been changed!</p>";
// Process further here
mysqli_free_result($result);
}
}else{
$message = " <p class='message'>Your current password is incorrect.</p>";
}
}else{
$message = "<p class='message'>Your new passwords do not match.</p>";
}
}else{
$message = "<p class='message'>Please fill in all fields.</p>";
}
}
?>

Это HTML, который я использовал:

<form action='change-password.php' method='post' id="register-form">
<?php echo $message; ?>
<input class="password-field" type='password' name='oldpw' value='<?php echo $username; ?>' placeholder="Current Password"><br />
<input  class="password-field" type='password' name='newpw' placeholder="New Password"><br />
<input class="password-field" type='password' name='conpw' placeholder="Confrim Password">
<input class="button" type='submit' name='change' value='Change' />
</form>

0

Решение

Первоначальная проблема, с которой вы сталкиваетесь, заключается в том, что строковые значения SQL для $_SESSION['username'] а также $newpass не были должным образом заключены в одинарные кавычки в строках SQL. Чтобы узнать, когда и как заключать в кавычки внутри операторов SQL, взгляните на Когда использовать одинарные кавычки, двойные кавычки, обратные кавычки в MySQL.

Включайте отчеты об ошибках, всегда при разработке кода. В верхней части вашего сценария:

// Disable this when your code is live...
error_reporting(E_ALL);
ini_set('display_errors', 1);

Таким образом, используя ваш текущий код, цитируя строки но не имена столбцов появится как показано ниже.

$oldpw = salt($currentpw);

// check whether username exists
$query = "SELECT password FROM users WHERE username= '" . $_SESSION['username'] . "' AND password='$oldpw'";
//----------------------------------no quotes^^^^^^^--single-quotes^^^^^^^^^^^^^^^^
// Also adds a check that $oldpass is correct!

$result = mysqli_query($db_server, $query);
if(!$result){
// This is ambiguous. It should probably show an error related to the query, not connection
$message = "<p class='message'>Error: Coud not connect to the database.</p>" ;
}else{
// This should only be done if a row was returned previously
// Test with mysqli_num_rows()
if (mysqli_num_rows($result) > 0) {
$newpw = salt($newpw);

// Adds single quotes to the username here too...
$query = "UPDATE users SET password = '$newpw' WHERE username = '" . $_SESSION['username'] . "'";
mysqli_query($db_server, $query) or
die("Insert failed. " . mysqli_error($db_server));
$message = "<p class='message'>Your password has been changed!</p>";
// Process further here
mysqli_free_result($result);
}
else {
// Username or password was incorrect - do something about that
}
}

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

Это будет выглядеть так:

// Prepare the select statement to check username and old password
$stmt = mysqli_prepare($db_server, "SELECT password FROM users WHERE username = ? AND passowrd = ?");
if ($stmt) {
// Bind parameters and execute it
$stmt->bind_param('ss', $_SESSION['username'], $oldpw);
$stmt->execute();

// num_rows works here too...
if ($stmt->num_rows > 0) {
// Ok to update...
// Prepare another statement for UPDATE
$stmt2 = mysqli_prepare($db_server, "UPDATE users SET password = ? WHERE username = ?");
if ($stmt2) {
// Bind and execute
$stmt2->bind_param('ss', $newpass, $_SESSION['username']);
$stmt->execute();
}
// Error updating
else echo mysqli_error($db_server);
}
}
// Error selecting
else echo mysqli_error($db_server);
0

Другие решения

Других решений пока нет …