首页 > 解决方案 > 将数据库配置与连接分离

问题描述

我正在尝试与数据库建立连接,同时将数据库配置信息与连接分开。

这是我写的代码

数据库配置信息:

$config = array(
"database" => array(
   "host" => "host",
   "username" => "username",
   "password" => "password",
   "name" => "name",
)
);

define("databse_config", $config["database"]);

$config normaly 还包含与问题无关的其他信息,这就是我定义“database_config”的原因。

数据库连接:


require_once "config.php";
define("DB_HOST", databse_config['host']);
define("DB_USERNAME", databse_config['username']);
define("DB_PASSWORD", databse_config['password']);
define("DB_NAME", databse_config['name']);

function connect()
{
    $dbhost = DB_HOST;
    $dbuser = DB_USERNAME;
    $dbpass = DB_PASSWORD;
    $dbname = DB_NAME;

    try {
        $conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        $conn->exec("set names utf8");
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conn;
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
}

connect();

我一直遇到的问题是试图执行页面不断加载的功能并最终输出以下错误:

连接失败:SQLSTATE[HY000] [2002] 连接超时

我对 PDO 还很陌生,所以我在使用 mysqli 时也尝试了同样的方法,得到了相同的结果。

任何帮助,将不胜感激。

标签: phpmysqldatabasepdo

解决方案


连接失败:SQLSTATE[HY000] [2002] 连接超时

这意味着 php 尝试建立与您的数据库服务器的 TCP/IP 连接并失败。您提供了一个DB_HOST无法从您的 php 程序位置通过网络访问的主机名。

主机名值可能丢失,或者可能是错误的。如果您通过名称 ( mysql-server.example.com) 提供它,则此错误消息会告诉您 DNS 名称查找成功。

因此,您的 php 向服务器发送 TCP/IP 连接请求。该请求永远不会得到响应。这意味着某处有防火墙阻止了连接,或者没有从您的 php 程序到网络的网络路由。

这一切都意味着$dbhost您的操作中的值是错误的new PDO()

您的代码可以像这样简化很多,而不会损失模块化。sprintf()有帮助。更简单的是故障排除。

require_once "config.php";
function connect()
{
    try {
        $connectionString = sprintf ("mysql:host=%s;dbname=%s", 
                                      database_config['host'],
                                      database_config['name']);
        $conn = new PDO($connectionString, 
                        database_config['username'],
                        database_config['password']);
        $conn->exec("set names utf8");
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conn;
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
}    
connect();

你可以echo $connectionString;看到里面有什么,并确保它不是奇怪的东西。


推荐阅读