将填充' select '元素的函数与预先选择匹配db值的选项的函数结合起来


Combine function that populates `select` elements with function that pre-selects options matching db values

我想修改函数checkSelectedOption,这样我就不必每次调用数组时都硬编码。

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

函数checkSelectedOption用数组"$options"中指定的值填充元素,然后预选择与db的"customer_info"表中的信息匹配的选项。这个函数目前需要数组硬编码,我想用函数printSelectOptions中的方法替换函数的这一部分,该方法使用从db值创建的数组。

函数printselectopoptions 从数据库中获取的值填充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>  

@metal_fan,我不知道你指的是什么,你能详细说明一下吗一点吗?

我想600字是不够的。

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

你必须获取你需要的数据,然后将其与循环中的值"inside"进行比较(否则它将是一个地狱)。

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

我想你已经知道"select against"是如何工作的了。但你根本不明白我说的话:(看这个:

$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解析器解耦。