0

我有一个带有选择框的表单和一个以前选择过的数据库值。是的,我需要这个值,它被选择显示为最后选择的内部表格。我尝试使用 php dom,但我无处可去。

所以这里是html:

<select name="conf_1">
     <option value="Y">Yes</option>
     <option value="N">No</option>
</select>
<select name="conf_2">
     <option value="text">text</option>
     <option value="alsotext">alsotext</option>
</select>

现在我想显示存储在数组中的所选选项,如下所示:

$confs = array([1] => N, [2] => text );

做一些代码:

loop{
   <option value="$confs[$i]">$confs[$i]</option> has to be appended to <select name="conf_$i">
}

现在我找不到办法做到这一点。我尝试过使用 php dom,但我不知道如何按名称属性选择元素然后循环槽,所以我无法制作一个真正的 php 示例。我只是不知道从哪里开始。

如果有人有办法做到这一点,请赐教!?

使用受@Markus I 启发的代码完成它:

$dom = new DOMDocument();
    $dom->loadHTML($form);
    $xPath = new DOMXPath($dom);

    foreach ($dom->getElementsByTagName('select') as $select) {
        $name = $select->getAttribute('name');
        $name = str_replace('conf_', '', $name);

        foreach($xPath->query('./option', $select) as $option) {
            if ($option->getAttribute('value') == $confs[$name]) {
                $option->setAttribute('selected', 'selected');
            }
        }
    }

    $form = $dom->saveHTML($dom);

    echo $form;
4

3 回答 3

2

像这样 ??

$confs_arr = array("1" => N, "2" => text,"3" => N4, "4" => text3,"5" => N5,"6" => text7);
echo "<select name='option' id='option'>";
foreach($confs_arr as $keys=>$confs){

echo "<option value='".$confs."'>".$confs."</option>";

}
echo "</select>";
于 2012-10-18T08:39:39.710 回答
1

我更喜欢将孔模板加载到 DOM 中并对其进行修改:(代码未测试!)

$dom = new DOMDocument();
$dom->loadXML('<yourTemplateXML />');
$xPath = new DOMXPath($dom);
$data = array('conf1' => 'N', 'conf2' => 'text');


foreach ($xPath->query('//select') as $select) {
    foreach($xPath->query('./option', $select) as $option) {
        if ($option->getAttribute('value') == $data[$select->getAttribute('name')]) {
            $option->setAttribute('selected', 'selected');
        }
    }
}

echo $dom->saveXML();

我写了一个类,它可以处理所有的字段类型。请注意,这只是示例代码。在生产中,您应该注意数据数组中的键是否存在等等。

这有一个很好的副作用:因为您通过 dom 设置值,所以它可以保护您的表单免受 XSS

于 2012-10-18T08:47:39.593 回答
0

以下是与您询问的示例代码类似的示例代码:

   <?php

$categories = $rows; //array from database
foreach($rows as $row){
     if($row['name'] == $_POST['category']){
          $isSelected = ' selected="selected"'; // if the option submited in form is as same as this row we add the selected tag
     } else {
          $isSelected = ''; // else we remove any tag
     }
     echo "<option value='".$row['id']."'".$isSelected.">".$row['name']."</option>";
}
?>

$_POST['category']是用户先前选择的,它可以是任何东西,而不仅仅是$_POST.

基于此示例,您可以修改您的代码。

如果用户之前选择了"text",那么 html 代码应该是:

<select name="conf_2">
     <option value="text" selected="selected">text</option>
     <option value="alsotext">alsotext</option>
</select>

放入标签,selected="selected"<option>项目将被默认选择。

希望这可以帮助

于 2012-10-18T08:42:26.010 回答