我想修改函数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解析器解耦。