Получение правильной строки с помощью SELECT, получение нулевых строк в PDO

У меня серьезная проблема

Я монтирую REST API с помощью PHP. Итак, у меня есть контроллер под названием «Checkestablishment» (он будет проверять имя пользователя и пароль из базы данных).

У меня следующий запрос

SELECT table_users.ID, table_users.FirstName, table_users.LastName, table_users.ZIP,     table_users.State, table_users.Country, table_users.Email, table_users.Birthday
FROM table_users, table_user_credentials
WHERE table_user_credentials.User = table_users.ID
AND table_user_credentials.Username = 'someuser'
AND table_user_credentials.Pass = 'somepass'

И это прекрасно работает, MySQL получает мне нужную строку.

Но когда я пытаюсь выполнить это в PDO, я получаю нулевое значение.

Это мой код

    public function add()
{
global $counect;
$i = 0;
$Query_CheckCredential = "SELECT table_users.ID, table_users.FirstName, table_users.LastName, table_users.ZIP,     table_users.State, table_users.Country, table_users.Email, table_users.Birthday
FROM table_users, table_user_credentials
WHERE table_user_credentials.User = table_users.ID
AND table_user_credentials.Username = ':Est_User'
AND table_user_credentials.Pass = ':Est_Pass'";
$PS_CheckCredential = $counect->prepare($Query_CheckCredential);
$Sucess = $PS_CheckCredential -> execute(array(
':Est_User'=>$this->str_User,
':Est_Pass'=>$this->str_Pass
));
if($Sucess)
{
$PS_CheckCredential -> bindColumn(1, $User_ID);
$PS_CheckCredential -> bindColumn(2, $User_FirstName);
$PS_CheckCredential -> bindColumn(3, $User_LastName);
$PS_CheckCredential -> bindColumn(4, $User_ZIP);
$PS_CheckCredential -> bindColumn(5, $User_State);
$PS_CheckCredential -> bindColumn(6, $User_Country);
$PS_CheckCredential -> bindColumn(7, $User_Email);
$PS_CheckCredential -> bindColumn(8, $User_Birthday);
//$PS_CheckCredential -> setFetchMode(PDO::FETCH_ASSOC);

$Array_Est_Keys = array('ID', 'FirstName', 'LastName', 'ZIP', 'State', 'Country', 'Email', 'Birthday');

$Array_Est_Keys = array_fill_keys($Array_Est_Keys, '');

do
{
$Array_User['ID'] = $row['ID'];
$Array_User['FirstName'] = $User_FirstName;
$Array_User['LastName'] = $User_LastName;
$Array_User['ZIP']  = $User_ZIP;
$Array_User['State'] = $User_State;
$Array_User['Country'] = $User_Country;
$Array_User['Email'] = $User_Email;
$Array_User['Birthday'] = $User_Birthday;
}
while($row = $PS_CheckCredential->fetch(PDO::FETCH_ASSOC));
if(empty($Array_User))
{
return false;
}
else
{
return $Array_User;
}
}
else
{
echo "No luck";
//return false;
}

Я пытался получить запрос разными способами, но никто не решил мою проблему.

Полицейское управление Sucess помечает меня как true, потому что выполнение запроса было успешно, но я получаю значение null (я сделал print_r () для массива, который я создаю, и я получаю весь массив со значениями в null).

Спасибо за ваше время. Ура!

0

Решение

Удалить цитаты вокруг ':Est_User'
в AND table_user_credentials.Username = ':Est_User'

и вокруг ':Est_Pass' в AND table_user_credentials.Pass = ':Est_Pass'

Эти привязки в запросе SELECT не должны содержать кавычек.

Если бы проверил ошибки, это бы сигнализировало.

Такие как:

$counect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

сразу после подключения к БД.

3

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

В дополнение к тому, что @fred указал на цитаты, для BindColumn вам нужно использовать PDO::FETCH_BOUND но зачем тебе пользоваться BindColumn() совсем?

я понимаю bindColumn это способ получить, но я бы не рекомендовал использовать его, потому что разбивать результирующие наборы очень сложно, это просто странно.

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

Я предлагаю вам сделать это, как все, и использовать bindValue или же execute непосредственно


public function add()
{
global $counect;
$sql = "SELECT table_users.ID
, table_users.FirstName
, table_users.LastName
, table_users.ZIP
, table_users.State
, table_users.Country
, table_users.Email
, table_users.Birthday
FROM table_users, table_user_credentials
WHERE table_user_credentials.User = table_users.ID
AND table_user_credentials.Username = :Est_User
AND table_user_credentials.Pass = :Est_Pass";
$stmt = $counect->prepare($sql);
$success = $stmt-> execute(array(':Est_User'=>$this->str_User,
':Est_Pass'=>$this->str_Pass
));
if($success){
//query success!
if($row = $stmt->fetch(PDO::FETCH_ASSOC)){
//user found return data
return $row;
}else{
//user not found
return false;
}
}else{
//query failed!
var_dump($stmt->error);
return false;
}
}
  • Вы все еще можете улучшить это, получив причину, по которой он возвращает false
  • Вы можете сделать соединение свойством или аргументом функции
  • Вы должны хешировать пароль

и многое другое, удачи!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector