Параметр ошибки PDO не был определен, хотя я определил и привязал этот параметр

Я пытаюсь преобразовать этот сценарий входа из mySql в PDO, и оператор SELECT отлично работает для имени пользователя, но не для пароля.

Отображается сообщение об ошибке "SQLSTATE[HY093]: Invalid parameter number: parameter was not defined". Нужно ли мне по-другому привязывать $hashedPassword для этого оператора?

<?php
session_start(); 
//Include database connection details & salt
$password = $_POST['password'];  
$hashedPassword = sha1($salt . $password); 

try {  
   $stmt_user = $conn->prepare("SELECT * FROM customer_info WHERE user_name = :user_name and password = :hashedPassword");      

   $stmt_user->bindValue(':user_name', $_POST['user_name'], PDO::PARAM_STR); 
   $stmt_user->bindValue(':password', $hashedPassword);     
   $stmt_user->execute();                 
   session_regenerate_id();                       
   $member = $stmt_user->fetch();
   $_SESSION['SESS_USER_ID'] = $member['user_id'];                    
   session_write_close();
   header("location: launch_member_account.php");
   exit();
}catch(PDOException $e) {
 echo $e->getMessage();
}    
?>        

person Chaya Cooper    schedule 01.01.2013    source источник
comment
Оператор определяет параметр :hashedPassword, но связывает :password в вызове bindValue(). Просто измените один или другой из них, чтобы они совпадали. Это моя вина из комментария к вашему предыдущему вопросу.   -  person Michael Berkowski    schedule 01.01.2013
comment
Это помогло :-D Из любопытства, должен ли я изменить способ привязки в своих операторах INSERT/UPDATE? Я не получал сообщения об ошибке, используя bindValue(':password', $hashedPassword) для тех   -  person Chaya Cooper    schedule 01.01.2013
comment
Нет, их имена :password, :hashedPasswod, :username, :whatever не имеют значения, если они совпадают в операторе SQL и вызове bindValue()/bindParam(). Если они работают, оставь их.   -  person Michael Berkowski    schedule 01.01.2013
comment
Полезно знать :-D Если вы хотите перевести это на ответ, я соглашусь ;-)   -  person Chaya Cooper    schedule 01.01.2013


Ответы (1)


Оператор определяет параметр с именем :hashedPassword, но вызов bindValue() использует неизвестный параметр с именем :password.

$stmt_user = $conn->prepare("SELECT * FROM customer_info WHERE user_name = :user_name and password = :hashedPassword");      
//---------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^
// Change this to match the statement.
$stmt_user->bindValue(':hashedPassword', $hashedPassword);

Неважно, как названы параметры, если они совпадают, поэтому лучше просто сделать их согласованными во всем приложении.

person Michael Berkowski    schedule 01.01.2013