PHP вставка нескольких массивов флажков и текстовых полей в базу данных MySQL

#php #arrays #forms #input #checkbox

Вопрос:

У меня возникли проблемы с результатами массива в моем php. Моя первая проблема заключается в следующем :

введите описание изображения здесь

Он показывает все, даже если флажок не установлен. Моя вторая проблема заключается в том, что он не вставляет значения в базу данных, даже если он подключен к базе данных (как вы можете видеть на предыдущем снимке экрана, на нем написано «успешно подключен»).

Это моя html-форма:

 <form method="POST">
    <input type="hidden" name="item[]" value="cupcake">
    <input type="text" name="items" value="cupcake" readonly><br>
    <b>Price :</b> <span name="price" value="3.00">$17.00</span><br>
    Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br>
    <input tabindex="1" name="checkbox[]" type="checkbox" value="17" /><span>Add to Cart</span></label></div></div></td><br>

    <input type="hidden" name="item[]" value="cake">
    <input type="text" name="items" value="cake" readonly><br>
    <b>Price :</b> <span name="price" value="20.00">$20.00</span><br>
    Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br>
    <input tabindex="1" name="checkbox[]" type="checkbox" value="20" /><span>Add to Cart</span></label></div></div></td><br>

    <input type="submit" name="insertBT"><br>
</form>
 

PHP:

 if(isset($_POST['insertBT']))
{
    class db_conn
    {
        public function create_conn($servername, $username, $password, $db)
        {
            global $conn;
            $conn = new mysqli ($servername, $username, $password, $db);
        }

        public function check_conn()
        {
            global $conn;
            if($conn->connect_error)
            {
                die ("Connection Failed : " . $conn->connect_error);
            }
            else
            {
                echo ("Connected Successfully <br>");
            }
        }

        public function insert()
        {

            if(isset($_POST['checkbox'])) {
                foreach($_POST['checkbox'] as $check) {

                    $check = implode(',', $_POST['checkbox']);
                    $name = implode(',', $_POST['item']);
                    $quantity = implode(',', $_POST['quantity']);
                }
                echo $check . "<br>";
                echo $name . "<br>";
                echo $quantity . "<br>";

                mysql_query("INSERT INTO purchases(Product, Quantity, Price) VALUES('$name', '$quantity','$check')");

            }
        }
    }
    $obj1 = new db_conn;
    $obj1->create_conn("localhost","root","", "dbtest");
    $obj1->check_conn();
    $obj1->insert();
}
 

Комментарии:

1. Извините, но я не спрашиваю о том, как подключить php-файл к базе данных, я уже знаю, как подключить его с помощью объектно-ориентированного программирования. Я задаю совершенно другой вопрос.

2. Почему вы используете глобальную переменную $conn вместо свойства класса?

3. Поскольку вы зацикливаетесь на флажках, почему вы также делаете implode(',', $_POST['checkbox']) это внутри цикла?

4. Я использую implode, потому что я продолжаю получать уведомления, когда запускаю страницу без него. Говоря что-то вроде «Обратите внимание: преобразование массива в строку»

Ответ №1:

Вы не должны использовать implode . Это помещает разделенный запятыми список всего в форме в каждую вставляемую строку и повторяет это для каждого отмеченного флажка. Вы должны просто вставить по одному элементу в каждую строку, индексируя массивы.

Однако, когда у вас есть флажок в форме, он отправляет только те, которые отмечены. Результатом этого является то, что индексы $_POST['checkbox'] массива не будут совпадать с соответствующими $_POST['item'] $_POST['quantity'] элементами и. Вам нужно ввести явные индексы в checkbox имена, чтобы вы могли связать их.

 <form method = "POST">

<input type = "hidden" name = "item[]" value = "cupcake">
<input type = "text" name = "items" value = "cupcake" readonly><br>
<b>Price :</b> <span name = "price" value = "3.00">$17.00</span><br>
Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br>
<input tabindex="1" name="checkbox[0]" type="checkbox" value="17" /><span>Add to Cart</span></label></div></div></td><br>

<input type = "hidden" name = "item[]" value = "cake">
<input type = "text" name = "items" value = "cake" readonly><br>
<b>Price :</b> <span name = "price" value = "20.00">$20.00</span><br>
Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br>
<input tabindex="1" name="checkbox[1]" type="checkbox" value="20" /><span>Add to Cart</span></label></div></div></td><br>

<input type = "submit" name = "insertBT"><br>
</form>
 

Тогда ваш PHP-код может быть таким:

 $stmt = $conn->prepare("INSERT INTO purchases (Product, Quantity, Price) VALUES (?, ?, ?)");
$stmt->bind_param("sis", $name, $quantity, $price);
foreach ($_POST['checkbox'] as $i => $price) {
    $name = $_POST['name'][$i];
    $quantity = $_POST['quantity'][$i];
    $stmt->execute();
}
 

Кстати, указывать цены в вашем HTML-коде кажется плохой идеей. Ничто не мешает пользователю изменять HTML с помощью веб-инспектора перед отправкой формы, чтобы снизить цену. Вы должны получить цены из базы данных при обработке формы.

Кроме того, обратите внимание, что в исходном коде вы открыли соединение с базой данных с помощью MySQLi, но затем попытались выполнить вставку с помощью mysql_query вместо $conn->query() . Вы не можете смешивать API подобным образом; myql_query их можно использовать только при открытии соединения mysql_connect .

Комментарии:

1. и проблема с их первоначальным запросом была? о да, я упоминал об этом, но мне быстро сказали (скорее, уволили), что вопрос был не в этом, а в смешивании API MySQL. так что в итоге я удалил свой комментарий по этому поводу.

2. А-а-а, понятно, так вот в чем была проблема. Похоже, Фред был прав. Теперь это работает, спасибо. Кроме того, я не знаю, что такое подготовка (), но я предполагаю, что это просто готовый запрос при отправке формы. Но могу я спросить, для чего нужна «сестренка»?