You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复制PHP+MySQL应用搭建测试服务器后登录空白问题求助

排查PHP测试环境空白页(数据库连接方向)

我把运行正常的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;
    }
    

内容的提问来源于stack exchange,提问作者kangarooChris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:03:30