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

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

函数checkSelectedOption使用数组“$ options”中指定的值填充元素,然后预先选择与db的“customer_info”表中的信息匹配的选项。 此函数当前要求对数组进行硬编码,并且我想用函数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 票数:2 已采纳

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

我想,600个字符是不够的。

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

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

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

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

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


UPDATE
好吧,在你编辑之后,我现在更加困惑了。


// 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解析器。 这对未来的维护非常有用。

  ask by Chaya Cooper translate from so

未解决问题?本站智能推荐: