1

我正在使用 PHP 创建动态复选框。根据我的 Chrome 元素检查员的说法,值回显没有问题,但在 $_POST 之后的某个时间点,我的所有值都被截断为一位数。

12 种色调的复选框,输入值为 1~12 echo'd↴</p>

// Dynamically create checkboxes from database
function print_checkbox($db){
    $i = 0;
    foreach($db->query('SELECT * FROM hue_flag') as $row) {
        if ($i == 0 || $i == 3 || $i== 6 || $i == 9){
            echo '<br><br>';
        }
        $i++;
        echo '<span class="'.$row['1'].'"><label for="'.$row['1'].'">'.ucfirst($row['1']).'</label><input type="checkbox" name="hue[]" class="hue" value="'.$row['0'].'"></span> ';
    }
}

当我检查我的数据库值 10、11 和 12 已被截断为 1。

插入代码↴</p>

// Above this comment: INSERT to table gown; Below this comment: INSERT to table gown_hues
$insertId = $conn->lastInsertId();

if(is_array($_POST['hue'])){
    foreach($_POST['hue'] as $key => $hue){
        $insertSQLToGown_Hues = sprintf("INSERT INTO gown_hues (`gown_id`, `hue_id`) VALUES (".$insertId.", ".$hue['0'].")");
        $conn->query($insertSQLToGown_Hues);
    }
}
else {
    $insertSQLToGown_Hues = sprintf("INSERT INTO gown_hues (`gown_id`, `hue_id`) VALUES (".$insertId.", ".$hue.")");
    $conn->query($insertSQLToGown_Hues);
}

发生了什么事,发生在哪里?!

4

2 回答 2

3

你在一个 foreach 循环中,所以$hue是一个字符串,而不是一个数组。

$hue['0']将字符串视为字符数组,因此返回第一个字符

此外,由于您只获得一个值数组,而不是键/值对列表,因此您的 foreach 可能只是......

foreach($_POST['hue'] as $hue){
    $insertSQLToGown_Hues = sprintf("INSERT INTO gown_hues (`gown_id`, `hue_id`) VALUES (".$insertId.", ".$hue.")");
    $conn->query($insertSQLToGown_Hues);
}

请注意,您甚至没有尝试确保传递给您的值已被清理,这意味着您很容易受到 SQL 注入的影响——如果有人修改您的表单,以便hue_id他们发布而不是数字,会发生什么情况1); DROP TABLE gown_hues--

$insertSQLToGown_Hues = sprintf("INSERT INTO gown_hues (`gown_id`, `hue_id`) VALUES ('".mysql_real_escape_string($insertId)."', '".mysql_real_escape_string($hue)."')");

将是朝着正确方向迈出的一步,但使用参数化查询会更好。

于 2013-04-26T19:07:08.707 回答
0
foreach($_POST['hue'] as $key => $hue){
        $insertSQLToGown_Hues = sprintf("INSERT INTO gown_hues (`gown_id`, `hue_id`) VALUES (".$insertId.", ".$hue['0'].")");
        $conn->query($insertSQLToGown_Hues);
    }

应该是:(您总是插入数组的第一个元素,而不是在循环中从数组中检索到的 $hue)

foreach($_POST['hue'] as $key => $hue){
        $insertSQLToGown_Hues = sprintf("INSERT INTO gown_hues (`gown_id`, `hue_id`) VALUES (".$insertId.", ".$hue.")");
        $conn->query($insertSQLToGown_Hues);
    }
于 2013-04-26T19:06:49.923 回答