不返回正确的 MYSQL 结果

标签: MySQL PHP HTML
发布时间: 2017/4/9 21:48:20
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

所以我有一段代码,将检查是否执行了用户或不。而且基本上让你跟着他们,如果你还没有。就在这里

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);

所以,当我运行它一次。我得到呼应的 else 语句。我的问题是为什么会这样?在数据库中我有没有记录,所以我希望它去一次。我根本没有错误。loggedIn是真的。并成功地通过传递变量。 有什么想法?

解决方法 1:

你们误用了你从得到的结果 fetchAll() 。它是一个关联数组,不是一个标量的值。它可以因为你可能已经猜到,是空。

但是,更重要的是,您的代码具有潜在的争用条件。如果两个不同的会话试图设置这同样会发生什么 followers 行?(不可否认,在一个小的系统,是不可能的但一个大型系统中它可能发生)。

实际上你只是 INSERT 操作。如果你 followers 行有一个唯一密钥 (follow_from,follow_to) 列,然后,如果该行已在那里你会得到 '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() 而不是读取的行和在客户端对其进行计数。如果你得到 100 万行吗?

官方微信
官方QQ群
31647020