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