-4

私は PDO の初心者ですが、データベースのテーブルの最初の行しか選択できない理由がわかりません。

これは私のデータベース 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がそれほど優れていることを知らないので、問題ではありません..

私はそれで遊んでみましたが、成功しませんでした..findTriplet関数の私の問題と私が間違っていることを知っている人はいますか? 最初のデータベース行のみが選択されるため、複数の行がある場合は false が返されます。

ありがとうございます。

4

1 に答える 1

-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 を削除することは、少なくとも良いテスト ポイントになります。

于 2013-09-29T05:45:10.257 に答える