【问题标题】:PDO rowCount and fetchColumn both not returning correct result [duplicate]PDO rowCount 和 fetchColumn 都没有返回正确的结果 [重复]
【发布时间】:2016-04-24 22:23:43
【问题描述】:

我尝试了各种方法来让这段简短的代码正常工作。它的作用是通过 PDO 连接到数据库,然后选择与 post 变量匹配的所有行。如果多于 0 行,请将 licensekey 行更新为“已使用”并回显为 true。

我已经为 sql 尝试了 rowcount 和 fetchcolumn 和 count(*),但都没有显示任何差异。在 MySQL 本身中,我使用了一个有效的 licensekey,它确实返回了一行。

<?php
if(isset($_POST['licensekey'])) {

try {
    $db = new PDO("mysql:host=localhost;dbname=validation", "test", "test");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die($e->getMessage());
}

$search = ("SELECT * FROM validated WHERE activationkey=:lk AND used='0'");
$result = $db->prepare($search);
$result->bindParam(":lk", $_POST['licensekey']);
$result->execute();

if($result->rowCount() > 0) {
    $used = ("UPDATE validated SET used='1' WHERE validated.activationkey=:lk");
    $result2 = $db->prepare($used);
    $result2->bindParam(":lk", $_POST['licensekey']);
    $result2->execute();

    echo "true";
} else {
    echo "false";
}

$db = null;
} else {
    exit();
}
?>

每次它无论如何都会返回false。

这里似乎有什么问题?

【问题讨论】:

  • 您确定它连接到与您在 MySQL 客户端中测试过的数据库相同的数据库吗?您确实启用了异常,因此在echo "false" 执行之前会出现问题。如果从查询中删除activationkey=:lk AND 并注释掉bindParam() 调用以在不带参数的情况下运行它,假设表中存在某些行,rowCount() 是否仍然为零?
  • rowCount() 确实适用于某些版本的 MySQL 进行 SELECT 查询,我已经针对旧的 5.1 和 5.6 进行了测试。
  • 我已经注释掉了bindparam 并更改了查询,以便它只执行SELECT * FROM validated - 它现在返回true,但这就是我仍然感到困惑的地方。许可证密钥已发布,因为我与isset 核对,所以它应该在那里并且很好。 licensekey 与我复制粘贴的完全相同,但如果发布它,它将返回 false。不知道这里发生了什么。
  • 你确定它是一样的,没有尾随空格之类的东西吗?执行var_dump($_POST['licensekey']) 并检查输出和长度。确保字符串长度完全符合其应有的长度,后面没有空格或换行符,并验证表中存储的内容是否相同。如果存在空格,请使用 trim($_POST['licensekey'])
  • 还要确保 POST 数组包含一个值并且表单方法确实是 POST。也使用!empty 而不是if(isset($_POST['licensekey'])) 所以if(!empty($_POST['licensekey'])) 并如前所述执行var_dump。还要确保列的长度足够长,否则它将默默地失败。错误报告也可能有帮助php.net/manual/en/function.error-reporting.php

标签: php pdo


【解决方案1】:

实际上,您无法通过 rowCount 函数查看在 DB 中选择了多少条记录。正如我在 PHP 文档中阅读的那样,许多选择查询不会返回受 rowCount 方法查询影响的行数。查看更多信息:http://php.net/manual/en/pdostatement.rowcount.php

正如文档所说,您可以使用 fetchColumn 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多