【问题标题】:Getting correct row with SELECT, getting zero rows in PDO使用 SELECT 获得正确的行,在 PDO 中获得零行
【发布时间】:2014-11-22 02:20:00
【问题描述】:

我有一个严重的问题

我正在使用 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 中执行它时,我得到了 null。

这是我的代码

    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,因为查询的执行成功,但是我得到了 null(我为我正在创建的数组创建了一个 print_r(),并且我得到了所有值为 null 的数组)。

感谢您的宝贵时间。干杯!

【问题讨论】:

    标签: php mysql rest select pdo


    【解决方案1】:

    删除':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);
    

    在数据库连接打开之后。

    【讨论】:

    • 我的天啊...也就是说,在我的查询中添加的引号...我感到很尴尬,因为我的问题的根源很单一。
    • @CarlosGarnicaJr。很高兴我能帮上忙,欢呼卡洛斯
    【解决方案2】:

    除了@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 的原因来改进这一点
    • 您可以将连接设为函数的属性或参数
    • 你应该散列密码

    还有更多,祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      相关资源
      最近更新 更多