【问题标题】:Inserting multiple rows from a form to MySql using PHP使用 PHP 将表单中的多行插入到 MySql
【发布时间】:2014-03-19 21:19:15
【问题描述】:

我正在开发一个发票系统。我到了需要你帮助的地步。

我需要一次将表单中的多行存储到 MySql。

例如这是我的代码:

$sql="INSERT INTO invoice (client_name, client_address, client_phone, client_number, invoice_date, invoice_number, item_number, item_name, item_desc, item_quantity, item_unit, item_total, total, net_value)
VALUES
('$_POST[client_name]','$_POST[client_address]','$_POST[client_phone]','$_POST[client_number]','$_POST[invoice_date]','$_POST[invoice_number]','$_POST[item_number]','$_POST[item_name]','$_POST[item_desc]','$_POST[item_quantity]','$_POST[item_unit]','$_POST[item_total]','$_POST[total]','$_POST[net_value]')";

表格显然有很多输入。但是,有 5 个输入会有多个值(item_number、item_name、item_desc、item_quantity 和 item_unit)

那么我怎样才能将这个表单全部存储在一个 php $_POST 中

【问题讨论】:

  • 我认为您在谈论发票行,从技术上讲,他们应该通过使用 idinvoice 作为该表的参考循环遍历输入数据来转到不同的表
  • 请注意使用mysql_real_escape_string 转义$_POST 数据以防止SQL injection
  • 看来您需要两张表,一张用于存储发票编号等,一张用于存储商品详情
  • 不用担心SQL注入这个程序会本地存储在我的个人电脑上

标签: php mysql


【解决方案1】:

如果您想将所有这些都放在一张桌子上,那么这里是您的替代解决方案:

我希望你得到 $_POST['item_number'],$_POST['item_name'],$_POST['item_desc'],$_POST['item_quantity'],$_POST['item_unit'],$_POST ['item_total'] 作为 POST 中的数组。

首先将所有这些字段的数据类型更改为 TEXT。 然后 在插入表 invoice 时,您可以将其作为 json_encode($_POST['item_number']) 传递给所有这些字段。 并且无论何时您希望它显示,您都需要对这些变量进行 json_encode。

【讨论】:

    【解决方案2】:

    我不确定你在这里真正问的是什么。例如,如果你有你的 post 变量,那是一个相关数组值的数组,例如

    $_POST[0][client_name] 等等然后你可以这样做

    $sql="INSERT INTO invoice (client_name, client_address, client_phone, client_number, invoice_date, invoice_number, item_number, item_name, item_desc, item_quantity, item_unit, item_total, total, net_value)
    VALUES";
    for($i=0; $i<sizeof($_POST);$i++){
    if(($i+1) == sizeof($_POST)){
    $sql .="('$_POST[$i][client_name]','$_POST[$i][client_address]','$_POST[$i][client_phone]','$_POST[$i][client_number]','$_POST[$i][invoice_date]','$_POST[$i][invoice_number]','$_POST[$i][item_number]','$_POST[$i][item_name]','$_POST[$i][item_desc]','$_POST[$i][item_quantity]','$_POST[$i][item_unit]','$_POST[$i][item_total]','$_POST[$i][total]','$_POST[$i][net_value]')";
    }else{
    $sql .="('$_POST[$i][client_name]','$_POST[$i][client_address]','$_POST[$i][client_phone]','$_POST[$i][client_number]','$_POST[$i][invoice_date]','$_POST[$i][invoice_number]','$_POST[$i][item_number]','$_POST[$i][item_name]','$_POST[$i][item_desc]','$_POST[$i][item_quantity]','$_POST[$i][item_unit]','$_POST[$i][item_total]','$_POST[$i][total]','$_POST[$i][net_value]'),";
    }
    }
    

    然后你可以一次性执行 $sql 变量。如果这不是您的意思,您能否解释一下 $_POST 变量中的数据,而不是您已经解释过的内容。

    【讨论】:

    • 我上面写的代码是为了一个非常简单的发票系统。我只需要将所有值存储在一个表中,但我面临项目输入的问题,因为项目输入(item_number、item_name、item_desc、item_quantity、item_unit)可能有多行,所以我希望能够将这些值放入除了 client_name 和其他字段,并将其一次性存储在数据库中。顺便说一句,我不知道这是否可以用一张桌子来实现,但我真的只想有一张桌子。
    • 如果你想把这一切都放在一张桌子上,那么这里是你的替代解决方案:我希望你得到 $_POST['item_number'],$_POST['item_name'],$_POST[' item_desc'],$_POST['item_quantity'],$_POST['item_unit'],$_POST['item_total'] 作为 POST 中的数组。首先将所有这些字段的数据类型更改为 TEXT。然后在插入表 invoice 时,您可以将其作为 json_encode($_POST['item_number']) 传递给所有这些字段。并且无论何时您希望它显示,您都需要对这些变量进行 json_encode。
    【解决方案3】:

    我明白了,最好通过拆分数据或对其进行规范化来完成。您确实需要两张表,一张用于发票,另一张用于项目行。

    表一 id (auto_increment) 客户名称 客户地址 客户电话 客户号码 发票日期 发票号码 invoice_total 在您的示例中,您将其作为总计 invoice_net_value 在您的示例中,您将其作为 net_value

    表二

    id (auto_increment) table_one_id 项目编号 项目名 item_desc 项目数量 item_unit item_total

    您的插入语句将如下所示,这将非常简单,您应该使用某种数据库框架。

    $sql = "insert into table_one (client_name,client_address,client_phone,client_number,invoice_date,invoice_number,invoice_total,invoice_net_value) values('".mysql_real_escape_string($_POST['client_name'])."'",'".mysql_real_escape_string($_POST['client_phone'])."','".mysql_real_escape_string($_POST['client_number'])."','",mysql_real_escape_string($_POST['invoice_date'])."','".mysql_real_escape_string($_POST['invoice_number'])."','".mysql_real_escape_string($_POST['invoice_total'])."','".mysql_real_escape_string($_POST['invoice_net_value'])."')";
    

    执行语句,然后执行以下操作:

    $id = mysql_insert_id();
    

    使用 id 并为其余数据进行另一次插入。

    $sql = "insert into table_two (table_one_id,item_number,item_name,item_desc,item_quantity,item_unit,item_total) values";
    for($i=0; $i<sizeof($_POST);$i++){
    if(($i+1) == sizeof($_POST)){
    $sql .="('$id','$_POST[$i][item_number]','$_POST[$i][item_name]','$_POST[$i][item_desc]','$_POST[$i][item_quantity]','$_POST[$i][item_unit]','$_POST[$i][item_total]')";
    }else{
    $sql .="('$id','$_POST[$i][item_number]','$_POST[$i][item_name]','$_POST[$i][item_desc]','$_POST[$i][item_quantity]','$_POST[$i][item_unit]','$_POST[$i][item_total]'),";
    }
    }
    

    【讨论】:

      【解决方案4】:

      你需要为它创建两个表: 添加一个字段invoice_id主键关联invoice_item表 表:发票(invoice_id、client_name、client_address、client_phone、client_number、invoice_date、invoice_number)

      表格:invoice_item (invoice_item_id,fk_invoice_id,item_number, item_name, item_desc, item_quantity, item_unit, item_total,net_value)

      现在你需要做循环:

      Here .... Fire query to insert into `invoice` table for the fields : invoice_id,client_name, client_address, client_phone, client_number, invoice_date, invoice_number
      

      -> 获取 invoice 表的最后一个插入 ID,以将其插入到 invoice_item 表中字段 fk_invoice_id

      foreach ($_POST AS $k=>$v)
      

      { // 触发查询以插入到 invoice_item 表中的字段:invoice_item_id,fk_invoice_id,item_number, item_name, item_desc, item_quantity, item_unit, item_total,net_value }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        • 2018-07-03
        • 2014-02-25
        • 2012-01-04
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多