使用预先选择与db值匹配的选项的函数组合填充`select`元素的函数

时间:2013-04-17 23:27:35

标签: php arrays

我想修改函数 checkSelectedOption ,这样我每次调用时都不需要对数组进行硬编码。

第一个函数预先选择与db中的信息匹配的选项,但它使用硬编码数组来填充select个元素。第二个函数根据db值创建数组,并动态填充select个元素。如何组合这两个函数以便我可以动态填充select个元素,然后预先选择与db中的信息匹配的选项?

函数checkSelectedOption 使用array" $ options"中指定的值填充元素,然后预先选择与" customer_info&#34中的信息匹配的选项;数据库表。此函数当前要求对数组进行硬编码,并且我希望使用 function printSelectOptions 中的方法替换此部分函数,​​该方法使用从db值创建的数组。

函数printSelectOptions 从db中获取的值填充select个元素。它通过创建一个数组来实现这一点,该数组包含从" form_fields"中提取的列中的值。表。

功能checkSelectedOption

function checkSelectedOption($dataArray, $currentSelection) {
    foreach ($dataArray as $key => $value) {
        echo '<option ' . (($key == $currentSelection) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>';
    }
}
try {  
$stmt = $conn->prepare("SELECT * FROM customer_info WHERE user_id = :user_id");  
$stmt->bindValue(':user_id', $user_id); 
$stmt->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
} 
$row = $stmt->fetch();

调用功能

<select name="first_name">
    <?php
    // Populates the element with values from array $options         
    $options = array("John"=>"John", "Robert"=>"Robert");
    $selected = $row['first_name'];
    echo checkSelectedOption($options, $selected);
    ?>
</select>            

功能printSelectOptions

function printSelectOptions($dataArray, $currentSelection, $fieldname) {
    $output = '';
    foreach ($dataArray as $key => $value) {
    // Only add to array if row has value
    if ($value[$fieldname] !="" && $value[$fieldname] !="Null") {
            $output .= '<option ' . (($key == $currentSelection)) . ' value="' . $key . '">' . str_replace('_', ' ', $value[$fieldname]) . '</option>';
        }
    }
    return $output;
}
try {  
    $stmt = $conn->prepare("SELECT * FROM form_fields");  
    $stmt->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
} 
$rows = $stmt->fetchAll();

调用功能

<select name="first_name">
    <?php 
    // Dynamically populates element with array created from column first_name
    echo printSelectOptions($rows, $currentSelection, 'first_name');
    ?>
</select>  

1 个答案:

答案 0 :(得分:2)

  

@metal_fan,我不确定你指的是什么,你能详细说明吗?   位?

我认为600个字符是不够的。

  

如何组合这两个函数以便我可以填充select   动态元素,然后预先选择匹配的选项   数据库中的信息?

您必须获取所需的数据,然后将其与循环内的“内部”选择框中的值进行比较(或者它将是一个地狱)。

PHP本身旨在用作模板引擎。这意味着,人们应该将它用作模板引擎 - 不要print/echo html标签,而是注入php“东西”。

你现在所做的一切都没有意义。 常见的解决方案是创建一个辅助函数来进行计算。

请记住,一个功能应该只执行单个任务。如果您有多个,请为每个创建一个函数。


<强>更新
好吧,在你编辑之后,我现在更加困惑了。


// Assume that array we got from the table looks like:
$array = array('John' => 'John', 'Dave' => 'Dave', 'Jason' => 'Jason');

$__AGAINST__ = 'Jason'; // <-- VERY IMPORTANT

function is_selected($expected, $actual){

    if ( $expected === $actual ){

        print 'selected="selected"';
    }
}

?>

<select>

    <?php foreach($array as $key => $val):?>

    <option value="<?php echo $key; ?>" <?php is_selected($key, $__AGAINST__); ?>><?php echo $val; ?></option>

    <?php endforeach; ?>

</select>

$__AGAINST__您将从配置或类似的东西中获取。这就是你要比较的内容。

现在用$__AGAINST__ = 'Jason';替换$__AGAINST__ = 'Dave';你看它是如何工作的?核心思想是迭代$array并将$key与某些内容进行比较。而已。


更新2

我猜你知道“选择反对”是如何运作的。但你根本不明白我告诉你的事情:(看看这个:

$output .= '<option ' . is_selected($key, $__AGAINST__) . ' value="' . $key . '">' . str_replace('_', ' ', $value[$fieldname]) . '</option>';

你一次又一次地犯同样的错误。 PHP本身就是用作模板引擎。您应该避免使用printing/echoing HTML标记。为什么?如果您决定将select替换为另一个元素(比如Jquery ComboBox插件),该怎么办?那么会发生什么?您将不得不重新考虑“生成”逻辑本身以及演示。听起来很糟糕。为何听起来不好?这是因为表示应该完全与应用程序/生成逻辑分离。为什么要脱钩?灵活性,可维护性将回答这个问题,我想。

让模板尽可能保持愚蠢他们应该从不直接进行任何计算。如果要在HTML模板中计算某些内容,请在 bootstrap.php (或类似内容)中的某处定义一个函数,但不要在标记本身内部。

PHP旨在用作模板引擎但这究竟意味着什么?

这意味着(我们不是在Perl / Python中),你应该总是避免像这样的代码:

$ouptut = '<option>' . $foo . '</option>';
echo '<table>';
echo '<tr>';
echo '<td>' . $bad . '</td>';
echo '</tr>';

但是写下这样的东西:

<select>
  <option><?php echo $foo; ?></option>
</select>

记住这一点,你会让你的HTML内容完全脱离PHP解析器。这对未来的维护很有帮助。