php - 将数据库配置与连接分离
问题描述
我正在尝试与数据库建立连接,同时将数据库配置信息与连接分开。
这是我写的代码
数据库配置信息:
$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 时也尝试了同样的方法,得到了相同的结果。
任何帮助,将不胜感激。
解决方案
连接失败: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;
看到里面有什么,并确保它不是奇怪的东西。
推荐阅读
- swift - 如何让函数在 Swift 中播放不同的声音
- prometheus - Prometheus 与 Central/Master Netdata 服务器的集成
- python - 将 Python 数据帧写入 Oracle
- android - 列表中的更改将更改应用于另一个列表
- ruby - 我的 Rubocop 不喜欢 Ruby 错误处理中的 => e。不是 => e 标准吗?
- typescript - 量角器测试 - 如何定义一次导入和常量,而不是在每个测试规范文件中重复它们?
- sass - Grunt - scss 未编译 - gruntFile.js
- javascript - 测试是否有defaultChecked时如何检查复选框?
- sql-server - 在 Java EE 中使用最终用户的凭据通过 JPA 访问数据库
- boost - 如何在 boost::ptree 中获取节点的名称(不是孩子的名称,我们只知道文件名)