修改函数动态填充选择要使用数组的数据库

问题描述:

我试图修改一个函数,我一直在使用动态填充<select>元素来使用数据库中的数组。原始函数使用硬编码数组来填充元素,并预先选择了与db值相匹配的选项。修改函数动态填充选择要使用数组的数据库

修改后的函数创建元素,但它只是从db中添加第一个值。我怎样才能修改它,以便循环遍历所有应该添加到<select>元素的值?

PHP函数和查询

<?php 
function printSelectOptions($dataArray, $currentSelection) { 
    foreach ($dataArray as $key => $value) { 
     echo '<option ' . (($key == $currentSelection)) . ' value="' . $key . '">' . $value . '</option>'; 
    } 
} 
try { 
    $stmt = $conn->prepare("SELECT * FROM student"); 
    $stmt->execute(); 
    }catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
$row = $stmt->fetch(); 
?> 

填充选择元素

<select name="fname"> 
    <?php 
     echo printSelectOptions(array($row['fname'])); 
    ?> 
</select> 

原有功能&代码填入一元

function printSelectOptions($dataArray, $currentSelection) { 
    foreach ($dataArray as $key => $value) { 
     echo '<option ' . (($key == $currentSelection) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>'; 
    } 
} 

<select name="fname"> 
    <?php 
     $options = array("John"=>"John", "Mary"=>"Mary", "Elizabeth"=>"Elizabeth"); 
     $selected = $row['fname']; 
     echo printSelectOptions($options, $selected); 
    ?> 
</select> 
+0

无需改变功能即可。只需在数据库查询后准备数组列表。 ' - > fetchAll'可能会有所帮助。 – mario 2013-03-27 01:32:16

+0

@mario - 谢谢你让我知道' - > fetchAll'。不幸的是这个功能需要比多一点,但值得庆幸的是迈克尔的回答得到它:-)工作 – 2013-03-27 01:59:38

由于您只通过fetch()获取了单个行,因此只有一个值传入您的函数printSelectOptions()。取而代之,通过fetchAll() 获取所有行并修改您的函数以接收完整阵列,再加上字符串,这是您要打印的列名称(数组键)。

// All rows into $rows... 
$rows = $stmt->fetchAll(); 

// Make the function accept the full 2D array, and 
// a string key which is the field name to list out: 
function printSelectOptions($dataArray, $currentSelection, $fieldname) { 
    // String to hold output 
    $output = ''; 
    foreach ($dataArray as $key => $value) { 
     // Rather than echo here, accumulate each option into the $output string 
     // Use the $fieldname as a key to $value which is now an array... 
     $output .= '<option ' . (($key == $currentSelection)) . ' value="' . $key . '">' . htmlspecialchars($value[$fieldname], ENT_QUOTES) . '</option>'; 
    } 
    return $output; 
} 

然后调用该函数为:

echo printSelectOptions($rows, $currentSelection, 'fname'); 

它是现在,期权的价值属性由数组键,这将从零开始编号填充的方式。这与您的原始数组版本类似,但指定另一个列名称(如id)作为关键列可能更有用。

// This one also takes a $valuename to use in place of $key... 
function printSelectOptions($dataArray, $currentSelection, $valuename, $fieldname) { 
    // String to hold output 
    $output = ''; 
    foreach ($dataArray as $key => $value) { 
     // Rather than echo here, accumulate each option into the $output string 
     // Use the $fieldname as a key to $value which is now an array... 
     $output .= '<option ' . (($value[$valuename] == $currentSelection)) . ' value="' . $value[$valuename] . '">' . htmlspecialchars($value[$fieldname], ENT_QUOTES) . '</option>'; 
    } 
    return $output; 
} 

,并会被称为:

echo printSelectOptions($rows, $currentSelection, 'id', 'fname'); 
+0

这些方法都非常完美:-D(我假设你抓到你前面贴;-)的一个问题) 2个问题 - PHP中是否有类似于jQuery(this)的方法,可以在函数被调用时用来代替'fname'?另外,出于好奇,指定另一个列名(如id)作为关键列的好处是什么? – 2013-03-27 01:57:29

+1

@ChayaCooper传入''fname''的原因是为了使它成为通用的,所以无论'$ rows'数组中的列是什么,都可以选择输出的列。所以与jQuery'$(this)'没有什么关系,因为在PHP数组上下文中,$(this)指向foreach循环中的$ value。 – 2013-03-27 02:02:17

+1

@ChayaCooper指定列名称只是增加了灵活性。由于该函数已经被构建为通用的,并且允许您选择'