Heroku部署原生PHP应用连接ClearDB报SQLSTATE[HY000] [2002]错误
问题原因及解决方案
这个报错本质是PDO连接时未正确识别到远程数据库host参数,默认尝试读取本地MySQL socket文件导致,Heroku运行环境未安装本地MySQL服务,因此触发报错,针对你的原生PHP项目可按以下步骤修复:
- 修复DSN语法错误
你的PDO连接DSN中mysql:后多了多余空格,导致PDO无法正常解析host参数,直接删除空格即可,同时建议补充ClearDB默认的3306端口参数,避免端口适配异常。 - 删除代码冗余内容
你代码末尾裸写的数据库连接串属于无效冗余内容,直接删除即可,避免敏感信息泄露、页面异常输出问题。 - 优化凭据配置(可选)
不建议硬编码数据库连接凭据到代码中,可直接读取Heroku ClearDB插件自动注入的CLEARDB_DATABASE_URL环境变量解析连接参数,后续配置变更无需修改代码。
修复后的db.php参考代码
<?php // 方案1:直接修复原有硬编码逻辑 $host = "us-cdbr-east-04.cleardb.com"; $username = "***********"; $password = "********"; $dbname = "heroku_0730a7da8e4c214"; $port = 3306; $date = date('Y-m-d H:i:s'); try{ // 核心修改:删除mysql:后的空格,新增port参数 $conn = new PDO("mysql:host=$host;port=$port;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //echo "Connection Made"; }catch(PDOException $e){ echo "Connection failed: " . $e->getMessage(); } // 方案2:用环境变量的优化版本(替换上面的硬编码参数部分即可) /* $dburl = parse_url(getenv("CLEARDB_DATABASE_URL")); $host = $dburl["host"]; $username = $dburl["user"]; $password = $dburl["pass"]; $dbname = ltrim($dburl["path"], '/'); $port = isset($dburl["port"]) ? $dburl["port"] : 3306; */ ?>
内容的提问来源于stack exchange,提问作者Emmanuel Simpson
相关产品推荐
相关产品推荐

