PHP多维数组输出问题:用户地址无法在结账表单预设值显示
我目前正在开发一个项目,目标是在最终结账表单的输入框中显示特定用户的地址信息,过程中遇到了一些问题,希望能得到帮助:
我的实现步骤
- 首先通过公共函数获取用户地址信息:
public function getUserAddress($dbh) { $sql = "SELECT street, zip, city FROM address WHERE user_id=:user"; $stmt = $dbh->prepare($sql); $stmt->bindParam(':user', $this->uid); $stmt->execute(); $userAddress = $stmt->fetchAll(PDO::FETCH_ASSOC); $this->userAddress = $userAddress; return $this->userAddress; }
- 将查询结果存入变量:
$userAddress = $user->getUserAddress($dbh);
- 由于用户有两个地址(均包含Street、City和Zip字段),我试图将地址信息存入
$templateData,方便在模板中按索引输出:
$templateData['user']['address'] = $userAdress['street'].' '.$userAddress['city'].' '.$userAddress['zip'];
遇到的问题
使用var_dump查看$templateData['user']['address']时,仅得到两个空字符串,而且模板页面中完全无法显示地址信息(路由和模板引入都没问题)。
补充:示例展示了两个地址输入区域,其中“Postort”对应“City”,“Gatuadress”对应“Street”字段。
问题分析与解决方案
作为新手很容易踩这些小坑,我帮你梳理下问题点:
笔误导致变量未正确引用
你代码里的$userAdress['street']少了一个字母d,应该是$userAddress['street']——这个笔误会直接导致获取不到值,出现空字符串。fetchAll返回的是数组的数组PDO::fetchAll(PDO::FETCH_ASSOC)返回的是包含多个地址数组的二维数组,结构大概是这样:
[ ['street' => 'xxx', 'zip' => '12345', 'city' => 'CityA'], ['street' => 'yyy', 'zip' => '67890', 'city' => 'CityB'] ]
你直接用$userAddress['street']是错误的,必须通过索引访问每个地址,比如$userAddress[0]['street'](第一个地址)、$userAddress[1]['street'](第二个地址)。
正确的实现方式
如果你想保留每个地址的独立字段,方便模板分别渲染输入框,推荐直接把整个二维数组存入$templateData:
// 直接存入完整的地址数组 $templateData['user']['addresses'] = $userAddress;
然后在模板中(以PHP原生模板为例):
<!-- 第一个地址输入框 --> <input type="text" placeholder="Gatuadress" value="<?php echo $templateData['user']['addresses'][0]['street']; ?>"> <input type="text" placeholder="Postort" value="<?php echo $templateData['user']['addresses'][0]['city']; ?>"> <input type="text" placeholder="Zip" value="<?php echo $templateData['user']['addresses'][0]['zip']; ?>"> <!-- 第二个地址输入框 --> <input type="text" placeholder="Gatuadress" value="<?php echo $templateData['user']['addresses'][1]['street']; ?>"> <input type="text" placeholder="Postort" value="<?php echo $templateData['user']['addresses'][1]['city']; ?>"> <input type="text" placeholder="Zip" value="<?php echo $templateData['user']['addresses'][1]['zip']; ?>">
如果你需要把每个地址拼接成字符串,可以用循环处理:
$templateData['user']['addresses'] = []; foreach ($userAddress as $addr) { $templateData['user']['addresses'][] = $addr['street'] . ' ' . $addr['city'] . ' ' . $addr['zip']; }
这样$templateData['user']['addresses'][0]就是第一个地址的完整字符串,[1]是第二个的。
另外,建议先执行var_dump($userAddress)确认数据库查询是否返回了正确的数据,排除数据库层面的问题~
内容的提问来源于stack exchange,提问作者Anton Andersson

