0

投稿を削除しようとしたときに、テーブル Accounts to decrement の値を取得できません。デクリメントしたい値は、「PostCount」、「Likes Count」、および「CommentsCount」です。現在、「PostCount」のみが機能します。

私が間違っていることを教えてください:

$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");
4

2 に答える 2

1

最初にクエリをループすると、実行時間が長くなります。できるだけ少ないクエリに制限したい場合は、次のようimplodeになります。

// 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());
//}

そのデータをどこでも利用していないので、更新クエリを実行するだけです。

上記を実装すると、アプリケーションが高速化され、冗長性が削減されます。implode非常に便利で、ほとんどの場合、1 つのクエリと複数のクエリを実行することが推奨されます。これで問題が解決するかどうかはわかりませんが、コードを修正するための正しい方向への大きな一歩です。

于 2011-06-06T00:21:41.393 に答える
0

投稿したコードを含む 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");
于 2011-06-06T00:34:59.783 に答える