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>
三、额外优化建议
- 使用预处理语句彻底防止SQL注入:上面用了
mysqli_real_escape_string()做基础防护,更安全的是用预处理语句,示例插入代码:$stmt = $db->prepare("INSERT INTO info (name, address) VALUES (?, ?)"); $stmt->bind_param("ss", $name, $address); // "ss"表示两个字符串类型参数 $stmt->execute(); - 生产环境关闭错误显示:上线时记得关闭
display_errors,改用PHP日志记录错误,避免暴露敏感信息。 - 检查数据库表结构:确保
info表存在id(自增主键)、name、address字段,否则查询和插入操作都会失败。
内容的提问来源于stack exchange,提问作者be33
相关产品推荐
相关产品推荐

