Проблема с флажком PHP - PullRequest
2 голосов
/ 13 июля 2010

Я схожу с ума здесь, у меня есть массив флажков из формы, которые я пытаюсь $_POST с PHP. ВСЕ в моей форме сообщений хорошо, кроме флажков. Чекбоксы действительно публикуются, но в неправильном порядке. Например, когда я хочу checkbox[0] и checkbox[2], я на самом деле получаю checkbox[0] и checkbox[1].

Я пробовал много разных способов получить значение флажка, включая isset, но у меня все еще есть та же проблема. Мне просто нужно, чтобы значение флажка on было сохранено в моей базе данных, если флажок действительно установлен.

Мой код указан ниже. $in_production это флажок. Я могу предоставить код, который генерирует флажок, если это необходимо.

Заранее спасибо.

if ($_GET['action'] == 'Edit_Product'){

    include("../dbinfo.php");

    $q_id = $_GET['q_id'];

    for ($i = 0; $i < count($_POST['p_id']); $i++){

        $result = mysql_query('SELECT * FROM products WHERE q_id = '.$q_id);
        $num = mysql_num_rows($result);

        $p_id = ($_POST['p_id'][$i]);
        $in_production = ($_POST['in_production'][$i]);
        $p_name = ($_POST['p_name'][$i]);
        $p_price = ($_POST['p_price'][$i]);

        $p_name_conflict = FALSE;

        for ($ii = 0; $ii < $num; $ii++){
            $row = mysql_fetch_array($result);
            $p_name_conflict_check = $row['p_name'];
            $p_id_conflict_check = $row['p_id'];

            if($p_name_conflict_check == $p_name &&
              $p_id_conflict_check != $p_id){
                $p_name_conflict = TRUE;
            }

        }

        if ($p_name_conflict == FALSE){
            $query = "UPDATE products SET p_name='$p_name',
              p_price='$p_price', in_production='$in_production',
              last_modified=CURDATE() WHERE p_id = '$p_id'";
            mysql_query($query);
        }

        else{
            $update_failures =+1;
        }

    }

    mysql_close($link);

    if($update_failures == 0){
        header("Location: Products_Updated.html");
    }

    elseif ($update_failures != 0){
        header("Location: Products_Exist.php?update_failures=".$update_failures);
    }

}

P.S. Я не знаю почему, но значки блоков кода не присутствуют в SO прямо сейчас ... так что мой код не совсем симпатичен. Кроме того, я знаю, что мой код ужасно неэффективен, но я просто пытаюсь заставить это работать прямо сейчас, а затем настроить позже. Я также открыт для предложений по повышению эффективности, но это не является моей главной целью в этом вопросе.

РЕДАКТИРОВАТЬ: Вот форма из HTML ...

        <form id="form" name="form" method="post" action="/Management/Products/Product_Management.php?action=Edit_Product&q_id=<?php echo "$q_id" ?>">

                <?php

                    include("../dbinfo.php");   

                    $result = mysql_query('SELECT * FROM products WHERE q_id =' . $q_id);
                    $num = mysql_num_rows($result);
                    mysql_close($link);

                    for ($i = 0; $i < $num; $i++){
                        $row = mysql_fetch_array($result);

                        $p_id = $row['p_id'];
                        $p_name = $row['p_name'];               
                        $p_price = $row['p_price'];
                        $in_production = $row['in_production'];
                        $date_added = $row['date_added'];
                        $last_modified = $row['last_modified'];

                        if($in_production == 'on'){
                            $checked = 'checked';
                        }

                        else{
                            $checked = '';
                        }

                        echo "<div>Product ID# " . $p_id . "<label style=\"font-style:italic\"> (Originally added on " . $date_added . ", last modified on " . $last_modified . ")</label></div><br/>";
                        echo "<input id=\"p_id" . $p_id . "\" class=\"text\" type=\"hidden\" name=\"p_id[]\" value=\"" . $p_id . "\"/>";

                        echo "<label>Product Name *</label><br/>";
                        echo "<div><label style=\"font-style:italic\">(Product still in production <input type=\"checkbox\" name=\"in_production[]\"" . $checked . " style=\"width:15px\"/>)</label></div>";    
                        echo "<input id=\"p_name" . $p_id . "\" class=\"text\" type=\"text\" name=\"p_name[]\" maxlength=\"20\" onfocus=\"on_focus(this)\" onblur=\"on_blur(this)\" value=\"" . $p_name . "\"/><br/><br/>";

                        echo "<label>Product Price *</label><br/>";
                        echo "<div><label style=\"font-style:italic\">(Without taxes)</label></div>";
                        echo "<input id=\"p_price" . $p_id . "\" class=\"text\" type=\"text\" name=\"p_price[]\" maxlength=\"6\" onkeypress=\"return currency(this, event)\" onchange=\"currency_format(this)\" onfocus=\"on_focus(this)\" onblur=\"on_blur(this)\" value=\"" . $p_price . "\"/><br/><br/><br/><br/>";

                    }

                ?>

            <input class="button" type="button" value="Submit" onclick="product_edit_form_check()"/><br/><br/>

        </form>

Ответы [ 4 ]

3 голосов
/ 13 июля 2010

Было бы полезно, если бы вы могли опубликовать часть HTML-части, чтобы мы могли видеть, как вы создаете свою форму.Кажется, вы генерируете свои чекбоксы без индексов в своем массиве, поэтому все чекбоксы имеют имя / идентификатор "checkbox []", что нормально, если вы не заботитесь об индексе, но в случае публикации массив будет пронумерованначиная с «0», а затем подсчитывая, что является причиной того, что вы получите «0» и «1», даже если были отмечены «0» и «2».

Попробуйте поставить свои флажки'имена / идентификаторы при генерации HTML, такие как "checkbox [0]", "checkbox [1]", "checkbox [2]" и т. д.Поэтому, когда флажки 0 и 2 отмечены, вы должны опубликовать эти значения (включая правильный индекс).

3 голосов
/ 13 июля 2010

При использовании флажков HTML нужно помнить, что они устанавливают значение POST только в том случае, если они отмечены.Если они не проверены, они не публикуются.

Имея это в виду, вы должны дать каждому флажку имя и затем проверить его в POST, чтобы определить, был ли он передан обратно.

if (isset($_POST['MyCheckbox'])) {

} // else it wasn't checked!
1 голос
/ 13 июля 2010

Если вы объявляете имя флажка как (p_id []), это все равно, что сказать PHP «Я добавляю элемент в массив, перечислю его для меня».Как в php $ array [] = 't';Если у вас есть несколько элементов формы с разными именами и вы хотите иметь синхронизированные идентификаторы, вы ДОЛЖНЫ добавить индекс, потому что в противном случае браузер будет / может отправлять только выбранные элементы, а PHP будет перечислять его непрерывно.

Вы можете указать индексы, используя p_id [INDEX] и т. Д., Где index - это что угодно (я предлагаю числовой или буквенно-цифровой).

Кроме того, значение флажка может быть изменено, и я рекомендую вам это сделать.Значение = "1" помогает, тогда вы уверены, что вы его получили.

<input type="checkbox" name="p_id[0]" value="1" />

В PHP вы получите

$_POST['p_id'] ===> array(0 => 1);

et caetera.

1 голос
/ 13 июля 2010

Покажите нам HTML-код для флажков.

Кроме того, у вас есть ожидающая атака SQL-инъекции - пользователь может получить любой SQL-запрос в конце вашего запроса.Примерно так показано, что вы должны делать с ненадежными данными:

//we're expect a number, so ensure we get one
$q_id = intval($_GET['q_id']); 

//get into the habit of quoting query params, 
//or better yet, use a wrapper library to help you
$sql="select * from products where q_id='".mysql_real_escape_string($q_id)."'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...