2013-07-17 5 views
0

У меня проблема с запросом. Я запрос из одной таблицы, используя следующий процесс (с помощью PHP PDO и MySQL):Ошибка соединения с запросом MySQL

Построить строку запроса $ SQL:

SELECT * 
FROM `user` 
WHERE (`username`=:username OR `email`=:username) 
     AND `password`=:password AND `valid`='1'; 

И с помощью этого массива $ Params:

Params 
(
    [:password] => 18155dbf12503d726883784d1d9755f8d3382ba7 
    [:username] => [email protected] 
) 

вызовов эта функция:

$results_array = $database->QueryForObject($sql, $params); 

public function QueryForObject($query, $binds) 
{ 
    $stmt = $this->db->prepare($query); 

    foreach($binds as $bindKey => &$key) 
    { 
     $stmt->bindParam($bindKey, $key, PDO::PARAM_STR); 
    } 

    return $this->RunObjectQuery($stmt, NULL , "stdClass"); 
} 

Моя проблема заключается в том, что имя пользователя может быть НЕВЫП lete или даже отсутствует, и все, что он использует, чтобы найти пользователя - это пароль ... Я уверен, что он не должен этого делать, но я не могу понять, почему.

Как примечание стороны, здесь есть описание моей таблицы:

Field   , Type           , Null ,Key ,Default , Extra 
id    , int(10) unsigned        , NO ,PRI ,NULL  auto_increment 
username   , varchar(30)         , NO ,UNI ,NULL      
email   , varchar(50)         , NO ,  ,NULL      
password   , varchar(100)         , NO ,  ,NULL      
first_name  , varchar(30)         , NO ,  ,NULL      
last_name  , varchar(30)         , NO ,  ,NULL      
rights   , enum('normal','medium','high','admin','super') , NO ,  ,NULL      
last_loggedin , timestamp          , YES ,  ,NULL      
status   , enum('current','expired','temporary')   , NO ,  ,NULL      
valid   , tinyint(1)          , NO ,  ,NULL      
other_comments , varchar(500)         , YES ,  ,NULL      
gender   , enum('male','female')       , YES ,  ,NULL      
company_position , varchar(50)         , YES ,  , NULL 

Любые предложения приветствуются !!

+2

У вас есть строки с пустым адресом электронной почты? – jcsanyi

+0

Ваш адрес электронной почты не будет отправлен, так что будут возвращены любые пустые записи адресов электронной почты. – DevZer0

+0

«Имя пользователя» может быть либо фактическим именем пользователя, либо электронной почтой, поэтому избыточное: имя пользователя было специально. Он представляет собой то, что пользователь использует для заполнения поля ввода имени пользователя. – Jonathan

ответ

1

Это не окончательный ответ, но я считаю, что я помню ошибку с PDO и именами параметров привязки с тем же именем, что и параметр связывания, появляющийся более одного раза. (Когда мы посмотрели на него, это выглядело так, как именованные аргументы переводились в позиционные аргументы, а bind_param устанавливал только один из аргументов.

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

в вашем случае, вы можете попробовать (как тест) модификация SQL так, что он имеет только два названных параметры связывания, например

SELECT * 
    FROM `user` 
WHERE :username IN (`username`,`email`) 
    AND `password`=:password AND `valid`='1'; 

Другой альтернативой является создание третьего именованного аргумента, и для отдельного значения привязки для третьего параметра.

Это не окончательный ответ, просто предложение о подходе, который может позволить вам отладить эту проблему.

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

+0

Хм, оба были хорошими идеями! Они, похоже, пока не рассматривают этот вопрос, но я буду продолжать экспериментировать. Спасибо за ваши предложения! ** РЕДАКТИРОВАТЬ ** Nevermind !! Я оставил избыточную 'print_r(); exit; 'statment in while, когда я добавлял ваши предложенные изменения. Я взял его, и ваши предложения работали! – Jonathan

+0

Большое спасибо! – Jonathan

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