【问题标题】:Leads to HTTP ERROR 500 PHP and SQL and i can´t solve it导致 HTTP ERROR 500 PHP 和 SQL,我无法解决
【发布时间】:2021-02-15 21:48:29
【问题描述】:

我试图在页面 {"status":1} 上显示,但它给出了错误 500。我的所有代码似乎都在数据库和平台上工作。

它在错误日志中显示此错误:

  1. [error] 42094#0: *233568 FastCGI sent in stderr: "PHP message: PHP Notice: Undefined index: id in /var/www/.../.../.../.../第 519 行的 classes/pageuser.class.php
  2. PHP 消息:PHP 致命错误:在 /var/www/.../.../.../.../classes/loan.class.php 中的布尔值上调用成员函数 execute()第 537 行”,同时从上游读取响应标头,客户端:162...,服务器:interno.neeec.pt,请求:“GET /loans/tickets/pay HTTP/1.1”,上游:“fastcgi://unix:/ var/lib/php5-fpm/web20.sock:",主机:"interno.neeec.pt"

在 pageuser.class.php 上:

 case "loans/tickets/pay":
            $this->template = "no_render";
            $response = null;
            if (Loan::payTicket($_POST["id"], $user->getID())) {
                $response = ["status" => 1];
            } else {
                $response = ["status" => 0, "err" => "Erro ao atualizar base de dados"];
            }
            die(json_encode($response));
            return;

在loan.class.php上:

    public static function payTicket($ticket_id, $user_id)
{
    $ticket_value = Loan::getTicketValue($ticket_id);
    $database = new Database();
    $connection = $database->getConnection();
    $stmt = $connection->prepare("UPDATE loan_tickets SET `paid`=1,date_of_payment=CURRENT_TIMESTAMP WHERE id=?");
    $stmt->bind_param('i', $ticket_id);
    if ($stmt->execute()) {
        $stmt = $connection->prepare("UPDATE `c3interno`.`payment_methods` SET `expected_value` = `expected_value` + $ticket_value WHERE `id` = 6");
        if($stmt->execute())
        {
            $stmt = $connection->prepare("INSERT INTO `c3interno`.`payment_methods_logs` (`payment_method`,`type`,`value`,`user_id`,`date`,`reason`) VALUES (6,5,$ticket_value,$user_id,CURRENT_TIMESTAMP,'Delay')");
            if($stmt->execute())
            {
                $stmt->close();
                return true;
            }
            $stmt->close();
            return false;
        }
        $stmt->close();
        return false;
    }
    $stmt->close();
    return false;
}

【问题讨论】:

  • “我的所有代码都在工作” - 显然有些东西不是。您查看过服务器错误日志吗?
  • 我该怎么做?
  • 我不知道。每个系统都是不同的。在 Linux 服务器上,它通常位于 /var/log/ 中的某个位置,但不同的 linux 风格有不同的默认值,并且您的 Apache 配置可能再次将它放在不同的位置。对于 Windows,这将取决于您如何配置 IIS。对于托管系统,您可能无法访问原始文件,但副本将放置在您的用户区某处。坦率地说,作为一名开发人员,这是您应该对您的系统了解的内容。
  • 我通过 ftp 错误日志访问了它
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug切勿$_POST$_GET任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。

标签: php mysql sql


【解决方案1】:

您只需要进行一些基本的错误检查。第一个警告可能是根本原因是 $_POST 变量“id”未发送。我不知道为什么,你需要调查。如果这是一个可选变量,在尝试使用它之前应该使用if (isset($_POST["id"])) 之类的东西来查看它是否存在。

出现第二个错误是因为$stmt 是错误的,因为prepare() 返回了失败状态。见about PDO return values。您需要使用if ($stmt === false) 之类的内容检查错误。

【讨论】:

  • 是的,它不存在 wtf,但为什么呢?嗯
  • 检查=== false 是不必要的。 if (!$stmt) 就足够了。
  • 感谢 tadman 问题是 php 和 sql 之间的插值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2020-02-14
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
相关资源
最近更新 更多