我有三台服务器作为我的开发,登台和生产服务器运行。运行的PHP版本分别为:5.5.23
,5.5.9
,5.5.20
。
它们运行完全相同的代码。但我的开发服务器抛出了异常,而其他两个工作正常。例外情况如下:
错误:[PDOException] SQLSTATE [HY000]:常规错误:1366错误的整数值:''用于第1行的'comment_id'列 请求网址:/comments/add.json 堆栈跟踪: 0 /Users/me/Sites/MySite/lib/Cake/Model/Datasource/DboSource.php(460):PDOStatement-> execute(Array)1
1 /Users/me/Sites/MySite/lib/Cake/Model/Datasource/DboSource.php(426):DboSource-> _execute('INSERT INTO`po ...',Array)1
2 /Users/me/Sites/MySite/lib/Cake/Model/Datasource/DboSource.php(1008):DboSource->执行('INSERT INTO`po ...')1
3 /Users/me/Sites/MySite/lib/Cake/Model/Model.php(1744):DboSource-> create(Object(Notification),Array,Array)1
4 /Users/me/Sites/MySite/app/Controller/CommentsController.php(181):Model-> save(Array)1
5 [内部功能]:CommentsController-> add()
当数据库期望整数时,插入的值为bool(false)
。所以我必须为我的开发服务器处理这个问题:
//The comment id is set to false. Needs to turn it to NULL as DB can't handle false for integer
if($this->Comment->id === false)
$notification['Notification']['comment_id'] = NULL;
else
$notification['Notification']['comment_id'] = $this->Comment->id;
我的问题是:为什么我的登台和生产服务器可以处理这个问题(可能会将false值自动转换为整数),但我的开发服务器不能?
如您所见,我的服务器正在运行CakePHP
。我一直在看PDO版本,但它似乎并没有给我太多的洞察力。我的开发服务器在Mac Book Mac OS X 10.10上运行。登台和生产正在运行Ubuntu 12.04。
答案 0 :(得分:4)
在生产和登台环境中,您很可能已禁用MySQL的严格模式,而您的开发环境已启用此功能。
严格模式控制MySQL如何处理数据更改语句(如INSERT或UPDATE)中的无效或缺失值。由于多种原因,值可能无效。例如,列可能具有错误的数据类型,或者可能超出范围。当要插入的新行不包含其定义中没有显式DEFAULT子句的非NULL列的值时,缺少值。 (对于NULL列,如果缺少值,则插入NULL。)
如果严格模式无效,MySQL会为无效或缺失值插入调整后的值并生成警告
您可以阅读how to change this mode here。
在OS X上,following link has more details:
经过大量的讨论后,我发现来自Oracle的OS for OS X附带了一个在启动时加载的/usr/local/mysql/my.cnf。在此文件中是sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES的唯一配置指令。一旦我评论出来并重新启动服务器严格模式关闭,我的ORM工作,我很高兴。