PHP中如何获取两关联表中同名created_at列的数据?
如何获取关联查询中重复字段名的值?
这问题我之前也碰到过!核心原因是你用SELECT u.*, ud.*查询时,两个表都有created_at字段,返回的结果数组里会出现重复的键名。PDO的FETCH_ASSOC模式下,后面的字段值会覆盖前面的——也就是说,要么ud.created_at覆盖了u.created_at,要么反过来,具体取决于SQL里字段的顺序。如果被覆盖后那个字段的值是空的,页面自然就没输出了,而像id和userid这种唯一的字段就不会有覆盖问题,所以能正常输出。
解决办法很简单,给重复的字段起别名就行,让结果集里的键名唯一。这里有两种实用方式:
方式一:给重复字段单独加别名
修改你的SQL语句,明确给两个created_at设置不同的别名:
$askforuser = $db->query("SELECT u.*, ud.*, u.created_at AS user_created_at, -- 给users表的created_at起别名 ud.created_at AS detail_created_at -- 给user_detail表的created_at起别名 FROM users u INNER JOIN user_detail ud ON ud.userid=u.id"); $askforuser1 = $askforuser->fetchAll(PDO::FETCH_ASSOC);
之后在循环里就能分别调用两个字段的值了:
foreach ($askforuser1 as $udet) { extract($udet); echo "用户表创建时间:" . $user_created_at . "<br>"; echo "用户详情表创建时间:" . $detail_created_at . "<br>"; }
方式二:明确列出所有需要的字段(更推荐)
如果不想用u.*或ud.*避免潜在的其他重复字段问题,可以直接列出需要的字段,同时给重复字段加别名:
$askforuser = $db->query("SELECT u.id, u.username, u.email, u.created_at AS user_created_at, ud.userid, ud.phone, ud.address, ud.created_at AS detail_created_at FROM users u INNER JOIN user_detail ud ON ud.userid=u.id");
这种方式更清晰,也能避免其他你没注意到的重复字段导致的覆盖问题。
另外,其实不太推荐用extract(),因为它会把数组的键直接变成变量,容易造成变量冲突或者意外覆盖。更稳妥的方式是直接通过数组键访问:
foreach ($askforuser1 as $udet) { echo "用户表创建时间:" . $udet['user_created_at'] . "<br>"; echo "用户详情表创建时间:" . $udet['detail_created_at'] . "<br>"; }
内容的提问来源于stack exchange,提问作者uhbc
相关产品推荐
相关产品推荐

