PDOStatement PHP MSSQL选择结果


PDOStatement PHP MSSQL Select if result?

我有一个艰难的时间,并试图返回1或true,如果我的选择语句找到一个记录。由于其安全性,我正在使用MSSQL服务器和PHP与PDO一起工作。我知道fetchColumn()不是正确的语句,但这就是我放弃的地方,因为我几乎尝试了所有其他方法。

这是我的代码。

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());
        }
    }

当前代码的问题(除了在参数占位符周围使用引号)是fetchColumn()使您获得结果集中第一列的值,这可能是某种id,该值不等于1。这就是为什么你总是得到错误的。

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

$rows = $query->rowCount();

现在,要检查一行是否存在,您不需要实际检索包含所有列的结果集。只使用COUNT(*) 。它将返回一行,其中只有一列,稍后使用fetchColumn()

获得该值。

尝试更改

$query = $this->db->prepare("SELECT * FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

$query = $this->db->prepare("SELECT COUNT(*) FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

if($rows == 1){

(为了安全,如果因为某些原因有重复)

if($rows > 0) {

:

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

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等静态值