【问题标题】:Using foreach for sql insert from dynamic post array使用foreach从动态post数组插入sql
【发布时间】:2013-08-31 20:20:11
【问题描述】:

我正在尝试获取输入表单的数据,并使用帖子在同一页面上对其进行处理,这将获取所有数据并将其插入到数据库中的表中。这是一个存在于我试图转换为 php 的 .asp 页面上的表单。该表单用于输入商店的缺货数量。

每一行看起来像这样:

Number |        Department         | Insp Type | Qty | Memo
______________________________________________________________
1      | Bakery And Deli (OOS)     |    OOS    | 1   | george
2      | Produce                   |    OOS    | 6   | apples

等等……

有大约 24 个部门的行。如果将新行添加到数据库中,则表单会动态更新并显示新行。唯一的用户输入数据是数量和备注。其他的由表单前面的 sql 查询预先填充。使用我拥有的当前代码,当我回显我的 $sqli (插入查询)时,这就是我得到的:

我还想返回一个计数,如果“项目”输入到表单上的“数量”字段中,则为总金额。

任何帮助将不胜感激。在过去的几天里,我一直在试图弄清楚如何做到这一点。我一直在左右搜索谷歌试图弄清楚这一点,但我完全被难住了。提前感谢您的帮助。

【问题讨论】:

    标签: php sql sql-server


    【解决方案1】:

    那是因为您在 foreach 循环中创建了 SQL 语句。

    我还建议使用输入数组(如$_POST['txtStoreID'][0] 等...)以使事情变得更容易。

    在您的情况下,我假设您的 $_POST-array 中的字段命名如下:txtStoreID_1

    // First, create array for all results
    $res_arr = array();
    
    // Load array with all results
    foreach ($_POST as $key=>$value) {
        $tmp_name = explode('_',$key,2);
        $pri_key = $tmp_name[1]; // number
        $sec_key = $tmp_name[0]; // name
        if (!is_array($res_arr[$pri_key])) {
            $res_arr[$pri_key] = array();
        }
        // This creates for example: $res_arr['1']['txtStoreID'] containing 'Store_31'
        $res_arr[$pri_key][$sec_key] = $value;
    }
    
    // Next, create insert statements
    foreach ($res_arr as $data) { // Now you get $data['txtStoreID'] etc.
        $sqli  = "INSERT INTO Inspection_tbl (Store_ID, Dept_ID, Quantity, Memo, User_ID, Date_Time) ";
        $sqli .= "Values ('".$data['txtStoreID']."', ";
        $sqli .= "'".$data['txtDeptID']."', ";
        $sqli .= "'".$data['txtQuantity']."', ";
        $sqli .= "'".$data['txtMemo']."', ";
        $sqli .= "'".$data['txtUserID']."', ";
        $sqli .= "'now()')";
        echo $sqli; // Check query
    }
    

    请注意,这只是对您的输入字段的计算猜测。

    编辑:

    除了我所做的 is_array() 更改之外,我猜您需要的是 DeptID,而不是部门的文本值。

    所以,代码的底部应该是:

    // Next, create insert statements
    foreach ($res_arr as $deptID=>$data) { // Now you get $data['txtStoreID'] etc.
        $sqli  = "INSERT INTO Inspection_tbl (Store_ID, Dept_ID, Quantity, Memo, User_ID, Date_Time) ";
        $sqli .= "Values ('".$data['txtStoreID']."', ";
        $sqli .= "'".$deptID."', ";
        $sqli .= "'".$data['txtQuantity']."', ";
        $sqli .= "'".$data['txtMemo']."', ";
        $sqli .= "'".$data['txtUserID']."', ";
        $sqli .= "'now()')";
        echo $sqli; // Check query
    }
    

    【讨论】:

    • 是的,这些字段被命名为 txtStoreID_$DeptID、txtQuantity_$DeptID 等。我把我的数组部分注释掉了,然后把你的放到我的代码中。我放了一个回声“测试1”;回声“测试2”;等在代码的每个部分,因为它没有处理到显示sqli echo的地步。它在执行 !isarray 并停止之前停止。因此,该线以下的任何内容都不会被处理。有什么想法吗?
    • 哎呀,必须是is_array()!没注意那个!检查更新!
    • 好的,所以我按照您的建议进行了更改。它现在进入 SQL 查询回显。但是这些字段是空的。 SQL 查询如下所示: INSERT INTO Inspection_tbl (Store_ID, Dept_ID, Quantity, Memo, User_ID, Date_Time) Values ('', '', '', '', '', 'now()')
    • 感谢您的出色帮助,我取得了一些进展。不过还是一个问题。我为表单所有行上的所有字段输入数据。但是我只有 24 行中的 15 行显示为插入查询。它们按以下顺序出现(表格行#):22,2,3,4,5,6,7,8,19,23,13,14,24,16,18。我还将编辑上面的代码,因为我在 sql 插入查询的开头添加了一个 if 来过滤掉任何数量为空的行。
    • 在 EDIT 中插入 SQL。我用 1 表示第 1 行的数量,用 qty 2 表示第 2 行等,用 memo1 表示第 1 行,用 memo 2 表示第 2 行,等等。
    猜你喜欢
    • 2021-10-03
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多