PHP PDO为什么只选择Database表中的第一行?

时间:2013-09-29 05:35:29

标签: php mysql pdo

我是PDO新手,我无法理解为什么我只能选择数据库中Table的第一行。

这是我的DataBase TABLE:

    Column  Type    Null    Default     Comments
    id  int(11) No       
    cred    varchar(20) No       
    tok     char(40)    No       
    ptok    char(40)    No       
    t   char(128)   No       
    expires     varchar(26) No       
    Indexes
    Keyname Type    Unique  Packed  Column  Cardinality Collation   Null    Comment
    PRIMARY BTREE   Yes No  id  1   A   No  
    ptok    BTREE   Yes No  ptok    1   A   No  

这是我的SELECT(查找)功能:

 public function findTriplet($credential,$token, $persistentToken) {

    $sql = "SELECT IF(SHA1(?) = {$this->tokenColumn}, 1, -1) AS token_match " .
           "FROM {$this->tableName} WHERE {$this->credentialColumn} = ? " .
           "AND {$this->persistentTokenColumn} = SHA1(?) LIMIT 1 ";

    $query = $this->connection->prepare($sql);

    $query->execute(array($token, $credential, $persistentToken));

    $result = $query->fetchColumn();

    if(!$result) {
      return self::TRIPLET_NOT_FOUND;
    }
    elseif ($result == 1) {
      return self::TRIPLET_FOUND;
    }
    else {
      return self::TRIPLET_INVALID;
    }
  }

无论如何我试图寻找答案,但我不知道PDO这么好所以它无关紧要..

我试着玩那个,没有succses .. 任何人都知道我在findTriplet函数中的问题是什么以及我做错了什么? 它只会选择第一个数据库行,所以如果我有超过1行,它将返回false。

感谢分配。

1 个答案:

答案 0 :(得分:-1)

从变量中删除“LIMIT 1”并查看结果是否发生变化:

$sql = "SELECT IF(SHA1(?) = {$this->tokenColumn}, 1, -1) AS token_match " .
       "FROM {$this->tableName} WHERE {$this->credentialColumn} = ? " .
       "AND {$this->persistentTokenColumn} = SHA1(?) LIMIT 1 ";

变为:

$sql = "SELECT IF(SHA1(?) = {$this->tokenColumn}, 1, -1) AS token_match " .
           "FROM {$this->tableName} WHERE {$this->credentialColumn} = ? " .
           "AND {$this->persistentTokenColumn} = SHA1(?)";

您似乎正在检索匹配,因此您看到的是单个结果。我不确定应用程序,但您可能希望在SQL语句中保留限制。删除LIMIT至少是一个很好的测试点。