【问题标题】:PHP: Using 2 arrays in a foreach but one array containing null valuesPHP:在 foreach 中使用 2 个数组,但一个数组包含空值
【发布时间】:2014-04-16 03:17:32
【问题描述】:

嗨,我是 PHP 的新手,但我一直在学习,这是我第一次来 Stackoverflow 并实际上问了一个问题,所以请放轻松:P

我正在创建一个工作请求系统,但我被困在一个特定的地方,我想我错过了一些非常简单的东西,所以我希望你能帮助我。

我正在创建的表单当前有许多复选框(选择)和文本框(数量),并且采购项目通过此查询从数据库中列出

<?php 
$query="SELECT * FROM RequestProcurementItems ORDER BY ITEMID"; 
$result = odbc_exec($connection_id,$query);

$requestitems=""; 

while ($row = odbc_fetch_array($result)) { 

    $itemid=odbc_result($result,"ITEMID"); 
    $itemtype=odbc_result($result,"ITEMTYPE");
    $itemdesc=odbc_result($result,"ITEMDESCRIPTION");   

    foreach($row as $cell)
    echo "<tr>";

    echo "<td colspan='2'>". $itemid ." - ". $itemtype ." - ". $cell ."</td><td colspan='2'><input type='checkbox' name='additem[]' value='".$itemid."'><input type='text' name='addquantity[]'>";

    echo "</td>";
    echo "</tr>\n";
} 
?> 

复选框被添加到数组“additem”中,文本框被添加到数组“addquantity”中

提交表单时,复选框和数量最后执行,以便它们可以获取 MAX(ID) 并索引到另一个表。

这是输入复选框和数量字段的代码。

    <?php 
$sqlgetmaxid = "SELECT MAX(RequestID) FROM RequestFormProcurement";
            $resultmaxid = odbc_exec($connection_id,$sqlgetmaxid);
            while( $row = odbc_fetch_array($resultmaxid) ) { 

            $qarray = array_filter($_POST['addquantity']);

            // Query to Add Items selected from list.                       
                if(!empty($_POST['additem'])){



foreach($_POST['additem'] as $itemid => $quantity) {
                                        //echo $_POST['additem'][$itemid].$_POST['addquantity'][$itemid];

                                        $sql = "INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (".implode(",",$row).", ".$_POST['additem'][$itemid].", ".$qarray[$itemid].")";
                                        print_r($sql);
                                        odbc_exec($connection_id,$sql);
                                        odbc_commit($connection_id) or die (comm_error);
                                        }       
                                }
                            }
?>

问题是它有效...只有选中的复选框被输入到数组中,但是数量的空文本字段被输入到“addquantity”数组中,所以我尝试使用

$qarray = array_filter($_POST['addquantity']);

但它仍然包含 NULL 字段。因此,一旦提交查询,我在一个空格后的查询中就会丢失一个数量(对不起,如果我不善于解释!!)

这就是查询失败的原因(注意 10、11、12、14 我没有检查选项 13,所以现在选项 14 的数量丢失了,我保持 id 和数量相同以用于测试目的)。

INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 10, 10)
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 11, 11)
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 12, 12)

Notice: Undefined offset: 3 in I:\IT\Web_Request_Forms_Database\UwAmp\www\includes\HWS\NewHWSWRequestForm.php on line 282
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 14, )

非常感谢您提前提供的任何帮助。

编辑:我改变了什么

我已经更改了 sql 查询

    $sqlgetmaxid = "SELECT MAX(RequestID) FROM RequestFormProcurement";
    $resultmaxid = odbc_exec($connection_id,$sqlgetmaxid);
    while( $row = odbc_fetch_array($resultmaxid) ) { 

    print_r($_POST['addquantity']);
    var_dump($_POST['addquantity']);

    // Query to Add Items selected from list.                       
        if(!empty($_POST['additem'])){

                            foreach($_POST['additem'] as $itemid => $quantity) {
                            //echo $_POST['additem'][$itemid].$_POST['addquantity'][$itemid];

                            $sql = "INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (".implode(",",$row).", ".$_POST['additem'][$itemid].", '".$_POST['addquantity'][$quantity]."')";
                            print_r($sql);
                            odbc_exec($connection_id,$sql);
                            odbc_commit($connection_id) or die (comm_error);
                            }       
                    }

当我们指定键时,我们没有调用数量的字符串。

$sql = "INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (".implode(",",$row).", ".$_POST['additem'][$itemid].", '".**$_POST['addquantity'][$quantity].**"')";

输出

Array ( [10] => 100 [11] => 111 [12] => 0 [13] => 1333 [14] => 0 [15] => 0 [16] => 0 [17] => 177 [18] => 0 [19] => 0 [20] => 20 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 )
array (size=18)
  10 => string '100' (length=3)
  11 => string '111' (length=3)
  12 => string '0' (length=1)
  13 => string '1333' (length=4)
  14 => string '0' (length=1)
  15 => string '0' (length=1)
  16 => string '0' (length=1)
  17 => string '177' (length=3)
  18 => string '0' (length=1)
  19 => string '0' (length=1)
  20 => string '20' (length=2)
  21 => string '0' (length=1)
  22 => string '0' (length=1)
  23 => string '0' (length=1)
  24 => string '0' (length=1)
  25 => string '0' (length=1)
  26 => string '0' (length=1)
  27 => string '0' (length=1)
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 10, '100')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 11, '111')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 13, '1333')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 17, '177')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 20, '20')

【问题讨论】:

  • 如果您在尝试执行数据库事务之前处理和清理您的输入,这将有所帮助。您应该使用库与您的数据库对话。字符串连接和$_POST 不是在构建 SQL 查询时应该一起看到的东西。它使您容易受到 SQL 注入攻击。你可以在这里阅读:en.wikipedia.org/wiki/SQL_injection
  • 我推荐看看这个网站,了解一些 PHP 开发的最佳实践:phptherightway.com。在 Databases 下有一个名为 Abstraction 的部分,提供了一些您可以使用的支持通用数据库服务器的库示例。像该指南建议的那样,开始使用大量其他工作部分似乎更难,但它会让你成为更好的开发人员,未来的“你”会更快乐。
  • 谢谢乔纳森,感谢您提供的链接,我一定会看一看,我一直在努力改进我的开发方式。但是对于我目前的解决方案,我并不担心 SQL 注入,该站点仅限于我们的子网,并且仅用于跟踪 IT 请求。但是感谢您的回复,我会检查网站!
  • 一个简单的解决方法是将文本框 HTML 中的值设置为 0。
  • 但这不会使我的数组与“additem”数组更加脱节吗?因为我真的需要他们 1-1。

标签: php sql arrays checkbox


【解决方案1】:

试试这样的怎么样?

将数量输入字段的默认值设置为0,并设置数组索引以匹配您的商品id:

<input type='text' name='addquantity[".$itemid."]' value='0'>

然后,使用您的商品的 id 作为数组键访问数量数组:

foreach($_POST['additem'] as $itemid => $quantity) {
    //echo $_POST['additem'][$itemid].$_POST['addquantity'][$itemid];

    $sql = "INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (".implode(",",$row).", ".$_POST['additem'][$itemid].", ".$_POST['addquantity'][$itemid].")";
    print_r($sql);
    odbc_exec($connection_id,$sql);
    odbc_commit($connection_id) or die (comm_error);
}

【讨论】:

  • 嗯,刚试过这个,我不知道我是否做错了什么,但现在没有数量被传递到数组中。注意:未定义的偏移量:0 in I:\IT\Web_Request_Forms_Database\UwAmp\www\includes\HWS\NewHWSWRequestForm.php 在第 283 行 INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 10, )
  • 请运行并发布vardump($_POST['addquantity']);的输出
  • 我不明白$_POST['additem'][$itemid] $itemid 是如何设置为10 的,然后不知何故,在同一行,$_POST['addquantity'][$itemid] $itemid 设置为0。你确定没有错字吗?
  • 数组 (size=18) 10 => 字符串 '10' (length=2) 11 => 字符串 '11' (length=2) 12 => 字符串 '12' (length=2) 13 => 字符串'0'(长度=1) 14 => 字符串'14'(长度=2)15 => 字符串'0'(长度=1)16 => 字符串'0'(长度=1)17 = > 字符串'0'(长度=1)18 =>字符串'0'(长度=1)19 =>字符串'0'(长度=1)20 =>字符串'0'(长度=1)21 =>字符串'0'(长度=1)22 =>字符串'0'(长度=1)23 =>字符串'0'(长度=1)24 =>字符串'0'(长度=1)25 =>字符串'0 ' (length=1) 26 => 字符串'0' (length=1) 27 => 字符串'0' (length=1)
  • 感谢乔纳森的帮助,我已经更新了我的热门帖子。
【解决方案2】:

一种选择是循环遍历数组“addquantity”以检查空值。每当遇到空值时,将其分配为零。 这样,在向数据库中插入值时,值不会为空。

【讨论】:

  • 感谢您的回复,但问题仍然是 'additem' 数组和 'addquantity' 数组会完全脱节。
  • 在这种情况下,在 'addquantity' 数组中为相应的未选中的 'additem' 数组值分配零。您未在“additem”数组中获得的值是未选中的值。
  • 这里的问题是addquantity数组是根据提交的输入字段的数量进行数字键控的,而additem数组是根据itemid进行键控的。
  • 然后将 additem 数组的 html 元素命名为 0_itemid、1_itemid、2_itemid 等。正如您提到的 addquantity 数组是数字键控的,请将 additem 数组中下划线前的数字与数字键控的 addquantity 数组匹配。
  • 为什么要这样做而不是在 HTML 表单中设置数组键?
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 2016-03-08
  • 2021-07-17
  • 2012-01-23
  • 1970-01-01
  • 2020-01-05
  • 2013-05-06
  • 1970-01-01
相关资源
最近更新 更多