繁体   English   中英

为什么我的 PHP 脚本(MySQL 查询)这么慢?

[英]Why is my PHP script (MySQL Query) so slow?

我运行了几分钟前创建的脚本,但它还没有完成运行。

现在它有了,我收到了 500 内部服务器错误。

编辑---错误发生在第 126 行,这里是 while 循环的端口:

while ($row == mysql_fetch_assoc($query)) {
            mysql_query("DELETE FROM `Likes` WHERE `accountID` = '$id'");
}

请你能告诉我是什么导致我的脚本这么慢吗?

if ($param == "closeAccount") {
    $username = NULL;
    $password = NULL;
    $emailAdd = NULL;
    $id = NULL;
    if (isset($_GET['username'])) {
        $username = $_GET['username'];
    }
    else {
        exit("No username is set");
    }
    if (isset($_GET['password'])) {
        $password = md5($_GET['password']);
    }
    else {
        exit("No password is set");
    }
    if (isset($_GET['emailAddress'])) {
        $emailAdd = $_GET['emailAddress'];
    }
    else {
        exit("No email address is set");
    }
    $query = mysql_query("SELECT * FROM `Accounts` WHERE `Username` = '$username' AND `Password` = '$password' AND `Email Address` = '$emailAdd'");
    if (mysql_num_rows($query) < 1) {
        exit("Account doesn't exist");
    }
    while ($row = mysql_fetch_assoc($query)) {
        $id = $row["id"];
    }
    $query = NULL;
    $query = mysql_query("SELECT `id` FROM `Comments` WHERE `accountID` = '$id'");
    while ($row = mysql_fetch_assoc($query)) {
        mysql_query("DELETE FROM `Comments` WHERE `accountID` = '$id'") or die(mysql_error());
    }
    $query = NULL;
    $query = mysql_query("SELECT `id` FROM `Likes` WHERE `accountID` = '$id'");
    while ($row == mysql_fetch_assoc($query)) {
        mysql_query("DELETE FROM `Likes` WHERE `accountID` = '$id'");
    }
    $query = NULL;
    $query = mysql_query("SELECT `id` FROM `Posts` WHERE `accountID` = '$id'");
    while ($row == mysql_fetch_assoc($query)) {
        mysql_query("DELETE FROM `Posts` WHERE `accountID` = '$id'");
    }
    $query = NULL;
    $query = mysql_query("DELETE FROM `Accounts` WHERE `Username` = '$username' AND `Password` = '$password' AND `Email Address` = '$emailAdd'");
    exit("Closed");
}

看来你有很多冗余。 我没有你的直接数据库,所以我可能会对你的结构略有不同,但你可能会从跳过下半部分的 SELECT 语句中受益。

例子:

$query = mysql_query("SELECT * FROM `Accounts` 
    WHERE `Username` = '$username' AND `Password` = '$password' 
    AND `Email Address` = '$emailAdd'");
if (mysql_num_rows($query) < 1) {
    exit("Account doesn't exist or wrong password entered");
}
$row = mysql_fetch_assoc($query);
$id = $row["id"]

$query = NULL;
mysql_query("DELETE FROM `Comments` WHERE `accountID` = '$id'");
mysql_query("DELETE FROM `Likes` WHERE `accountID` = '$id'");
mysql_query("DELETE FROM `Posts` WHERE `accountID` = '$id'");
mysql_query("DELETE FROM `Accounts` WHERE `id` = '$id'");

500 Internal Server Error 应导致详细信息记录在您的服务器上的 web 服务器错误日志中。 从那里查看您的 web 服务器的错误日志和 go。

 $query = mysql_query("SELECT * FROM `Accounts` WHERE `Username` = '$username' AND `Password` = '$password' AND `Email Address` = '$emailAdd'");

很可能会失败。

全部改成这个

 $query = mysql_query("SELECT * FROM `Accounts` WHERE `Username` = '$username' AND `Password` = '$password' AND `Email Address` = '$emailAdd'") or die(mysql_error());

编辑:: 哦,是的,这里有一个巨大的 sql 注入问题。 记得做

$username = mysql_real_escape_string($_GET['usernmame']);

除非你想注射!

  • 如果您假设只获得一个用户,则不需要在这里做一段时间。 只需删除 while 循环。

     $query = mysql_query("SELECT * FROM `Accounts` WHERE `Username` = '$username' AND `Password` = '$password' AND `Email Address` = '$emailAdd'"); [...] while ($row = mysql_fetch_assoc($query)) { $id = $row["id"]; }
  • 如果您在以下行设置 $query 变量为 NULL 是没有用的:

     $query = NULL; $query = mysql_query("SELECT `id` FROM `Comments` WHERE `accountID` = '$id'");
  • 此处未使用您的SELECT查询。 它们没用,您可以删除它们。

     $query = mysql_query("SELECT `id` FROM `Comments` WHERE `accountID` = '$id'"); while ($row = mysql_fetch_assoc($query)) { mysql_query("DELETE FROM `Comments` WHERE `accountID` = '$id'") or die(mysql_error()); } $query = NULL; $query = mysql_query("SELECT `id` FROM `Likes` WHERE `accountID` = '$id'"); while ($row == mysql_fetch_assoc($query)) { mysql_query("DELETE FROM `Likes` WHERE `accountID` = '$id'"); } $query = NULL; $query = mysql_query("SELECT `id` FROM `Posts` WHERE `accountID` = '$id'"); while ($row == mysql_fetch_assoc($query)) { mysql_query("DELETE FROM `Posts` WHERE `accountID` = '$id'"); } $query = NULL; $query = mysql_query("DELETE FROM `Accounts` WHERE `Username` = '$username' AND `Password` = '$password' AND `Email Address` = '$emailAdd'");
  • 在这些情况下,while 循环是无用的,因为您总是在执行 SAME 查询。 替换:

     $query = mysql_query("SELECT `id` FROM `Comments` WHERE `accountID` = '$id'"); while ($row = mysql_fetch_assoc($query)) { mysql_query("DELETE FROM `Comments` WHERE `accountID` = '$id'") or die(mysql_error()); }

    通过那个:

     mysql_query("DELETE FROM `Comments` WHERE `accountID` = '$id'") or die(mysql_error());

如前所述,应不惜一切代价避免循环中的查询。

采取你指出的那条线,并在下面做这样的事情:

$ids_to_delete = array();
while ($row = mysql_fetch_assoc($query)) {
       $ids_to_delete[] = (int)  $row['id'];   
}
mysql_query("DELETE FROM `Likes` WHERE `accountID` IN(" . implode(',', $ids_to_delete) . ")");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM