2015-01-11 5 views
0

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

Чтобы узнать реальную ошибку, вы должны использовать 'эхо mysqli_error ($ db_server);' вместо вашей 'Ошибка: не удалось подключиться ...' пользовательское сообщение. –

+0

Я предполагаю, что это потому, что имя пользователя '$ _SESSION ['username']' не окружено одинарными кавычками как строка SQL в этом запросе ... –

+1

Строки должны быть в кавычках. Также почему вы храните открытый пароль? –

ответ

0

Исходная проблема вы столкнулись является тот факт, что значения строки SQL для $_SESSION['username'] и $newpass не были должным образом одиночные кавычки в Строки SQL. Для прогона, когда и как цитировать внутри операторов SQL, посмотрите на When to use single quotes, double quotes, backticks in 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 
    } 
} 

Это может быть дополнительно улучшено using prepared statements. Ваш хешированный пароль должен быть безопасным от SQL-инъекции, but it is highly recommended to get into the habit of using prepared statements, поскольку они необходимы для других случаев, когда строки производятся непосредственно из пользовательского ввода, чтобы обеспечить достаточную защиту от 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

Спасибо! Сейчас все работает –

Смежные вопросы