【问题标题】:PHP inserting multiple checkbox AND textbox arrays into MySQL DatabasePHP将多个复选框和文本框数组插入MySQL数据库
【发布时间】:2021-07-14 03:38:22
【问题描述】:

我的 php.ini 中的数组结果有问题。我的第一个问题是:

即使未选中复选框,它也会显示所有内容。我的第二个问题是,即使它已连接到数据库,它也不会将值插入数据库(正如您在上一个屏幕截图中看到的那样,它显示“连接成功”)。

这是我的 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();
}

【问题讨论】:

  • 对不起,我不是在问如何将 php 文件连接到数据库,我已经知道如何使用面向对象编程来连接它。我在问一个完全不同的问题。
  • 你为什么使用全局变量$conn而不是类属性?
  • 既然你要循环检查复选框,为什么还要在循环内执行implode(',', $_POST['checkbox'])
  • 我正在使用 implode,因为当我在没有它的情况下运行页面时,我会不断收到通知。说类似“注意:数组到字符串的转换”

标签: php mysql


【解决方案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 中似乎是个坏主意。没有什么能阻止用户在提交表单之前使用 Web 检查器修改 HTML,因此他们可以降低价格。您应该在处理表单时从数据库中获取价格。

另外,请注意,在您的原始代码中,您使用 MySQLi 打开了数据库连接,但随后您尝试使用 mysql_query 而不是 $conn-&gt;query() 进行插入。你不能像那样混合 API; myql_query只能在你打开与mysql_connect的连接时使用。

【讨论】:

  • 他们原始查询的问题是?哦,是的,我提到了这一点,但很快就被告知(更像是被解雇了)这不是问题所在,混合 MySQL API。所以我最终删除了我对它的评论。
  • 啊,我明白了,这就是问题所在。看起来弗雷德是对的。现在可以用了,谢谢。另外,我不知道 prepare() 是什么,但我猜它只是发送表单时的一个准备好的查询。但是我可以问一下“sis”是干什么用的吗?
猜你喜欢
  • 2014-05-22
  • 2014-04-18
  • 2021-10-20
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多