为何部署到Heroku的PHP应用无法加载ClearDB数据库?
解决Heroku部署PHP网站出现
mysql_connect()未定义的致命错误 你的问题根源其实很清晰——mysql_connect()这个函数在PHP 7及以上版本中已经被彻底移除了,而你的Cloud9开发环境应该还在用PHP 5.x版本(这个版本还保留着旧的mysql扩展),所以本地运行完全正常,但部署到Heroku后,Heroku默认的PHP环境是较新版本,自然找不到这个函数,才会出现页面空白、日志报致命错误的情况。
下面是具体的解决步骤:
1. 替换旧的mysql扩展为mysqli或PDO
这是最核心的解决办法,PHP官方早就推荐用mysqli(改进版MySQL扩展)或者PDO(数据库抽象层)替代旧的mysql扩展,两者都能在新版本PHP中正常工作。
示例:把mysql_connect()换成mysqli_connect()
假设你CoffeeModel.php第30行的原代码是这样的:
$conn = mysql_connect($db_host, $db_user, $db_pass); mysql_select_db($db_name, $conn);
可以改成mysqli的过程式写法:
// 连接时直接指定数据库名,省去单独选库的步骤 $conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name); // 别忘了检查连接是否成功 if (mysqli_connect_errno()) { die("数据库连接失败: " . mysqli_connect_error()); }
如果更习惯面向对象写法,也可以这样写:
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name); if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); }
注意:后续的数据库操作也要同步替换成mysqli的方法,比如
mysql_query()要换成mysqli_query(),mysql_fetch_assoc()换成mysqli_fetch_assoc()等。
可选:改用PDO连接数据库
PDO支持多种数据库,代码通用性更强,示例如下:
try { $conn = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8", $db_user, $db_pass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("数据库连接失败: " . $e->getMessage()); }
2. 确认Heroku的PHP版本(可选)
如果你的代码还有其他依赖旧PHP版本的部分,可以在项目根目录创建composer.json文件,指定兼容的PHP版本,比如:
{ "require": { "php": ">=7.4" } }
不过更建议直接升级代码到适配新版本PHP的写法,毕竟旧的mysql扩展已经被淘汰多年了。
3. 测试与重新部署
修改完代码后,先在本地测试(如果Cloud9能切换到PHP7+版本测试最好),确认功能正常后再部署到Heroku,之后查看Heroku日志,确认错误是否已经消失。
内容的提问来源于stack exchange,提问作者Bwoods
相关产品推荐
相关产品推荐

