Laravel 5.4 给出了错误的 COM_STMT_PREPARE 响应大小

Posted

技术标签:

【中文标题】Laravel 5.4 给出了错误的 COM_STMT_PREPARE 响应大小【英文标题】:Laravel 5.4 gives Wrong COM_STMT_PREPARE response size 【发布时间】:2017-10-11 19:48:39 【问题描述】:

我在一个网站上工作,过去一个月运行良好,昨天突然崩溃并显示Wrong COM_STMT_PREPARE response size. Received 7

这是我在控制器中的代码:

public function newsFeed()

    // get all data needed for the news page

    try

        $news = DB::SELECT("SELECT 
                                n.newId
                                ,n.title_en
                                ,n.title_es
                                ,n.description_en
                                ,n.description_es
                                ,n.newMainImg
                                ,n.tags
                                ,DATE_FORMAT(n.createDate, '%b - %e - %Y') as publishDate_en
                                ,DATE_FORMAT(n.createDate, '%e - %b - %Y') as publishDate_es
                                ,concat(u.firstName,' ',u.lastName) as author
                            FROM NEWS n
                              inner join USERS u
                                      on u.userId = n.author
                                     and u.statusId = 1
                            order by n.createDate desc limit 20"); 


        $favorites = DB::SELECT("SELECT 
                                    n.newId
                                    ,n.title_en
                                    ,n.title_es
                                    ,n.newMainImg
                                FROM
                                    NEWS n
                                WHERE viewsCount > 0
                                  and viewsCount is not null
                                order by viewsCount desc limit 6");


        $data = array(
            'news' => $news,
            'favorites' => $favorites
        );

        return view('news/newsFeed')->with('data', $data);

    catch(Exception $exc)

        echo $exc->getMessage();
          


我还没有找到任何解决方案。任何帮助将不胜感激。

更新

如果它有助于服务器在 000webhost 中,我发现很多人都有同样的问题。

更新 2

错误表明问题出在 Connection.php 第 647 行

这是围绕它的代码:

protected function run($query, $bindings, Closure $callback)

    $this->reconnectIfMissingConnection();

    $start = microtime(true);

    // Here we will run this query. If an exception occurs we'll determine if it was
    // caused by a connection that has been lost. If that is the cause, we'll try
    // to re-establish connection and re-run the query with a fresh connection.
    try 
        $result = $this->runQueryCallback($query, $bindings, $callback);
     catch (QueryException $e) 
        $result = $this->handleQueryException(
            $e, $query, $bindings, $callback
        );
    

    // Once we have run the query we will calculate the time that it took to run and
    // then log the query, bindings, and execution time so we will report them on
    // the event that the developer needs them. We'll log time in milliseconds.
    $this->logQuery(
        $query, $bindings, $this->getElapsedTime($start)
    );

    return $result;

protected function runQueryCallback($query, $bindings, Closure $callback)

    // To execute the statement, we'll simply call the callback, which will actually
    // run the SQL against the PDO connection. Then we can calculate the time it
    // took to execute and log the query SQL, bindings and time in our memory.
    try 
        $result = $callback($query, $bindings);
    

    // If an exception occurs when attempting to run a query, we'll format the error
    // message to include the bindings with SQL, which will make this exception a
    // lot more helpful to the developer instead of just the database's errors.
    catch (Exception $e) 
        throw new QueryException(
            $query, $this->prepareBindings($bindings), $e
        );
    

    return $result;

【问题讨论】:

【参考方案1】:

我通过将 PDO 属性 PDO::ATTR_EMULATE_PREPARES 设置为 true 解决了这个问题。您可以在 config/database.php 下为您的数据库连接添加一个选项。

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    //.......
    'options'   => [PDO::ATTR_EMULATE_PREPARES => true,]
],

【讨论】:

【参考方案2】:

我在Laravel 7.5 + PHP 7.4 上遇到了同样的错误,但在pcntl_fork() 之后。 错误日志显示此错误来自子进程中同时运行的不同部分代码。

在所有子进程中重新连接到数据库(在 fork 之后)解决了这个问题。

【讨论】:

以上是关于Laravel 5.4 给出了错误的 COM_STMT_PREPARE 响应大小的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 和 Mariadb 的连接错误太多

第 245 行 ConnectionFactory.php 中的不同错误 - Laravel 5.4

使用 laravel 5.4 在 VM 上运行开发安装错误

内部服务器错误 500 Laravel 5.4 AJAX

laravel-5.4 - 错误:从空值创建默认对象

Laravel 5.4数据库迁移不起作用[重复]