2014-09-27 23 views
0

我有一个严重的问题使用SELECT获取正确的行,在PDO中获得零行数

我使用PHP安装了REST API。所以,我有一个名为“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; 
     } 

我试图获取由不同的方式查询,但没有一个解决我的问题。

P.D. Sucess将我标记为true,因为查询的执行已成功完成,但我得到空(我为我创建的数组创建了一个print_r(),并且我将所有数组的值都设为null)。

谢谢你的时间。干杯!

回答

3

各地':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); 

数据库连接被打开之后。

+0

噢,我的上帝......那是,在我的查询中添加了引号......我感到尴尬,因为我的问题的起源非常单一。 – 2014-09-27 18:44:08

+0

@CarlosGarnicaJr。很高兴我能够帮助,*欢呼卡洛斯* – 2014-09-27 21:45:45

0

除了@fred指出的引用内容外,对于BindColumn,您需要使用PDO::FETCH_BOUND,但为什么您需要使用BindColumn()呢?

我明白bindColumn是获取一种方式,但我不会建议使用它,因为它是非常混乱拆分结果集,它只是奇怪。

唯一有用的情况下,我能想到的是,如果你想那么也许重命名低劣的列名。

我建议你像其他人不这样做,并使用bindValueexecute直接


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的原因改善这种
  • 可以使连接属性或函数的参数
  • 您应该散列密码

以及更多,祝你好运!