本地和生产 Laravel 项目之间响应数据类型的差异 [副本]

Differences in Response Data Type Between Local and Production Laravel Project [duplicate]

提问人:Q8root 提问时间:9/29/2023 最后编辑:matiaslauritiQ8root 更新时间:9/29/2023 访问量:64

问:

我遇到了一个令人费解的问题,即在我的本地 XAMPP 服务器和生产服务器上运行的 Laravel 项目。本地服务器使用 PHP 8.2.4 和 Apache 2.4.56,而生产服务器使用 PHP 8.2.9 和 Apache 2.4.57。两台服务器都有相同的 Laravel 项目文件。

在我的Laravel项目中,我有一个简单的路线,如下所示:

Route::get('users', function () {
    return \App\Models\User::all();
});

在我的本地服务器上,当我访问此路由时,我收到如下所示的 JSON 响应:

[
    {
        "id": 1,
        "name": "test user",
        "test_integer": 505,
        "email": "sdsdsds",
        "email_verified_at": null,
        "created_at": null,
        "updated_at": null
    }
]

但是,在生产服务器上,响应如下所示:

[
    {
        "id": 1,
        "name": "test user",
        "test_integer": "555",
        "email": "sdsdfdfdfsdsds",
        "email_verified_at": null,
        "created_at": null,
        "updated_at": null
    }
]

区别在于字段的数据类型。在本地服务器上,它是一个整数 (),而在生产服务器上,它是一个字符串 ()。test_integer505"555"

以下是有关 PHP PDO 模块的一些附加信息:

本地开发服务器 (PHP 8.2.4)
  • PDO 支持 => 启用
  • PDO 驱动程序 => mysql、pgsql、sqlite
pdo_mysql:
  • PDO Driver for MySQL =已启用>
  • 客户端 API 版本 => mysqlnd 8.2.4
生产服务器 (PHP 8.2.9)
  • PDO 支持 => 启用
  • PDO 驱动程序 => mysql、odbc、pgsql、sqlite
pdo_mysql
  • PDO Driver for MySQL =已启用>
  • 客户端 API 版本 => 3.3.6

我已经确认两台服务器具有相同的 Laravel 项目文件,并且此路由的代码相同。这两个服务器还具有 PHP 模块,例如 和 。mysqlimysqlnd

是什么原因导致了两个服务器之间的数据类型差异,尤其是在 PDO 和 PHP 版本的上下文中,以及如何确保行为一致?

任何见解或建议将不胜感激。谢谢!

php mysql laravel pdo mariadb

评论

2赞 ADyson 9/29/2023
对于 SQL 表中的该字段,两个数据库是否具有相同的列类型?
1赞 Sitethief 9/29/2023
MySQL版本有巨大差异吗?客户端 API 版本似乎表明了这一点。您可以将特定列转换为模型中的整数或字符串,这可能会使行为或多或少相同。
0赞 Q8root 9/29/2023
@ADyson是的,两者都具有完全相同的数据库和 laravel 文件(复制 + 粘贴)
0赞 Q8root 9/29/2023
@Sitethief我怀疑驱动程序 mysqlnd 导致了问题,我将创建一个新服务器而不安装 mysqlnd ,并将查看我是否在当前生产服务器上遇到同样的问题
0赞 matiaslauriti 9/29/2023
@Sitethief这是一个很好的补丁,但在生产服务器上实现是一个完全可怕的想法,因为你有一个意想不到的行为(如果测试没有捕捉到它,因为它不可重现,不知何故),你将不得不检查每个字段,当你不应该的时候,完全可怕的工程想法

答:

0赞 Othmane Nemli 9/29/2023 #1

当我使用时,我解决了一次。nd_pdo_mysql

(如果您使用的是 CPaneels,当您启用nd_pdo_mysqlphp8-mysqlnd)