PHP开发动态个人资料页持续报错 附代码及数据库结构
问题分析及修复方案
核心错误点
- 数据库名不匹配:SQL导出文件创建的数据库名为
bitr2,但PHP代码中连接的数据库名为bitr,无法读取到对应库的用户表 - SQL语法错误:
gebruikersnaam是字符串类型字段,直接拼接$username变量没有加单引号包裹,SQL会将传入的用户名识别为字段名而非查询值,触发语法报错 - PDO使用不规范:直接将用户传入的
$_GET['user']参数拼接进SQL语句,既容易触发语法错误,也存在SQL注入风险 - 缺少参数校验:未判断GET参数
user是否存在,参数为空时会触发额外报错 - 跳转逻辑未终止执行:
header('Location: login.php')之后没有加exit终止代码运行,未登录用户仍能执行后续查询逻辑
修复后的完整代码
<?php $host = 'localhost'; // 修正数据库名和导出文件一致 $db = 'bitr2'; $user = 'root'; $pass = ''; $charset = 'utf8mb4'; try { $connect = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass); $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("数据库连接失败:" . $e->getMessage()); } session_start(); if (empty($_SESSION["userID"])) { header('Location: login.php'); exit; } // 校验参数是否存在 if (!isset($_GET['user']) || trim($_GET['user']) === '') { die("缺少用户查询参数"); } $username = $_GET['user']; // 使用PDO参数绑定,避免拼接SQL $datapdo2 = "SELECT * FROM users WHERE gebruikersnaam = ?"; $stmtpdo2 = $connect->prepare($datapdo2); // 执行时传入参数,PDO会自动处理引号和转义 $stmtpdo2->execute([$username]); $rowpdo2 = $stmtpdo2->fetchAll(PDO::FETCH_ASSOC); foreach ($rowpdo2 as $users) { echo "<tr>"; // 输出加htmlspecialchars避免XSS攻击 echo "<th>" . htmlspecialchars($users['omschrijving']) . "</th>"; echo "</tr>"; } ?>
内容的提问来源于stack exchange,提问作者Mauro
相关产品推荐
相关产品推荐

