【问题标题】:Unknown column 'STRICT_ALL_TABLES,' setting up CodeIgniter DB connection未知列“STRICT_ALL_TABLES”,设置 CodeIgniter 数据库连接
【发布时间】:2019-01-17 12:03:02
【问题描述】:

设置一个新的 CodeIgniter 3 项目我遇到了数据库访问问题。访问我的主页时,我得到:

'Unknown column 'STRICT_ALL_TABLES,' in 'field list'

...当 Codeigniter 初始化数据库时触发。在mysqli/mysqli_driver.php之后调用parent::__construct()

经过一些代码和谷歌研究后,我不清楚为什么会发生这种情况。有什么提示吗?有什么建议吗?

一些细节

使用相同的数据库连接,我在同一台开发计算机中成功使用了其他 PHP 设置。 (使用旧的 codeigniter 版本)

我使用 CodeIgniter 3.1.10,与ci3-fire-starter 一起安装

我的数据库配置:

$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

【问题讨论】:

  • index.php 中的第 325 行、Welcome.php 中的第 10 行、Public_Controller.php 中的第 13 行和 MY_Controller.php 中的第 26 行周围的代码是什么样的?另外,您的任何 MySQL 配置文件中是否有 STRICT_ALL_TABLES,如果有,它是如何引用的?

标签: php mysql mysqli codeigniter-3


【解决方案1】:

自我回答的问题,以防万一它对任何人都有用:

这是与system\database\drivers\mysqli\mysqli_driver.php 的codeigniter mysqli 驱动程序class CI_DB_mysqli_driver 相关的一个非常奇怪的情况。 出于某种原因,代码如下:

if (isset($this->stricton))         { /* ... */ }

...正在设置一些导致错误的 mysqli MYSQLI_INIT_COMMAND 选项。

在您的数据库设置中绕过错误 not setting '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
);

【讨论】:

  • 我已经为if (isset($this->stricton)) { /* ... */ } 注释掉了整个部分,这对我有用
【解决方案2】:

自从提出这个问题以来已经有一段时间了,但我自己在尝试从 MySQL 5.2 迁移到 8 时遇到了这个问题,所以我想我会为可能绊倒它的其他人正确回答。

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", "")'
                );
            }
        }

所以,两种可能的解决方案:

  1. 在会话或全局级别删除 ANSI_QUOTES,或者
  2. 通过“交换”单引号和双引号来修改查询:
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', '')"
                );
            }
        }

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多