2017-02-14 1 views
1

Я обновляю раздел, который использует MySQL для PDO, чтобы показать {html_options} из Smarty. Этот код хорошо работает с MySQL, но я не знаю, как получить такие же результаты, используя PDO.Как отправить массив с PDO, чтобы использовать его в html_options из Smarty 3.1.21

Это код, который хорошо работает на самом деле:

// 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> 

То, что я пытаюсь сделать с PDO работает хорошо, используя {foreach}, но Мне нужно использовать selected, и я думаю, что это проще всего сделать с помощью {html_options} Smarty, но я не знаю, как отправить массив из 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

Я знаю, что прошло какое-то время, так как этот вопрос был опубликован, но вы когда-нибудь находили решение своей проблемы? Я считаю, что вы можете исправить 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 при объявлении присвоений smarty, который отделяет столбцы id и state от ассоциативного массива $rows. Это приводит к меньшему количеству кода без ущерба для удобочитаемости:

$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')); 
Смежные вопросы