Mysqli循环,只返回一个

时间:2013-12-02 08:14:20

标签: php arrays mysqli

我正在尝试创建多个下拉列表,但只使用了数组中的最后一项。

$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]。

跟进答案 我想要多个选择的多个下拉列表。 显示所有下拉列表,但只有最后一个下拉列表从数据库中填充。

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>';
}