我正在尝试创建多个下拉列表,但只使用了数组中的最后一项。
$arr = explode("\n", $ingredients);
foreach($arr as $value){
print '<select size="1" name="a[]"><option>'.$value.'</option>';
$stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%$value%'");
while ($loop = $stmt->fetch_assoc()) {
print '<option value="'.$loop[FoodId].'">'.$loop[DanName].'</option>';
}
print '</select>';
}
$arr
看起来像这样:
Array ( [0] => mel [1] => ost [2] => mælk ).
但只处理了最后一个值[2]。
跟进答案 我想要多个选择的多个下拉列表。 显示所有下拉列表,但只有最后一个下拉列表从数据库中填充。
答案 0 :(得分:0)
需要引用$loop[FoodId]
和$loop[DanName]
中的数组键,否则PHP会将它们视为未初始化的常量。此外,您可能应该通过HTML编码运行这些,以防止像XSS这样的攻击。对你想要的结果做一些假设,你可能想尝试这样的东西作为你的while循环的主体:
$foodId = htmlentities($loop['FoodId'], ENT_COMPAT|ENT_HTML5, 'UTF-8');
$danName = htmlentities($loop['DanName'], ENT_COMPAT|ENT_HTML5, 'UTF-8');
echo '<option value="'.$foodId.'">'.$danName.'</option>';
此外,还不清楚$ ingredients的来源,但如果它受到用户输入的影响,你真的应该考虑使用带有$ value的参数化查询作为绑定参数。不幸的是,mysqli API可能会让人感到痛苦,因此您可能需要考虑切换到php:PDO;如果没有,php:mysqli.prepare可能是一个很好的起点。
答案 1 :(得分:0)
首先,您的下拉列表不应该以数组a[]
的形式具有相同的名称。现在您有多个下拉框,但它们都具有相同的名称。如果您可以进行多重选择,则仅使用数组名称。 (例如,在进行多项选择时按住Shift键的列表。或者使用复选框。
它也没有多大意义,因为你不会引用哪个下拉框属于哪个选定值。
其次,如已经建议的那样,在将它们放入HTML组件之前转义您的值。我建议您使用htmlspecialchars()
。
第三,封装你命名的数组键。 $loop[FoodId]
=&gt; $loop['FoodId']
。这可能会阻止可能破坏HTML的通知/警告。
实际上,我不确定你是否想拥有MULTIPLE下拉框,每个下拉框都有MULTIPLE值。或者您只想拥有一个带有MULTIPLE值的下拉框。
在第一种情况下:
试试这样:
$arr = explode("\n", $ingredients);
for($i = 0; $i < count($arr); $i++) {
print '<select size="1" name="a{$i}"><option>'.htmlspecialchars($arr[$i]).'</option>';
$stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%{$arr[$i]}%'");
while ($loop = $stmt->fetch_assoc()) {
print '<option value="'.$loop['FoodId'].'">'.htmlspecialchars($loop['DanName']).'</option>';
}
print '</select>';
}
然后在PHP中回顾$_REQUEST['a0']
,$_REQUEST['a1']
,$_REQUEST['a2']
等...
在第二种情况下:
试试这样:
$arr = explode("\n", $ingredients);
print '<select size="1" name="a"><option>'.htmlspecialchars($value).'</option>';
foreach($arr as $value){
$stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%$value%'");
while ($loop = $stmt->fetch_assoc()) {
print '<option value="'.$loop['FoodId'].'">'.htmlspecialchars($loop['DanName']).'</option>';
}
}
print '</select>';
因此将<select>
移到foreach之外。在PHP中,然后查找$_REQUEST['a']
。
修改强>
根据以下评论,规范新线:
$ingredients = str_replace("\r","\n", $ingredients); // normalize
$ingredients = str_replace("\n\n","\n", $ingredients); // normalize
$arr = explode("\n", $ingredients);
for($i = 0; $i < count($arr); $i++) {
print '<select size="1" name="a{$i}"><option>'.htmlspecialchars($arr[$i]).'</option>';
$stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%{$arr[$i]}%'");
while ($loop = $stmt->fetch_assoc()) {
print '<option value="'.$loop['FoodId'].'">'.htmlspecialchars($loop['DanName']).'</option>';
}
print '</select>';
}