复制PHP+MySQL应用搭建测试服务器后登录空白问题求助
我把运行正常的PHP+MySQL应用复制到新目录搭建测试环境,保留了原数据库登录信息(没改
site_constant.php里的配置),但测试环境登录时出现空白页,代码完全没改,怀疑是数据库连接失败,附上相关代码片段,求排查方向:入口代码片段:
require_once("site_constant.php"); require_once("lib/mysql.php"); require_once("lib/function.php"); $DBObject = new db_sql(); $link = $DBObject->db_connect(DB_SERVER,DB_SERVER_USERNAME,DB_SERVER_PASSWORD, DB_DATABASE) or die('DB not connect');
site_constant.php配置(未修改):define('DB_SERVER','xxxx'); define('DB_SERVER_USERNAME','xxxxx'); define('DB_SERVER_PASSWORD','xxxxx'); define('DB_DATABASE','xxxxxx'); define('SITE_URL', 'xxxxxxx');
lib/mysql.php的连接函数:function db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link') { global $$link; $$link =mysql_connect($server, $username, $password); if($$link) { $$link=mysql_select_db($database); if(!$$link) { $msg="Can't connect from Database";...
碰到这种复制代码后测试环境出空白页的情况,我给你几个针对性的排查方向,结合你的代码来看:
先强制显示PHP错误,别靠猜问题
空白页90%是PHP报错但没输出,先在你的入口文件最顶部加上这两行代码:error_reporting(E_ALL); ini_set('display_errors', 1);刷新页面就能看到具体的错误信息——是扩展没装?权限不够?还是路径错了?比瞎猜高效太多。
检查测试环境的PHP版本和扩展
你用的是mysql_connect(),这个函数在PHP 5.5就被标记为废弃,PHP 7直接移除了。如果测试环境的PHP版本比线上高,那肯定直接报错导致空白页。
可以在测试环境新建一个phpinfo.php,内容写<?php phpinfo(); ?>,访问后搜索mysql,看看有没有这个扩展的相关信息。如果没有,要么换成mysqli或PDO(推荐),要么临时降低PHP版本(不建议长期用)。验证数据库账号的访问权限
很多线上数据库的账号会限制只能从特定IP访问(比如线上服务器的IP),如果测试服务器的IP不在白名单里,就算密码正确也连不上。
你可以登录数据库服务器,执行这条SQL看看账号的允许访问范围:SELECT host FROM mysql.user WHERE user='你的数据库用户名';如果结果只有线上服务器的IP,就给测试服务器的IP添加权限,或者临时改成
%(允许所有IP访问,仅限测试环境用)。确认文件路径和权限没问题
虽然你说没改代码,但require_once用的是相对路径,测试环境的目录结构是不是和线上完全一致?比如入口文件所在目录下有没有lib/mysql.php?
可以在入口文件里加一行var_dump(file_exists("lib/mysql.php"));,看看能不能找到这个文件。另外,检查PHP进程有没有读取这些文件的权限,临时给文件加755权限试试。修复连接函数的逻辑bug
看你db_connect函数里的逻辑有个明显问题:成功连接MySQL后,你把mysql_select_db的返回值(布尔值)覆盖了之前的连接资源变量$$link!
比如:- 连接MySQL成功,
$$link是一个有效的连接资源 - 然后执行
$$link=mysql_select_db($database);,不管选库成功还是失败,$$link都会变成true或false
后面用这个变量操作数据库肯定出错!线上可能刚好选库没失败,所以没暴露,但测试环境可能因为某种原因选库失败,直接触发了这个bug。
改成正确的逻辑:
function db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link') { global $$link; $$link = mysql_connect($server, $username, $password); if($$link) { // 单独判断选库结果,不要覆盖连接资源 $db_selected = mysql_select_db($database, $$link); if(!$db_selected) { $msg="Can't select database: ".mysql_error(); die($msg); } } else { $msg="Can't connect to MySQL server: ".mysql_error(); die($msg); } return $$link; }- 连接MySQL成功,
内容的提问来源于stack exchange,提问作者kangarooChris

