首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDOStatement PHP MSSQL Select if result?

PDOStatement PHP MSSQL Select if result?
EN

Stack Overflow用户
提问于 2013-06-14 10:36:38
回答 1查看 160关注 0票数 0

我很难做到这一点,如果我的select语句找到一个记录,我会尝试返回1或true。我正在使用MSSQL Server和PHP与PDO,因为它的安全性。我知道fetchColumn()不是正确的语句,但这就是我放弃的地方,因为我尝试了几乎所有其他方法。

这是我的代码。

代码语言:javascript
复制
public function activate($email, $email_code) {
        $query = $this->db->prepare("SELECT * FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

        $query->bindValue(1, $email);
        $query->bindValue(2, $email_code);
        $query->bindValue(3, 0);

        try{

            $query->execute();
            $rows = $query->fetchColumn();// HERE I AM NOT SURE WHAT TO USE ??? HELP!
            if($rows == 1){


                $query_2 = $this->db->prepare("UPDATE users SET confirmed =? WHERE email = ?");
                $query_2->bindValue(1, 1);
                $query_2->bindValue(2, $email);             

                $query_2->execute();
                return true;

            }else{
                return false;
            }

        } 
            catch(PDOException $e){
            die($e->getMessage());
        }

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-14 10:49:03

您当前代码的问题(除了在参数占位符两边使用引号)是,fetchColumn()会得到结果集中第一列的值,可能是某种id,而这个值并不全等于1。这就是为什么您总是得到false。

您可以通过使用rowCount()而不是fetchColumn()来解决这个问题

代码语言:javascript
复制
$rows = $query->rowCount();

现在,要检查行是否存在,您不需要实际检索包含所有列的结果集。只需使用 COUNT(*).即可它将返回一行,其中恰好包含一列,您可以使用fetchColumn()获得该列的值

试着改变

代码语言:javascript
复制
$query = $this->db->prepare("SELECT * FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

代码语言:javascript
复制
$query = $this->db->prepare("SELECT COUNT(*) FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

代码语言:javascript
复制
if($rows == 1){

to (只是为了安全起见,如果出于某种原因有重复的话)

代码语言:javascript
复制
if($rows > 0) {

更新

由于rowCount()返回受UPDATE影响的行数,因此函数的更简洁版本可能如下所示

代码语言:javascript
复制
public function activate($email, $email_code) {
    $sql = 'UPDATE users 
              SET confirmed = 1 
            WHERE email = ?
              AND email_code = ?
              AND confirmed = 0';

    $rows = 0;

    try{
        $query = $this->db->prepare($sql);

        $query->bindValue(1, $email);
        $query->bindValue(2, $email_code);

        $query->execute();
        $rows = $query->rowCount();
        $query = null;
    } catch(PDOException $e) {
        die($e->getMessage());
    }
    return ($rows > 0);
}

注意:您不需要为confirmed列绑定像01这样的静态值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17100275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档