如何发送一个带有pdo的数组,以便在smarty 3.1.21的html_options中使用它

时间:2017-02-14 20:53:11

标签: php mysql arrays pdo smarty

我将使用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}中工作,没有显示,没有错误,只是一个空格。

有人能帮助我吗?

1 个答案:

答案 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'));