2013-04-26 69 views
0

我使用PHP创建动态复选框。根据我的Chrome元素检查器的值回显没有问题,但在$ _POST后的所有我的值被截断为一位数。数组值被截断为一位数

复选框12点的色调与输入值1〜12echo'd↴

// 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

代码插入↴

// 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); 
} 

这是怎么回事,它在哪里发生?!

回答

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

应该是:(你总是插入阵列的第一个元素,而不是在循环从阵列中检索到的$色调)

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

你在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)."')"); 

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

+0

我想我误解了[]是如何工作的。所以,我实际上并不需要我的是,否则,对吗? 关于卫生设施,学习是我的待办事项列表中的下一个。 – 2013-04-26 19:24:48

+0

当我按照您的建议更改代码时,没有值插入到gown_hues中。 – 2013-04-26 19:28:06

+0

事实上,现在我想到了,你的代码就是我昨天的方式。我无法弄清楚为什么这些值没有被插入,所以我将它改为我的问题中发布的内容,因为我认为我需要它是一个数组。我认为0指的是我的MySQL表的第0列。 – 2013-04-26 19:36:02