Php MySQL不递减值

Php MySQL不递减值,php,mysql,decrement,Php,Mysql,Decrement,当我尝试删除帖子时,无法使表Accounts中的值递减。我想减少的值是“PostCount”、“Likes Count”和“commentscont”。目前只有“后计数”起作用 请告诉我我做错了什么: $arg = mysql_query("SELECT `numberOfLikes` FROM Posts WHERE `id` = '$postID'") or die(mysql_error()); $query = mysql_query("SELECT * FROM Likes

当我尝试删除帖子时,无法使表Accounts中的值递减。我想减少的值是“PostCount”、“Likes Count”和“commentscont”。目前只有“后计数”起作用

请告诉我我做错了什么:

$arg = mysql_query("SELECT `numberOfLikes` FROM Posts WHERE `id` = '$postID'") or die(mysql_error());

    $query = mysql_query("SELECT * FROM Likes WHERE `postID` = '$postID'");
    while ($row = mysql_fetch_assoc($query)) {
        $b = $row['accountID'];
        mysql_query("UPDATE Accounts SET `numberOfLikes` = (`numberOfLikes` - 1) WHERE `id` = '$b'");
    }
    $arg = mysql_query("SELECT `numberOfComments` FROM Posts WHERE `id` = '$postID'");
    $query = mysql_query("SELECT * FROM Posts WHERE `id` = '$postID'");
    while($row = mysql_fetch_assoc($arg)) {
        $b = $row['accountID'];
        mysql_query("UPDATE Accounts SET `CommentsCount` = (`CommentsCount` - 1) WHERE `id` = '$b'");
    }
    $arg = mysql_query("SELECT `PostCount` FROM Accounts WHERE `id` = '$accountID'");
    while ($row = mysql_fetch_assoc($arg)) {
        mysql_query("UPDATE Accounts SET `PostCount` = (`PostCount` - 1) WHERE `id` = '$accountID'");
    }
    mysql_query("DELETE FROM Likes WHERE `postID` = '$postID'");
    mysql_query("DELETE FROM Comments WHERE `postID` = '$postID'");
    mysql_query("DELETE FROM Posts WHERE `id` = '$postID' AND `accountID` = '$accountID'") or die(mysql_error());
    exit("Deleted post");

首先循环查询会消耗执行时间。您希望将其限制为尽可能少的查询,这就是发挥作用的地方:

// what is this for? I do not see it being used. $arg = mysql_query("SELECT `numberOfLikes` FROM Posts WHERE `id` = '$postID'") or die(mysql_error());

$query = mysql_query("SELECT * FROM Likes WHERE `postID` = '$postID'");
while ($row = mysql_fetch_assoc($query)) {
    $b[] = $row['accountID'];
}
mysql_query("UPDATE Accounts SET `numberOfLikes` = (`numberOfLikes` - 1) WHERE `id` IN(" . implode(',', $b) . ")") or trigger_error('MySQL Update Failed: ' . mysql_error());
这将更有效率,并具有相同的效果

下一个查询应该类似:

$arg = mysql_query("SELECT `numberOfComments` FROM Posts WHERE `id` = '$postID'");
// again an extra unnecessary query not being used. $query = mysql_query("SELECT * FROM Posts WHERE `id` = '$postID'");
$b=array();
while($row = mysql_fetch_assoc($arg)) {
    $b[] = $row['accountID'];
}
mysql_query("UPDATE Accounts SET `CommentsCount` = (`CommentsCount` - 1) WHERE `id` IN(".implode(',', $b) . ")") or trigger_error(mysql_error());
下一个,我甚至不知道你为什么要循环:

//$arg = mysql_query("SELECT `PostCount` FROM Accounts WHERE `id` = '$accountID'");
//while ($row = mysql_fetch_assoc($arg)) {
mysql_query("UPDATE Accounts SET `PostCount` = (`PostCount` - 1) WHERE `id` = '$accountID'") or trigger_error(mysql_error());
//}
由于您没有在任何地方使用该数据,因此只需运行更新查询


实现上述功能将加快应用程序的速度并减少冗余<代码>内爆非常方便,运行一个查询和多个查询几乎总是首选。我不确定这是否能解决您的问题,但这是朝着修复代码的正确方向迈出的一大步

我重新编码了包含我发布的代码的if语句,现在它工作得非常好:

mysql_query("UPDATE Accounts SET `PostCount` = (`PostCount` - 1) WHERE `id` = '$accountID'");
        $query = mysql_query("SELECT * FROM Likes WHERE `postID` = '$postID'") or die(mysql_error());
        while($row = mysql_fetch_assoc($query)) {
            $accID = $row['accountID'];
            mysql_query("UPDATE Accounts SET `Likes Count` = (`Likes Count` - 1) WHERE `id` = '$accID'");
        }
        $query = mysql_query("SELECT * FROM Comments WHERE `postID` = '$postID'");
        while($row = mysql_fetch_assoc($query)) {
            $accID = $row['accountID'];
            mysql_query("UPDATE Accounts SET `CommentsCount` = (`CommentsCount` - 1) WHERE `id` = '$accID'");
        }
        mysql_query("DELETE FROM Likes WHERE `postID` = '$postID'");
        mysql_query("DELETE FROM Comments WHERE `postID` = '$postID'");
        mysql_query("DELETE FROM Posts WHERE `id` = '$postID' AND `accountID` = '$accountID'") or die(mysql_error());
        exit("Deleted post");

两个问题/评论:1。什么数据类型是
PostCount
?2.为什么不直接使用触发器呢?我想把它用作触发器,但我没有超级特权,postcount是一个INT。谢谢你的帮助,我只是重新编码了包含我发布的代码的if语句,我让它工作了。我将在回答中发布我的代码。