【问题标题】:Why am I getting this Internal Server Error in the Laravel Framework?为什么我在 Laravel 框架中收到此内部服务器错误?
【发布时间】:2014-08-25 15:11:04
【问题描述】:

我遇到了一个对我来说没有多大意义的情况。正如一些背景信息一样,我使用的是 Laravel 框架。当使用 Laravel 的 '->with('var', $array)' 语法请求页面时,相关页面会调用查询。这个查询(我稍后会发布)在页面加载时工作得很好,并成功地插入了我提供给它的虚拟数据。

我通过使用 jQuery 的 Ajax $.post 调用相同的查询,单击一个按钮。但是,当我执行此 $.post 并调用此查询时,每次都会收到内部服务器错误。一切都完全一样,包括传递的信息;唯一的区别似乎是它是在页面加载时调用还是通过 $.post 调用。

这是错误:

以下是在页面加载时执行查询的代码:

routes.php 将 HTTP 获取请求发送到名为 AppController.php 的文件

routes.php AppController.php

然后使用从DeviceCheckoutController.php获取的以下数组制作页面

然后转到DeviceCheckout.php

我能够在页面上回显 $test,并且每次重新加载页面时它都会返回新行的 ID(这显然意味着“insertGetId”查询有效)。但是,我将此查询连接到页面加载只是为了测试。我真正想要发生的是点击一个按钮。这是代码:

$("#checkoutFormbox").on('click', '#checkoutButton', function() {

        var checkoutInformation = Object();
        var accessories = [];
        var counter = 0;
        var deviceName = checkoutDeviceTable.cell(0, 0).data();

        $(".accessoryCheckbox").each(function() {
            //add accessory ID's to this list of only accessories selected to be checked out
            if($(this).val() == "1")
            {
                accessories[counter] = $(this).data('id') + " ";
            }
            counter++;
        });

        checkoutInformation['deviceID'] = $(".removeButton").val(); //deviceID was previously stored in the remove button's value when the add button was clicked
        checkoutInformation['outBy'] = '';
        checkoutInformation['outNotes'] = $("#checkOutDeviceNotes").val();
        checkoutInformation['idOfAccessories'] = 2;
        checkoutInformation['dueDate'] = $("#dueDate").val();

        if($("#studentIdButton").hasClass('active'))
        {
            checkoutInformation['renterID'] = 0;
            checkoutInformation['emplid'] = 1778884;
            console.log(checkoutInformation);
            $.post("http://xxx.xxx.xxx.xxx/testing/public/apps/devicecheckout-checkoutdevices", {type: "checkoutDeviceForStudent", checkoutInformation: checkoutInformation}, function(returnedData) {
                alert(returnedData);
            });
        }
});

然后它也被路由到AppController.php,特别是 switch 语句的“checkoutDeviceForStudent”部分:

然后回到之前在DeviceCheckout.php 中显示的那个查询

最后,这是我的数据库结构供参考:

关于为什么会发生这种情况的任何解释?此外,任何 Laravel 或其他一般最佳实践技巧都将不胜感激,因为我在使用这个框架和整体编程方面缺乏经验。

抱歉这么长的帖子,我希望有足够的信息来诊断这个问题。如果我需要添加其他内容,请告诉我。

编辑:在页面顶部包含错误图片。

【问题讨论】:

  • 毕竟,您需要包含错误的实际内容!
  • 如果你想要解释,请查看网络服务器日志为什么他会抛出 HTTP 500。
  • 服务器端错误日志显示什么?不要给我们看代码图片,复制粘贴实际代码。
  • app/config/app.php 中将debug 设置为true。这样您就可以看到错误,我们可以为您提供帮助。
  • 现在应该在页面顶部显示错误图片。对于那个很抱歉。此外,我确实将调试设置为 true,但它不会引发错误,因为(据我所知),当通过 Ajax 调用 Laravel 查询时它不会。

标签: javascript php jquery ajax laravel


【解决方案1】:

一切都一模一样,包括传递的信息

不,不是。如果它完全相同,您将不会收到您遇到的错误。

这类问题很难通过猜测问题可能是什么来解决。你需要

  1. 设置您的系统,以便 Laravel 将错误记录到 laravel.log 文件中

  2. 设置您的 PHP 系统,以便将 Laravel 无法处理的错误记录到您的网络服务器的错误日志(和/或 PHP 的错误日志)中

  3. 将 Laravel 置于调试模式,以便将错误输出到屏幕,并通过 Firebug 或 Chrome 查看 ajax 请求的输出

一旦您遇到实际的 PHP 错误,通常很容易看出您认为相同的请求有何不同,并解决问题。

【讨论】:

  • 感谢您的回答。我查看了我的 laravel.log 文件,发现只引用了引发错误并已修复的未定义变量,与我遇到的任何 POST 请求错误无关。我还检查了我的 /var/log/apache2/access.log 文件。这产生了不同的结果;它确实显示了我的 POST 请求,并且返回了 500 错误,但仅此而已。以下是我在日志中找到的供参考:
  • [25/Aug/2014:18:16:00 +0000] "POST /testing/public/apps/devicecheckout-checkoutdevices HTTP/1.1" 500 833 "xxx.xxx.xxx.xxx/staffportal/public/apps/…" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36" 另外,我找不到我的 PHP 错误日志。我找对地方了吗?我应该寻找哪些日志文件?此外,Laravel 设置为调试模式,但当我通过 jQuery 调用 POST 时它不会抛出错误。
  • 那是你的 Apache 访问日志,你想要 apache 错误日志。您还希望跟踪这些日志并观察您提出请求时出现的错误。
  • 明白了。在我的 Apache2 配置文件中,我将错误日志目录 ErrorLog ${APACHE_LOG_DIR}/error.log 更改为 /var/log/error.log,它现在显示在正确的文件夹中(请注意,在进行此更改后我还重新启动了 Apache)。但是,自从设置它以来,我已经多次收到 POST 500 错误,并且它没有出现在 error.log 文件中。唯一出现的是:Apache/2.2.22 (Debian) PHP/5.4.4-14+deb7u12 configured -- resuming normal operations。如何正确配置它以捕获 POST 错误?
  • StackExchange 评论线程可能不是调试服务器设置问题的最佳/最简单方法。
【解决方案2】:

在朋友的一些建议下,我找到了解决问题的方法;比我预期的要容易得多,也比这里或其他地方提供给我的任何解决方案都容易得多。

基本上,我需要做的是在我的模型函数中放置一个 try, catch 子句,然后如果遇到异常,我将其存储在一个变量中,return 它,然后使用console.log() 查看异常。这是一个模仿我的观点的例子:

public function getUserFullname($userID)
{
    try
    {
        $myResult = DB::connection('myDatabase')->table('TheCoolestTable')->select('fullName')->where('userID', '=', $userID)->get();

        return $myResult;  
    }
    catch(Exception $e)
    {
        $errorMessage = 'Caught exception: ' . $e->getMessage();

        return $errorMessage;
    }
}

然后在视图(或模型函数返回的任何位置)上,只需 console.log() POST 的输出即可。这将显示成功查询的结果,或者如果遇到异常则显示异常的结果,而不是无用的内部服务器错误 500 消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2017-07-05
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多