【问题标题】:Different PDO behaviours between PHP versionsPHP 版本之间的不同 PDO 行为
【发布时间】:2015-04-25 21:23:14
【问题描述】:

我有三台服务器作为我的开发、暂存和生产服务器运行。运行的PHP版本分别为:5.5.235.5.95.5.20

它们运行完全相同的代码。但是我的开发服务器抛出异常,而其他两个工作正常。例外情况如下:

错误:[PDOException] SQLSTATE[HY000]:一般错误:1366 不正确的整数值:第 1 行的列 'comment_id' 的''
请求网址:/cmets/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->execute('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): 模型->保存(数组)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。

【问题讨论】:

  • 你用的是什么数据库?
  • @MartinKonecny MySQL

标签: php mysql pdo


【解决方案1】:

您很可能在生产和暂存环境中禁用了 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 X 的 MySQL 附带一个 /usr/local/mysql/my.cnf,它在启动时加载。在此文件中是 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 的唯一配置指令。一旦我将此注释掉并重新启动,服务器严格模式已关闭,我的 ORM 工作正常,我很高兴。

【讨论】:

  • 到底发生了什么!你就是那个男人马丁!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 2012-05-20
  • 2017-07-10
  • 2017-09-17
相关资源
最近更新 更多