PHP分文件处理:数据库数据存server.php后在index.php表格展示失败求助
问题排查与解决方案
我来帮你一步步拆解问题,你的代码里有几个关键错误直接导致了无输出的情况:
1. 会话(Session)未初始化
不管是server.php还是index.php,都没有调用session_start()——PHP默认不会自动启动会话,没有这行代码,$_SESSION变量完全无法使用,相当于你存的数据根本没地方放,取的时候自然是空的。
2. 变量名拼写错误
在server.php中,你把查询到的数据存入了$all_data数组,但最后赋值给Session的时候写成了$alldata(少了下划线):
$all_data[] = $toadd; // ... $_SESSION['Data'] = $alldata; // 这里应该是$all_data
这个小错误会导致Session里存的是一个未定义的变量,自然没有内容输出。
3. 数据库连接变量不匹配
你用$db = new mysqli(...)创建了数据库连接,但执行查询的时候却用了$conn->query($sql)——$conn根本没有定义,应该用$db->query($sql)来执行查询。
4. 输出逻辑错误
修改后的index.php里,你直接把$_SESSION['Data']塞到一个<td>里:
- 如果
$_SESSION['Data']是数组,直接echo会显示Array而不是实际内容; - 原来的逻辑是每一行数据对应一个
<tr>,现在所有内容都挤在一个<tr>里,HTML结构完全错误。
5. 严重的SQL注入风险
直接把$_POST['Category']拼接到SQL语句里,会让你的数据库暴露在SQL注入攻击下,必须用预处理语句修复这个漏洞。
修正后的完整代码
1. server.php(修复会话、变量名、连接、SQL注入)
<?php session_start(); // 必须先启动会话才能使用$_SESSION if (isset($_POST['Category'])) { $gotcategory = $_POST['Category']; // 初始化数据库连接并检查错误 $db = new mysqli('localhost', 'root', '', 'db'); if ($db->connect_error) { die("Connection failed: " . $db->connect_error); } // 使用预处理语句防止SQL注入 $sql = "SELECT pname, pnumber, description, area, plname, plemail, plnumber, pmname, pmemail, pmnumber, pteam, status FROM data WHERE category=?"; $stmt = $db->prepare($sql); $stmt->bind_param("s", $gotcategory); // "s"表示参数为字符串类型 $stmt->execute(); $result = $stmt->get_result(); $all_data = array(); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { // 只存原始数据,把HTML渲染逻辑交给index.php处理 $all_data[] = $row; } $_SESSION['Data'] = $all_data; } else { $_SESSION['Data'] = "No data"; } // 清理资源 $stmt->close(); $db->close(); // 表单提交后跳回index.php展示数据 header("Location: index.php"); exit(); } ?>
2. index.php(修复会话、输出逻辑)
<?php session_start(); // 启动会话才能读取$_SESSION中的数据 ?> <table class="w3-table-all w3-responsive w3-hoverable"> <tr class="w3-grey"> <th><b>Project Name</b></th> <th><b>Project Number</b></th> <th><b>Description</b></th> <th><b>Area</b></th> <th><b>Project Leader Name</b></th> <th><b>Project Leader Email</b></th> <th><b>Project Leader Number</b></th> <th><b>Project Manager Name</b></th> <th><b>Project Manager Email</b></th> <th><b>Project Manager Number</b></th> <th><b>Project Team</b></th> <th><b>Project Status</b></th> </tr> <?php // 检查Session中是否有数据 if (isset($_SESSION['Data'])) { if (is_array($_SESSION['Data'])) { // 循环输出每一行数据 foreach ($_SESSION['Data'] as $row) { echo "<tr>"; // 使用htmlspecialchars防止XSS攻击 echo "<td>" . htmlspecialchars($row["pname"]) . "</td>"; echo "<td>" . htmlspecialchars($row["pnumber"]) . "</td>"; echo "<td>" . htmlspecialchars($row["description"]) . "</td>"; echo "<td>" . htmlspecialchars($row["area"]) . "</td>"; echo "<td>" . htmlspecialchars($row["plname"]) . "</td>"; echo "<td>" . htmlspecialchars($row["plemail"]) . "</td>"; echo "<td>" . htmlspecialchars($row["plnumber"]) . "</td>"; echo "<td>" . htmlspecialchars($row["pmname"]) . "</td>"; echo "<td>" . htmlspecialchars($row["pmemail"]) . "</td>"; echo "<td>" . htmlspecialchars($row["pmnumber"]) . "</td>"; echo "<td>" . htmlspecialchars($row["pteam"]) . "</td>"; echo "<td>" . htmlspecialchars($row["status"]) . "</td>"; echo "</tr>"; } } else { // 无数据时输出提示行 echo "<tr><td colspan='12'>" . $_SESSION['Data'] . "</td></tr>"; } // 用完后清除Session,避免刷新页面重复显示旧数据 unset($_SESSION['Data']); } else { // 未查询时的提示 echo "<tr><td colspan='12'>No data queried yet</td></tr>"; } ?> </table>
额外说明
如果是通过AJAX调用server.php(而非表单提交),那server.php不需要跳转到index.php,而是直接返回JSON数据,再用前端JS渲染表格:
// server.php替换跳转代码为: header('Content-Type: application/json'); echo json_encode($all_data ?? "No data"); exit();
内容的提问来源于stack exchange,提问作者Slalem
相关产品推荐
相关产品推荐

