我是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。
感谢分配。
答案 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至少是一个很好的测试点。