如何调试 laravel 4 / cartalyst sentry 中的插入异常

How to debug insert exception in laravel 4 / cartalyst sentry

我接手了一个用Laravel 4写的项目。有两个系统(开发和生产)基本上应该做同样的事情。

当我尝试注册用户时(使用的包是 cartalyst/sentry),它可以在生产环境中运行。在开发环境中,它失败了,因为有些列定义为非空,并且代码中没有语句来设置它。所以我明白为什么它会失败,我不明白的是为什么它可以在另一台机器上工作,以及我可以在 dev 上做什么样的调整才能让它工作。不更改数据库列(我想在进行此类更改之前了解系统)。

异常:

SQLSTATE[HY000]: General error: 1364 Field 'auto_token' doesn't have a default value 
(SQL: insert into `users` (`first_name`, `last_name`, `display_name`, `email`,  
`password`, `updated_at`, `created_at`) values (?, ?, ?, ?, ?, ?, ?)) (Bindings: array ...

注册新用户的代码:

        $user = Sentry::register(array(
            'first_name' => Input::get('first_name'),
            'last_name'  => Input::get('last_name'),
            'display_name'=> Input::get('display_name'),
            'email'      => Input::get('email'),
            'password'   => Input::get('password'),
        ));

数据库模式:

id (unsigned int, not null)
first_name (varchar, not null)
last_name (varchar, not null)
display_name (varchar, not null)
email (varchar, not null)
password (varchar, not null)
auto_token (varchar, not null)
... more columns like auto_token

产品:MySQL 5.5.42 - PHP 5.4.30 - 运行宁 Linux

开发:MySQL 5.6.21 - PHP 5.4.30 - 运行宁 Windows

我知道查询一开始就不应该 运行 成功,一般的数据库模式是有缺陷的。我想了解导致此问题的原因以及如何解决此问题。

我被卡住的地方是为什么它在一个系统上工作而在另一个系统上不工作。有人知道方向吗?

看来您的问题出在 MySQL 配置中。为避免这些错误,您必须禁用 MySQL 严格模式。

找到 my.cnfmy.ini 配置文件并从 sql-mode 值中删除 STRICT_TRANS_TABLES

例如编辑前:
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

编辑后:
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

您必须在保存配置文件后重新启动 mysql,一切可能会按预期工作。

另一方面,禁用 "strict mode" 是一种不好的做法,最好编辑迁移并在适当的位置添加 nullabledefault

祝你好运!