Laravel +存储过程:错误数据包乱序

时间:2019-03-07 02:25:21

标签: php mysql laravel stored-procedures

我正在尝试从laravel 5.6调用存储过程,该存储过程可以从数据库客户端正常工作。

CALL storedProcedure1(95, 2);

但是当我使用时:

$db = DB::select('exec storedProcedure1(?,?)', array(
    $param1,
    $param2
));

从laravel我得到以下信息:

  

“ message”:“数据包乱序。预期1收到0。数据包   size = 131072“,” exception“:” ErrorException“,” file“:   “ D:\ project \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Concerns \ ManagesTransactions.php”,   “行”:202,

我应该怎么做才能修复它?

4 个答案:

答案 0 :(得分:0)

错误是php与MySQL服务器的通讯方式不兼容。

修复包括:

  • 避免错误-可能不使用存储过程(一般IMHO建议)
  • 升级MySQL服务器版本(以laravel进行更多测试)

答案 1 :(得分:0)

您可以编辑config/database.php文件并将其添加到数据库连接中

'options'   => array(
   PDO::ATTR_EMULATE_PREPARES => true
),
  

警告:这可能不是最好的方法。

我在这里找到了此解决方案:source

答案 2 :(得分:0)

enter image description here 您可以在laravel 5.4中解决此数据包大小问题。在数据库文件中编写此行代码。将这行代码写在您遇到问题的地方,例如,如果您在MYSQL中有问题,然后在MYSQL oR中编写PGSQL,然后在pgsql中编写,则与其他数据库类型相同。

'options'  => [
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 
        PDO::ATTR_EMULATE_PREPARES => true,
    ]

答案 3 :(得分:0)

在 Laravel 中,我只想在整个应用程序的一个地方调用一个存储过程。所以,我不想在 Configs 中设置 PDO 属性来防止全局级别的任何异常。因此,我创建了一个 PDO 连接并实现如下:

        $pdo = DB::connection()->getPdo();
        $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        $pdo->query('CALL my_stored_proc()');