设置一个新的CodeIgniter 3项目我陷入了数据库访问问题。访问我的主页时,我得到:
'Unknown column 'STRICT_ALL_TABLES,' in 'field list'
...,当Codeigniter初始化数据库时触发。在mysqli/mysqli_driver.php
之后致电parent::__construct()
经过一些代码和google resarch,我不清楚为什么会这样。有什么提示吗?有建议吗?
一些详细信息
使用同一数据库连接,我成功地从同一台开发计算机中的其他PHP设置中使用了该数据库。 (使用旧版本的代码点火器)
我使用与ci3-fire-starter一起安装的CodeIgniter 3.1.10
我的数据库配置:
$active_group = 'default';
$query_builder = TRUE;
$db['default'] = array(
'dsn' => '',
'hostname' => '127.0.0.1',
'username' => 'my_username',
'password' => 'my_password',
'database' => 'my_db',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE, // Notice I have stricton set to FALSE!
'failover' => array(),
'save_queries' => TRUE
);
最后获得完整错误:
Severity: Warning
Message: mysqli::real_connect(): (42S22/1054): Unknown column 'STRICT_ALL_TABLES,' in 'field list'
Filename: mysqli/mysqli_driver.php
Line Number: 203
Backtrace:
File: C:\my\path\application\core\MY_Controller.php
Line: 26
Function: __construct
File: C:\my\path\application\core\Public_Controller.php
Line: 13
Function: __construct
File: C:\my\path\application\controllers\Welcome.php
Line: 10
Function: __construct
File: C:\my\path\index.php
Line: 325
Function: require_once
A Database Error Occurred
Unable to connect to your database server using the provided settings.
Filename: C:/my/path/system/database/DB_driver.php
Line Number: 436
答案 0 :(得分:0)
自我回答的问题,以防万一它对任何人都有用:
与class CI_DB_mysqli_driver
处的codeigniter mysqli驱动程序system\database\drivers\mysqli\mysqli_driver.php
有关,这是一个非常奇怪的情况。
由于某些原因,代码如下:
if (isset($this->stricton)) { /* ... */ }
...正在设置一些导致错误的mysqli MYSQLI_INIT_COMMAND选项。
很容易绕过数据库设置中的错误未设置 'stricton'
标志。只需将其注释掉:
$db['default'] = array(
'dsn' => '',
'hostname' => '127.0.0.1',
'username' => 'my_username',
'password' => 'my_password',
'database' => 'my_db',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
// 'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
答案 1 :(得分:0)
自从提出这个问题以来已经有一段时间了,但我自己在尝试从 MySQL 5.2 迁移到 8 时遇到了这个问题,所以我想我会为可能被它绊倒的其他人正确回答。< /p>
Message: mysqli::real_connect(): (42S22/1054): Unknown column 'STRICT_ALL_TABLES,' in 'field list'
这里的根本问题是使用的 sql_mode。有一个 ANSI_QUOTES 设置将使 " 成为标识符字符。由于该设置,CodeIgniter 中 mysqli_driver.php 中的以下代码失败:
if (isset($this->stricton))
{
if ($this->stricton)
{
$this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")');
}
else
{
$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", "")'
);
}
}
因此,有两种可能的解决方案:
if (isset($this->stricton)) {
if ($this->stricton) {
$this->_mysqli->options(MYSQLI_INIT_COMMAND, "SET SESSION sql_mode = CONCAT(@@sql_mode, ',', 'STRICT_ALL_TABLES')");
} else {
$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', '')"
);
}
}