所以我有一段代码可以检查你是否跟踪过用户。如果你没有,基本上让你跟着他们。所以这就是
if($_SESSION['loggedIn'] == true){
$result = $con->prepare("SELECT * FROM followers WHERE follow_from = :username AND follow_to = :post_id");
$result->bindParam(':username', $username);
$result->bindParam(':post_id', $follower);
$result->execute();
$reprint = $result->fetchAll(PDO::FETCH_ASSOC);
}
print_r($reprint);
if($reprint < 1){
$stmt = $con->prepare("INSERT INTO followers (follow_from, follow_to) VALUES (:ff, :ft)");
$stmt->bindValue(':ff', $follower, PDO::PARAM_STR);
$stmt->bindValue(':ft', $username, PDO::PARAM_STR);
$stmt->execute();
}
else{
echo 'Error';
exit();
}
//Display follower
$stmt1 = $con->prepare("SELECT COUNT(*) AS count FROM followers WHERE follow_to = :username");
$stmt1->bindValue(':username', $username, PDO::PARAM_STR);
$stmt1->execute();
$likes = $stmt1->fetchAll(PDO::FETCH_ASSOC);
print_r($likes);
所以当我运行一次。我得到了其他声明的回应。我的问题是为什么会发生这种情况?在数据库中我没有记录,所以我希望它能进入一次。我没有任何错误。 loggedIn
是真的。变量正在成功传递。
有任何想法吗?
答案 0 :(得分:4)
您滥用从fetchAll()
获得的结果。它是一个关联数组,而不是标量值。正如你可能猜到的那样,它可能是空的。
但是,更重要的是,您的代码具有潜在的竞争条件。如果两个不同的会话尝试设置相同的followers
行,会发生什么? (不可否认,在一个不太可能的小系统中,但在大型系统中可能会发生这种情况)。
你实际做的只是INSERT
操作。如果followers
行在(follow_from,follow_to)
列上有唯一键,那么,如果该行已经存在,则INSERT上会出现'Duplicate entry'
错误。否则就会发生。您可以忽略'Duplicate entry'
错误,因为您只想将该行放入该表中。
所以你的代码会是这样的:
$stmt = $con->prepare("INSERT
INTO followers (follow_from, follow_to)
VALUES (:ff, :ft)");
$stmt->bindValue(':ff', $follower, PDO::PARAM_STR);
$stmt->bindValue(':ft', $username, PDO::PARAM_STR);
$result = $stmt->execute();
if ($result) {
/* this follow pair was successfully added */
} else {
/* MySQL may return the error 'Duplicate entry' */
if (false == stripos($stmt->errorCode,'Duplicate')){
echo 'Something failed in the insert: ' . '$stmt->errorCode';
}
else {
/* this follow pair was already in your table */
}
}
专业提示:请勿在软件中使用SELECT *
;它可以搞乱查询优化;它经常从服务器向您的程序发送超出您需要的数据,如果您更改表定义,它会降低您的程序的弹性。
专业提示:如果必须计算与特定WHERE
语句匹配的行,请使用COUNT()
而不是获取行并在客户端中对它们进行计数。如果你获得一百万行怎么办?
答案 1 :(得分:1)
你想要使用count($ reprint)其他直接比较。 $ reprint是一个数组,而不是数字
if(count($reprint) < 1)
{
$stmt = $con->prepare("INSERT INTO followers (follow_from, follow_to) VALUES (:ff, :ft)");
$stmt->bindValue(':ff', $follower, PDO::PARAM_STR);
$stmt->bindValue(':ft', $username, PDO::PARAM_STR);
$stmt->execute();
}
else
{
echo 'Error';
exit();
}
答案 2 :(得分:1)
PDOStatement :: fetchAll - 返回包含所有结果集行的数组
如果你检查数组的大小,那么你实际上会知道是否发生了什么。
使用正确的错误处理可以告诉您某些内容是否失败:
try
{
...
}
catch (PDOException $e)
{
echo $e->getMessage();
}
您需要启用PDO错误显示:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
如果检查数组的大小没有做到并且没有错误,那么它只是一些逻辑错误。
很可能是逻辑错误
$reprint = $result->fetchAll(PDO::FETCH_ASSOC);
没有执行(包装错误处理应该告诉你原因),所以
$reprint = $result->fetchAll(PDO::FETCH_ASSOC);
未给出正确的值,这意味着您将始终点击else语句。
修改强>
你原来的问题是“所以当我运行一次。我得到了else语句回应。[...]在数据库中我没有记录”但现在你说“它添加了记录,但不是不限于我一个。“
你能更清楚地知道实际的,当前的问题吗?