Php 奇怪的PDO行为

Php 奇怪的PDO行为,php,pdo,Php,Pdo,几个小时后,我不得不发布这个问题,即使答案可能对其他人来说很明显 问题是我想测试令牌,但即使我硬编码了它,我仍然会得到无效的结果。我知道它必须是正确的,因为我直接在PHPADMIN中测试了它。奇怪的是,它总是第一次通过(没有硬编码),但在那之后它就没用了? 令牌从cookie中检索 public function findTriplet($credential, $token, $persistentToken) { $token = "459078a3b05ce938ed58f967

几个小时后,我不得不发布这个问题,即使答案可能对其他人来说很明显

问题是我想测试令牌,但即使我硬编码了它,我仍然会得到无效的结果。我知道它必须是正确的,因为我直接在PHPADMIN中测试了它。奇怪的是,它总是第一次通过(没有硬编码),但在那之后它就没用了? 令牌从cookie中检索

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

    $token = "459078a3b05ce938ed58f9678ac78f1agcgfsewe4";
    $persistentToken = "24d317b742da89ddf5b8ed50993d0f3cgcgfsewe4";
    $credential ="34";
    $q = "SELECT IF(SHA1(?) = {$this->tokenColumn}, 1, -1) AS token_match " .
         "FROM {$this->tableName} WHERE {$this->credentialColumn} = ? " .
         "AND {$this->persistentTokenColumn} = SHA1(?) LIMIT 1 ";
    $query = $this->db->prepare($q);
    $query->execute(array($token, $credential, $persistentToken));
    $result = $query->fetchColumn();

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

limit子句总是捕获它找到的第一行,因此 总是会出现不匹配,现在我必须解决这个问题


解决办法很简单。删除插入带有新生成令牌的新行之前刚刚验证的条目。新行应包含与刚才验证的persistenceToken相同的内容。请记住,这仍然是不安全的,因此请在服务器端设置一个标志,表明这是cookielogin,并需要真正的登录才能处理重要数据。

如果检查顺序错误,我认为您的

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

在SQL中,1表示已找到,-1表示未找到,其他任何内容都将无效。但是在PHP中,a-1将落入
else
子句,并返回
self::TRIPLET\u INVALID
,而无效结果将落入
if(!$result)
并返回
self::TRIPLET\u NOT\u FOUND

我猜
$result];
是一个复制粘贴错误?(语法错误)像这样的东西只能通过调试来分类——系统地分析代码所做的每一步、显示的值和发送的查询。这是每个程序的标准费用。我如何调试它?好的,我实际上还没有尝试测试一个值,如果它失败,我会尖叫你确定要
SHA1吗(某个看起来像hash的东西);
?你应该仔细看看
如果($result==1)
,我怀疑这是否像你预期的那样。我在想它,我认为它像是“无效的”“除了tokenColumn之外,它是否在所有列上都匹配,也许你是对的。我现在有点绊倒了。我现在要喝汤了。哦,我明白你的意思了。也许我误解了意图。无论如何,它一定是非常明显的,所以我会一次用一个参数重新开始,我会让你知道的。”