PHP版本之间的不同PDO行为

时间:2015-04-25 21:23:14

标签: php mysql pdo

我有三台服务器作为我的开发,登台和生产服务器运行。运行的PHP版本分别为:5.5.235.5.95.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。

1 个答案:

答案 0 :(得分:4)

在生产和登台环境中,您很可能已禁用MySQL的严格模式,而您的开发环境已启用此功能。

See more here

  

严格模式控制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工作,我很高兴。