使用SELECT获取正确的行,在PDO中获得零行

时间:2014-09-27 00:59:06

标签: php mysql rest 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;
        }

我试图通过不同的方式获取查询,但没有人解决我的问题。

Pd积。成功标志着我是真的,因为查询的执行是成功的,但我得到null(我为我正在创建的数组创建了一个print_r(),我得到的所有数组的值都为null)。

感谢您的时间。干杯!

2 个答案:

答案 0 :(得分: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);

打开数据库连接后立即。

答案 1 :(得分: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
  • 的原因来改善这一点
  • 您可以将连接设为属性或函数的参数
  • 你应该哈希密码

还有更多,祝你好运!