【发布时间】: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