SELECT中使用JOIN导致'id'字段异常 - SQL/PHP技术问询
问题分析与解决方案
嘿,这个问题我之前也踩过坑!核心原因是**zoekwoning和users表都有id字段,关联查询时字段名冲突,导致mysqli_fetch_assoc()返回的数组里同名字段被覆盖**。
在phpMyAdmin里能看到两个id列,但PHP的关联数组键名是唯一的,后面的users.id会直接覆盖前面的zoekwoning.id,所以你看到的$record['id']其实是用户表的ID,不是房源表的,自然会出现重复的情况。
1. 先修改SQL查询,给冲突字段加别名
把查询语句改成给zoekwoning的id起一个唯一别名,比如woning_id,这样结果集里的字段就不会冲突了:
$query = mysqli_query($conn, "SELECT zoekwoning.id AS woning_id, zoekwoning.user_id, users.* FROM zoekwoning JOIN users ON zoekwoning.user_id = users.id WHERE users.email='$session_email'");
这样你就能通过$record['woning_id']拿到房源表的ID,$record['id']则是用户表的ID,两者不会混淆。
2. 修正循环里的代码错误
另外你代码里的input标签有个小语法错误:value"'少了个等号,应该是value="',而且type="label"是不合法的input类型,改成text或者直接输出文本更合适。调整后的循环代码:
while ($record = mysqli_fetch_assoc($query)){ echo "<form action=# method=post>"; echo "<table>"; echo "<tr>"; // 用别名woning_id获取房源表的ID echo '<td><input type="text" name="woning_id" value="' . $record['woning_id'] . '"></td>'; // 直接获取user_id echo '<td><input type="text" name="user_id" value="' . $record['user_id'] . '"></td>'; echo "</tr>"; echo "</table>"; echo "</form>"; }
额外提醒:别忽略SQL注入风险
你的当前查询直接把$session_email拼进SQL语句里,存在SQL注入的安全隐患,建议改用预处理语句来避免:
// 预处理语句 $stmt = $conn->prepare("SELECT zoekwoning.id AS woning_id, zoekwoning.user_id, users.* FROM zoekwoning JOIN users ON zoekwoning.user_id = users.id WHERE users.email=?"); $stmt->bind_param("s", $session_email); // 绑定字符串类型参数 $stmt->execute(); $query = $stmt->get_result(); // 获取结果集
这样处理用户输入会更安全,尤其是涉及到登录信息的场景。
内容的提问来源于stack exchange,提问作者TDB
相关产品推荐
相关产品推荐

