Разрешить пользователю сменить пароль
Я пытаюсь разрешить зарегистрированным пользователям моего сайта изменять свой пароль, который затем будет обновляться в моей базе данных. Когда я нажимаю кнопку отправки, я получаю "Неизвестный столбец" [имя пользователя] в "предложении где". Я пробовал несколько вещей, и я не могу заставить его работать. Я новичок в 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>
1 ответ
Первоначальная проблема, с которой вы сталкиваетесь, заключается в том, что строковые значения 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);