1

PHPを使用して動的チェックボックスを作成しています。私のChrome要素インスペクタによると、値は問題なくエコーされますが、$_POST後のある時点で、すべての値が1桁に切り捨てられます。

入力値が 1 ~ 12 の 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 に切り捨てられています。

INSERTion↴のコード</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 に答える