2013-04-26 71 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