CodeIgniter:使用提供的设置无法连接到您的数据库服务器 错误信息

58

我一直在使用CI,使用MySQL驱动程序也很正常。但我想改用MySQLi驱动程序,只需添加“i”并添加端口号即可,但是一旦更改,就会出现以下错误消息:

发生了数据库错误

无法使用提供的设置连接到数据库服务器。

文件名:core/Loader.php

行号:232

我的设置如下:

$db['default']['hostname'] = $hostname;
$db['default']['username'] = $username;
$db['default']['password'] = $password;
$db['default']['database'] = $database;
$db['default']['dbdriver'] = 'mysqli';
$db['default']['port']     = "3306";  
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE; 

where
$hostname = 'localhost';
$username = 'myusernamegoeshere';
$password = 'mypasswordgoeshere';
$database = 'mydatabasenamegoeshere'; 

我正在使用:

CI 2.0.2 php 5.3.4 Apache/2.2.17 (Unix) mysql 5.5.13 mysql.default_port 3306

我有做错什么吗?

谢谢。

15个回答

112

我认为PHP配置存在问题。
首先,在./config/database.php文件末尾使用以下脚本调试数据库连接:

...
  ...
  ...
  echo '<pre>';
  print_r($db['default']);
  echo '</pre>';

  echo 'Connecting to database: ' .$db['default']['database'];
  $dbh=mysql_connect
  (
    $db['default']['hostname'],
    $db['default']['username'],
    $db['default']['password'])
    or die('Cannot connect to the database because: ' . mysql_error());
    mysql_select_db ($db['default']['database']);

    echo '<br />   Connected OK:'  ;
    die( 'file: ' .__FILE__ . ' Line: ' .__LINE__); 

那么看看问题出在哪里。


4
目前为止最好的答案。我遇到了错误,然后当我将默认主机名替换为$db['default']['hostname'] = ':/ Applications/MAMP/tmp/mysql/mysql.sock';时,它就起作用了。感谢这里的帮助:https://dev59.com/P2855IYBdhLWcg3wp2J0 - gelviis
3
这应该是被采纳的答案。你真的救了我的一天。我的问题非常简单,但我没能看到,原来只是密码输错了!你的脚本帮助我找到了问题所在,谢谢啊! - iTurki
很棒的回答。已经适应了mysqli并在下面发布。以防其他人有用。 - MarcM

62

今天我在生产服务器遇到了这种问题,我通过更改这行代码解决了它

$db['default']['db_debug'] = TRUE;

$db['default']['db_debug'] = FALSE;

这是我在实际环境中使用PostgreSQL数据库时遇到的问题。非常感谢,因为我对PHP还很陌生,不知道问题出在哪里。 - Jason H
2
好的,有人能解释一下为什么这会导致连接问题吗?我很沮丧,花了大约一个小时来弄清楚我的项目是如何在一夜之间崩溃的,而这个方法却解决了它。但我不知道为什么。 - Boyan
我仍在努力找出问题所在,因为尽管页面已经恢复,但数据库中的数据全部消失了。我已经检查过数据确实存在,但它没有显示在网站上。 - Shoppyonline
我也遇到了同样的问题,我之前使用的是Mysql数据库,现在改为SQL Server后,在我的本地环境中出现了这个问题,但是没有任何意义... - jvbs
这为我提供了 PHP 错误,以确定数据库尝试连接和查询的位置。通过这个,我的问题得到了解决,只需将我的 PHP 版本从 WAMP 中的 7.0 更改为 7.3 即可...不过我不确定为什么会这样。 - Abdulaziz Hamdan

32

对我而言,问题在于php.ini文件中的一项设置。mysql.default_socket属性指向一个不存在的目录中的文件。该属性指向/var/mysql/mysql.sock,但在OSX中,该文件位于/tmp/mysql.sock

一旦我更新了php.ini中的条目并重新启动了Web服务器,问题就得到了解决。


这对我很有用,除了值被倒置了!我的php.ini指向'/tmp',但应该是'/var/mysql/mysql.sock'... 我也在OSX上(供参考) - Petar Zivkovic
3
请注意,这里有两个设置:mysql.default_socketpdo_mysql.default_socket - Glen Solsberry
1
是的!谢谢Ken。我看到了三个地方,没时间检查是什么。pdo_mysql.default_socket=/tmp/mysql.sock mysql.default_socket =/tmp/mysql.sock mysqli.default_socket =/tmp/mysql.sock - CesareoAguirre
1
在我的情况下,php.ini文件中的两个设置都是空白的,导致它使用MySQL的默认值,我猜测这个默认值是/var/mysql/mysql.sock,因为这个答案解决了我的问题。另一种解决方法是将符号链接从/tmp/mysql.sock设置到/var/mysql/mysql.sock。 - Lalo Sánchez

31

我通过更改

$db['default']['pconnect'] = TRUE;$db['default']['pconnect'] = FALSE;

/application/config/database.php 中解决了这个问题。


给你一个微笑 :),并为你点赞。 - sharif2008
没错,这对我有用。pconnect - TRUE/FALSE (布尔值) - 是否使用持久连接。 - Jez D
谢谢,这解决了我在OSX El Capitan MAMP上的问题。 - Anthony

20

$db['default']['db_debug']设置为FALSE而不是TRUE。

$db['default']['db_debug'] = FALSE;

成功了! 有什么解释吗? - Pramod Ravikant
之前的错误已经解决了,但现在出现了以下错误:**遇到 PHP 错误严重性:8192消息:mysql_escape_string():此函数已弃用,请改用 mysql_real_escape_string()。文件名:mysqli/mysqli_driver.php行号:319** - TaraGurung

5

在扩展 @Valeh Hajiyev 的清晰明了的 mysqli 驱动测试答案的基础上:

使用以下脚本在 ./config/database.php 的末尾调试您的数据库连接:

/* Your db config here */ 
$db['default'] = array(
  // ...
  'dbdriver'     => 'mysqli',
  // ...
);

/* Connection test: */

echo '<pre>';
print_r($db['default']);
echo '</pre>';

echo 'Connecting to database: ' .$db['default']['database'];

$mysqli_connection = new MySQLi($db['default']['hostname'],
                                $db['default']['username'],
                                $db['default']['password'], 
                                $db['default']['database']);

if ($mysqli_connection->connect_error) {
   echo "Not connected, error: " . $mysqli_connection->connect_error;
}
else {
   echo "Connected.";
}
die( 'file: ' .__FILE__ . ' Line: ' .__LINE__);

4

(CI 3) 对我而言,有效的方法是更改:

'hostname' => 'localhost' to 'hostname' => '127.0.0.1'

对我来说,这也是解决方案。我将我的环境变量“hostname”从“localhost”更改为“127.0.0.1”,然后它就可以工作了 :) - Pablo Camara

3
如果您只更改了这些内容,那么您可能没有在PHP配置中安装或启用mysqli驱动程序。
请使用phpinfo()检查其是否存在,或在您的php.ini文件中找到它(extension=php_mysqli....)。

谢谢您的回答。我相信从php 5.3开始,mysqli默认是启用的。但是我检查了我的php信息,看到了这个:http://d.pr/FUZ6 - Onema
1
将config.php中的日志级别更改为4,并检查app/logs/log-2011-08-31.php文件是否存在明显错误(在刷新应用程序页面后)。查找其中包含**mysqli_connect()**的行。 - Craig A Rodway

1
$db['default']['dbdriver'] = 'mysql'更改为$db['default']['dbdriver'] = 'mysqli'

1

问题解决了!

我先在XAMMP中设置好了我的整个网站,然后我不得不将其转移到LAMP中,在SUSE安装的LAMP中,我遇到了这个错误。

问题是database.php文件中的这些参数不应该被初始化。 只需将用户名和密码留空即可。 就是这样。

(我第一个猜测是因为旧版本的mysql,因为内置安装会带有较旧的版本。)


非常感谢!留空用户名和密码似乎解决了我的问题。 - Manas Bajaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接