2012-10-18 54 views
0

我有一个选择框的形式,并从数据库女巫的价值已被选中之前。是的,我需要这个价值女巫选择蜜蜂显示为最后选择内部形式。我尝试使用PHP DOM,但我没有得到任何地方。PHP - 用价值表格数据库填充选择框

因此,这里的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启发做了我。:

$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; 
+0

或者你也可以做到这一点通过JavaScript – ianace

+0

如果你已经拥有的价值观,一个简单的循环会工作。 –

回答

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

+0

humm看起来像它,但是我得到这个错误 - 致命错误:调用未定义方法DOMDocument :: query()在C:\ usb webserver \ root \ tcm \ engine中。在线372的PHP,好吧我修好了它我使用getElementsByTagName循环槽所有选择元素,然后我用你的xPath方法来处理选择 – botenvouwer

+0

对不起,不测试代码... :) 要getElementsByTagName是反正在这种情况下更好,因为速度更快; xPath是过度杀伤... –

+0

不要担心你播下了正确的方向,我可以在这里按下表格。谢谢您的回答。 – botenvouwer

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>"; 
+0

不,你看到表单不是手动创建的,所以我有$ form,然后我必须操作它,所以选择值女巫存储在数组中将被归档。这是因为表单是动态的,并且存在形式发生器女巫可以创造新的价值形式。 – botenvouwer

+0

@sirwilliam所以如果你得到数组中的所有值,上面的代码将起作用。你只需要传递值 – Sibu

+0

这是他们必须插入现有的女巫存储在数据库加载到字符串中的问题。每次表格都很不自然,并且有不同的价值观念。但我已经用@Markus I的帮助修复了它。 – botenvouwer

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>标签,而且此项目将被选择作为默认值。

希望这有助于

相关问题