我将使用MySQL的部分更新为 PDO ,以显示<{strong> Smarty 的{html_options}
。这段代码实际上适用于MySQL,但我不知道如何使用 PDO 获得相同的结果。
这是实际运作良好的代码:
// Send states
$q="SELECT id, state FROM states";
$data=$db->execute($q);
$idStates=array();
$states =array();
for ($i=0; $i<sizeof($data);$i++) {
array_push($idStates,$data[$i]->id);
array_push($states,$data[$i]->state);
}
$smarty->assign('idStates',$idStates);
$smarty->assign('states',$states);
然后一切都在.tpl文件中运行良好
<select name="des_idState" class="form-control">
<option>Select state</option>
{html_options output="$states" values="$idStates" selected=$data.idState}
</select>
我正在尝试使用{foreach}
,但我需要使用selected
,我认为最简单的方法是使用Smarty的{html_options},但我不会#39} ;我知道如何从PDO发送数组。
$sql1="SELECT id, state FROM states";
$stmt = $dba->prepare($sql1);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$idStates = $row['id'];
$states = $row['state'];
$smarty->assign('idStates', $idStates);
$smarty->assign('states',$states);
}
我一直在尝试使用此代码向我展示使用echo $idStates . ' ' . $states . '<br>';
的数组,但它不会在{html_options}中工作,没有显示,没有错误,只是一个空格。
有人能帮助我吗?
答案 0 :(得分:0)
我知道这个问题已经发布已经有一段时间了,但你有没有找到解决问题的方法?我相信您可以将 id 和状态变量修改为具有最少代码修改的数组。
在下面的示例中,我在开头添加了id和state数组声明,以确保数组为空(作为下一步的预防措施)。然后,我将$idStates=
更改为$idStates[]=
,将$states=
更改为$states[]=
,这会将当前值添加到每个循环上的那些数组中。最后,我将smarty变量赋值移到了while循环之后,以便完全填充数组。这是修改后的代码:
$sql1="SELECT id, state FROM states";
$stmt = $dba->prepare($sql1);
$stmt->execute();
$idStates = array();
$states = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$idStates[] = $row['id'];
$states[] = $row['state'];
}
$smarty->assign('idStates', $idStates);
$smarty->assign('states',$states);
我还在下面提供了一个替代解决方案,它应该返回相同的数据。在此示例中,我使用$stmt->fetchAll
而不是$stmt->fetch
一次获取所有行,然后将它们存储在关联数组中。然后我在声明聪明的赋值时使用array_column,它将$rows
关联数组中的id和state列分开。这样可以减少代码,而不会牺牲可读性:
$sql1 = "SELECT id, state FROM states";
$stmt = $dba->prepare($sql1);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$smarty->assign('idStates', array_column($rows, 'id'));
$smarty->assign('states', array_column($rows, 'states'));