0

我想修改函数checkSelectedOption以便不必在每次调用数组时都对其进行硬编码。

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

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

函数 printSelectOptionsselect根据从数据库中获取的值填充元素。它通过使用从“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>  
4

1 回答 1

2

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

我猜 600 个字符是不够的。

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

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

PHP 本身旨在用作模板引擎。这意味着,人们应该将它用作模板引擎——不要使用print/echohtml 标签,而是注入 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 解析器完全分离。这对未来的维护非常有用。

于 2013-04-18T03:16:46.953 回答