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

PHP MySQL连接失败及CRUD保存后空白页问题求助

问题排查与修复方案

你的代码主要有两个核心问题:数据库连接混用废弃扩展和缺少错误处理/必要配置,直接导致了数据库连接失败和保存后页面空白的情况。下面一步步拆解修复:

一、核心问题分析

1. 混用mysql_*和mysqli_*扩展

你在server.php里用了已被PHP废弃的mysql_connect()和mysql_select_db(),但后续数据库操作却用了mysqli_query()——这两个扩展完全不兼容,根本无法共享连接,直接导致数据库连接失败,所有后续数据库操作都会静默报错。

2. 缺少SESSION初始化

你使用了$_SESSION['message']存储提示信息,但没有调用session_start()初始化SESSION,这会触发PHP错误。而默认情况下PHP可能关闭了错误显示,最终导致页面空白。

3. 无错误调试机制

页面空白大概率是因为PHP报错但没显示,开发阶段必须开启错误显示才能快速定位问题。

4. 数据库连接未做错误检查

连接数据库或选择数据库失败时,没有任何错误提示,无法判断是账号密码错误、数据库不存在还是其他问题。


二、修复后的完整代码

修复后的server.php

<?php
// 开发阶段开启错误显示(上线后务必关闭)
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 初始化SESSION,必须在输出任何HTML前调用
session_start();

$name = "";
$address = "";
$id = "";
$update = false;

// 使用mysqli扩展正确连接数据库,同时指定数据库名,并检查连接错误
$db = mysqli_connect("localhost", "user", "password", "crud");
if (!$db) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 处理保存操作
if (isset($_POST['save'])) {
    // 转义输入防止SQL注入(更安全的方式是用预处理语句,后面会提)
    $name = mysqli_real_escape_string($db, $_POST['name']);
    $address = mysqli_real_escape_string($db, $_POST['address']);
    
    // 执行插入操作并检查是否成功
    $result = mysqli_query($db, "INSERT INTO info (name, address) VALUES ('$name', '$address')");
    if ($result) {
        $_SESSION['message'] = "地址已成功保存";
    } else {
        $_SESSION['message'] = "保存失败: " . mysqli_error($db);
    }
    header('location: index.php');
    exit; // 跳转后必须exit,防止后续代码继续执行
}

$results = mysqli_query($db, "SELECT * FROM info");
?>

修复后的index.php(增加提示信息显示)

<?php 
session_start(); // 这里也要开启SESSION才能读取提示信息
include('server.php'); 
?>
<!DOCTYPE html>
<html>
<head>
<title>CRUD: CReate, Update, Delete PHP MySQL</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<!-- 显示操作提示信息 -->
<?php if (isset($_SESSION['message'])): ?>
    <div class="msg">
        <?php 
        echo $_SESSION['message']; 
        unset($_SESSION['message']); // 显示后清除提示,避免重复显示
        ?>
    </div>
<?php endif ?>

<form method="post" action="server.php" >
<div class="input-group">
<label>Name</label>
<input type="text" name="name" value="">
</div>
<div class="input-group">
<label>Address</label>
<input type="text" name="address" value="">
</div>
<div class="input-group">
<button class="btn" type="submit" name="save" >Save</button>
</div>
</form>

<?php $results = mysqli_query($db, "SELECT * FROM info"); ?>
<table>
<thead>
<tr>
<th>Name</th>
<th>Address</th>
<th colspan="2">Action</th>
</tr>
</thead>
<?php while ($row = mysqli_fetch_array($results)) { ?>
<tr>
<td><?php echo $row['name']; ?></td>
<td><?php echo $row['address']; ?></td>
<td>
<a href="index.php?edit=<?php echo $row['id']; ?>" class="edit_btn" >Edit</a>
</td>
<td>
<a href="server.php?del=<?php echo $row['id']; ?>" class="del_btn">Delete</a>
</td>
</tr>
<?php } ?>
</table>
</body>
</html>

三、额外优化建议

  1. 使用预处理语句彻底防止SQL注入:上面用了mysqli_real_escape_string()做基础防护,更安全的是用预处理语句,示例插入代码:
    $stmt = $db->prepare("INSERT INTO info (name, address) VALUES (?, ?)");
    $stmt->bind_param("ss", $name, $address); // "ss"表示两个字符串类型参数
    $stmt->execute();
    
  2. 生产环境关闭错误显示:上线时记得关闭display_errors,改用PHP日志记录错误,避免暴露敏感信息。
  3. 检查数据库表结构:确保info表存在id(自增主键)、name、address字段,否则查询和插入操作都会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:27:15