Codeigniter(CI) 框架的一个bug

如果mysql的sql-mode包含了ANSI_QUOTES(在my.ini 内设置),就是sql语句必须用单引号来包括字符串,则CI版本3.1.2以上的版本连接数据库都会报:

A PHP Error was encountered
Severity: Warning

Message: mysqli::real_connect(): (42S22/1054): Unknown column 'STRICT_ALL_TABLES,' in 'field list'

Filename: mysqli/mysqli_driver.php

Line Number: 201

Backtrace:

如果CI版本是3.0.2 或者以下的则不会报错。看源代码:
3.1.2的mysqli_driver.php的 的db方法

				$this->_mysqli->options(MYSQLI_INIT_COMMAND,
					'SET SESSION sql_mode =
					REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
					@@sql_mode,
					"STRICT_ALL_TABLES,", ""),
					",STRICT_ALL_TABLES", ""),
					"STRICT_ALL_TABLES", ""),
					"STRICT_TRANS_TABLES,", ""),
					",STRICT_TRANS_TABLES", ""),
					"STRICT_TRANS_TABLES", "")'
				);

就是这里使用了双引号。
修正方法是这里修改为单引号。
当然在3.0.2的版本中没有这个设定,不过有一个代码(3.1.2 版本之上也有):

$mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode="STRICT_ALL_TABLES"');

在条件成立的时候也会报错,解决办法也是双引号改为单引号,
当然您也可以修改sql-mode,把ANSI_QUOTES 去掉。
这样就所有版本都不会报错了。
结论是写sql还是用单引号吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值