MYSQL结果无法正确返回

时间:2014-06-30 12:17:18

标签: php html mysql database pdo

所以我有一段代码可以检查你是否跟踪过用户。如果你没有,基本上让你跟着他们。所以这就是

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是真的。变量正在成功传递。 有任何想法吗?

3 个答案:

答案 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

  

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语句回应。[...]在数据库中我没有记录”但现在你说“它添加了记录,但不是不限于我一个。“

你能更清楚地知道实际的,当前的问题吗?