Codeigniter无法连接到外部SQL服务器。

4
我正在尝试将我的CodeIgniter框架连接到外部数据库,但出现错误。

数据库错误发生,无法使用提供的设置连接到您的数据库服务器。 文件名:core / Loader.php 行号:346

然后,我将这个插入到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__); 

但是它显示:

遇到了 PHP 错误 严重程度:8192 消息:mysql_connect():mysql 扩展已弃用,将来会被移除:请改用 mysqli 或 PDO 文件名:config/database.php 行号:79

遇到了 PHP 错误 严重程度:警告 消息:mysql_connect():无法连接到 MySQL 服务器 '167.114.xxx.xxx'(111) 文件名:config/database.php 行号:79

无法连接到数据库,原因是:无法连接到 MySQL 服务器 '167.114.xxx.xxx'(111)

然后我尝试在 codeigniter 目录之外(在 public_html 中)创建这个文件。

<?php
$servername = "167.114.xxx.xxx";
$username = "myusername";
$password = "dbpass";
$database = "dbname";

// Create connection
$conn = mysql_connect($servername, $username, $password, $database);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
echo "Connected successfully";
?>

它显示连接成功。那么,我应该怎么做?同时,config/database.php中的数据库细节与上述相同。


您尝试连接的CodeIgniter之外的连接是否在同一服务器上?您确定MySQL服务器正在接受外部连接并且用户拥有正确的权限吗? - BeoWulf
警告:您正在使用已被最新版本的PHP完全删除的过时的数据库API。您应该使用现代替代品 - Quentin
@BeoWulf 是的,我尝试的连接与CodeIgniter在同一台服务器上。如果它没有接受外部连接的权限,第二个连接如何输出“连接成功”? - Yudhistira Bayu
@YudhistiraBayu,它会显示“连接成功”,因为您使用了错误的方法。属性->connection_error仅适用于MySQLi,而不适用于(已弃用的)MySQL库。因此,永远不会有$conn->connect_error,因此条件永远不会成立。在您的情况下正确的做法是if(!$conn)。而最正确的方法是切换到MySQLi或PDO。请参见下面我的答案以获取正确的方法。 - Jefrey Sobreira Santos
2个回答

0

默认情况下,MySQL会拒绝来自外部的连接。

你的MySQL服务器在哪里?通常,如果你使用某些Web托管服务,他们允许你从CPanel解锁外部连接。请注意,大多数服务商需要一些时间才能真正激活它。

此外,请注意mysql_connect不返回对象,而只返回一个资源(连接ID)。因此,如果你仍然想使用已弃用(旧)的MySQL API,请执行以下操作:

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); // note that if the port is different from 3306, you must do: 'server:port'
if (!$link) {
    die('Could not connect ' . mysql_error());
}
echo 'Connection successfull';
mysql_close($link);

然而,建议使用 MySQLi 或 PDO,因为 MySQL 扩展已经被弃用,长时间没有更新,缺乏 OOP 支持,缺乏新的 MySQL 功能支持等等。

从 PHP 手册中选择使用 MySQLI 的替代方案:

<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;

mysqli_close($link);

0

1)查看/etc/mysql/my.cnf文件,并添加以下行:

bind-address = 0.0.0.0
# skip-networking

2) 运行 /etc/init.d/mysql restart 或类似的命令来重启 MySQL 以打开外部连接。

3) 进入 MySQL 控制台并执行:

GRANT ALL ON database_name.* to 'remote_user'@'app_servers_global_ip' IDENTIFIED BY 'very_hard_password';
FLUSH PRIVILEGES;

4) 在您的config/database.php文件中确保有这段代码

$active_group = 'remote';
$query_builder = TRUE;

$db['remote'] = array(
    'dsn'   => '',
    'hostname' => 'database_remote_ip_here',
    'username' => 'remote_user',
    'password' => 'very_hard_password',
    'database' => 'database_name',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => FALSE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => FALSE
);

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