PHP中如何将一个表的查询值用于另一个表的条件查询?
你的代码问题分析与修复方案
嘿,我一眼就看到你代码里的关键问题啦,咱们一步步来解决:
最直接的错误:忘记读取查询结果
你执行了mysql_query获取voter表的数据,但根本没把结果集里的行取出来赋值给$row!这就导致$row['state']这个变量完全不存在,程序肯定会报错。
额外的安全与兼容性问题
另外还有两个重要问题得注意:
- SQL注入风险:直接把
$_SESSION[voter_id]和$state拼进SQL语句里,恶意用户很容易通过构造特殊值来篡改你的数据库查询,甚至破坏数据! - 函数废弃:
mysql_*系列函数早就被PHP官方废弃了,PHP7及以上版本直接移除了这些函数,用它们的话程序早晚会出问题,建议换成mysqli或者PDO。
先给你修复原代码(基于mysql扩展,仅临时解决)
先补上缺失的步骤,同时加上简单的防注入处理:
// 先确保Session已经启动 if (!isset($_SESSION)) { session_start(); } // 查询voter数据后,必须取出结果行 $voter_query = mysql_query("SELECT * FROM voter where voter_id='{$_SESSION['voter_id']}'") or die("There are no records to display ... \n" . mysql_error()); // 关键步骤:从结果集中获取一行数据到$row $row = mysql_fetch_assoc($voter_query); // 先判断是否取到了数据,避免空值报错 if ($row) { $state = $row['state']; // 转义变量防止SQL注入 $safe_state = mysql_real_escape_string($state); $result = mysql_query("SELECT * FROM Candidates WHERE candidate_region = '$safe_state'") or die(" There are no records at the moment ... \n" . mysql_error()); // 这里可以继续处理候选人的查询结果,比如循环输出 // while ($candidate_row = mysql_fetch_assoc($result)) { ... } } else { die("找不到该投票人的信息!"); }
推荐的长期解决方案:改用mysqli预处理语句
因为mysql_*函数已经被淘汰,我更推荐你用mysqli的预处理语句,既安全又兼容新版本PHP:
// 启动Session if (!isset($_SESSION)) { session_start(); } // 连接数据库(替换成你的数据库账号密码和库名) $db_conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名'); if (!$db_conn) { die("数据库连接失败:" . mysqli_connect_error()); } // 第一步:查询投票人的state,用预处理语句防注入 $voter_stmt = mysqli_prepare($db_conn, "SELECT state FROM voter WHERE voter_id = ?"); // 绑定参数:"s"表示参数是字符串类型 mysqli_stmt_bind_param($voter_stmt, "s", $_SESSION['voter_id']); mysqli_stmt_execute($voter_stmt); // 绑定结果到$state变量 mysqli_stmt_bind_result($voter_stmt, $state); // 如果查询到数据,就继续查询候选人 if (mysqli_stmt_fetch($voter_stmt)) { // 第二步:查询对应地区的候选人,同样用预处理 $candidate_stmt = mysqli_prepare($db_conn, "SELECT * FROM Candidates WHERE candidate_region = ?"); mysqli_stmt_bind_param($candidate_stmt, "s", $state); mysqli_stmt_execute($candidate_stmt); // 获取结果集 $candidate_result = mysqli_stmt_get_result($candidate_stmt); // 遍历候选人数据 while ($candidate_row = mysqli_fetch_assoc($candidate_result)) { // 这里可以输出候选人信息,比如: // echo "候选人姓名:" . $candidate_row['name'] . "<br>"; } } else { die("找不到该投票人的信息!"); } // 记得关闭语句和连接 mysqli_stmt_close($voter_stmt); mysqli_stmt_close($candidate_stmt); mysqli_close($db_conn);
内容的提问来源于stack exchange,提问作者Prime coder
相关产品推荐
相关产品推荐

