迁移至StackCP后PHP PDO数据库连接报错SQLSTATE[HY000] [2002]
数据库连接故障的可能原因及解决方法
1. DSN格式错误(最可能的触发因素)
你的DSN字符串中host = $host部分包含多余空格,PDO会将带有空格的host = sdb-72.hosting.stackcp.net当作完整主机名解析,自然无法找到正确的数据库地址。
解决方法:去掉host与等号、等号与主机名之间的空格,修改DSN定义:
$dsn = "mysql:host=$host;dbname=$dbname";
2. 变量作用域问题
在List_Links函数内通过require加载配置文件后,配置中的$dsn、$username等变量默认属于函数局部作用域。如果配置文件中的变量是全局声明的,函数内未明确获取的话,会导致使用未定义或错误的参数创建PDO连接。
解决方法:
- 方案一:在函数开头声明全局变量
function List_Links($tableName,$idField,$url,$comments,$start) { global $dsn, $username, $password, $options; // ... 后续代码 } - 方案二:修改配置文件为数组返回形式
把nrcon_config.php改为:
函数内调用:return [ 'host' => 'sdb-72.hosting.stackcp.net', 'username' => 'XXXXXXXX', 'password' => 'XXXXXXXX', 'dbname' => 'information', 'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ];$config = require $p1; $dsn = "mysql:host={$config['host']};dbname={$config['dbname']}"; $connection = new PDO($dsn, $config['username'], $config['password'], $config['options']);
3. 数据库端口未指定
StackCP的数据库服务可能未使用MySQL默认的3306端口,未指定正确端口会导致连接失败。
解决方法:向服务商确认数据库端口,在DSN中添加端口参数,例如:
$dsn = "mysql:host=$host;port=3307;dbname=$dbname";
4. 数据库用户权限限制
迁移后,数据库用户可能未被授予从当前Web服务器IP访问目标数据库的权限,即使主机地址正确,也会被数据库拒绝连接。
解决方法:登录StackCP控制面板,进入数据库管理页面,检查对应数据库用户的访问权限,确保允许当前Web服务器的IP地址(或服务商指定的IP范围)访问。
5. PDO MySQL扩展未启用
新的StackCP环境可能未启用pdo_mysql扩展,导致PHP无法通过PDO连接MySQL数据库。
解决方法:创建一个包含phpinfo();的PHP文件,访问后查看是否存在pdo_mysql相关模块信息。若未启用,联系服务商在PHP配置中开启该扩展。
内容的提问来源于stack exchange,提问作者Mike Jablonski
相关产品推荐
相关产品推荐

