【问题标题】:PHP PDO why select only first row in Database table?PHP PDO 为什么只选择数据库表中的第一行?
【发布时间】:2013-10-05 04:04:33
【问题描述】:

我是 PDO 新手,我不明白为什么我只能选择数据库表中的第一行。

这是我的数据库表:

    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 这么好所以没关系..

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

感谢分配。

【问题讨论】:

  • 尝试读取documentation从结果集的下一行返回单列,如果没有更多行,则返回 FALSE。 如果您想获取多行,你必须多次调用它。
  • @Your Common Sense, Yeaafcours,如果你不喜欢请不要评论,我做测试,问题来自 PDO / SQL 查询我不确定是哪一个,它只会选择从第一行开始。
  • @Barmar,谢谢,我会阅读并尝试。
  • @Barmar ,我的代码使用与 PHP 文档中相同的正确方式。它仍然只从数据库表中选择第一行。可能是数据库表属性错误?
  • 不清楚你的函数应该如何处理多行。如果其中一个包含 1,另一个包含 -1,函数应该返回 TRIPLET_FOUND 还是 TRIPLET_INVALID

标签: php mysql pdo


【解决方案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(?)";

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

【讨论】:

  • 谢谢,但我尝试的第一件事是:删除 LIMIT 1 ,它不起作用。
  • Barmar 在上面提到您面临的 fetchcolumn 问题时是正确的。您需要使用替代的 $query->fetch 命令 (php.net/manual/en/pdostatement.fetch.php) 或指定 fetchColumn 要返回的列数。
猜你喜欢
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多