有没有比我正在做的更好的方法来处理来自 POST 的数组数据?



首先让我说,我相信有更好的方法,我不是一个专业的程序员,只是一个试图用完全用html和php构建的应用程序解决个人小业务问题的书呆子。

我不确定我是否已经尽可能有效地做到了这一点,我想知道是否有更好的方法来做到这一点。我的应用程序严格来说是HTML和PHP。

在HTML表单中,我基于搜索构建一个项目列表。这个列表是动态的,因为它可以是基于搜索的任何给定数量的项目。最终结果是,任何具有用户输入的销售价格的行项目最终都将被添加到订单中。那些空白的将被单独留下。每行有三个变量\值需要发送到POST。所选项目的项目id、项目描述和销售价格。

以下是设置表单的php和html(请放心,我不是开发人员(

echo "<form action='actionAddItemToOrder.php' method='post'>";
while($row = mysqli_fetch_assoc($result)){
$itm = $row["lotitem_description"];
$itmid = $row ["lotitem_id"];
$itmcost = $row['lotitem_cost'];
echo "<p style='margin-left:50;'><b>";
echo "<input type='hidden' name='itmid[]' value='$itmid'/>Item # ".$itmid." - ".$itm."(cost$".$itmcost.")";
echo ":  $<input type='text' name='sellprc[]' size='5'>";
echo "<input type='hidden' name='itm[]' value='$itm'>";
}
echo "<p class='form-button-center'><input type='submit' value='Add item'></p>";
echo "</form>";}

现在,当用户单击提交按钮时,将向POST提交三个数组,每个数组对应将项目添加到订单所需的值集。以下是POST 中这些阵列的外观

Array
(
[itmid] => Array
(
[0] => 1825
[1] => 1824
[2] => 1823
[3] => 1822
[4] => 1821
[5] => 1820
[6] => 1819
[7] => 1818
)
[sellprc] => Array
(
[0] => 15
[1] => 
[2] => 
[3] => 
[4] => 17
[5] => 
[6] => 
[7] => 21
)
[itm] => Array
(
[0] => Widget A
[1] => Widget B
[2] => Widget C
[3] => Widget D
[4] => Widget E
[5] => Widget F
[6] => Widget G
[7] => Widget H
)

这里可以做一些假设。由于sellprc数组中只有三个键分配了值,这意味着这些键是添加到订单中的项目,而值是销售价格。没有值的键不会添加到此顺序中。sellprc数组中的键号可用于匹配itm和itmid值。

从这里开始,我所能想到的就是创建另一组数组,以便将正确的项目ID和描述与具有值的sellprc键对齐。我用这个PHP 来做这件事

$prcarray = array();
$itmarray = array();
$itmidarray = array();
foreach ($_POST['sellprc'] as $key2=>$val2) {
if ($val2) {
$val2 = preg_replace('/[^a-zA-Z0-9-. ]/s','',$val2);
array_push ($prcarray,$val2);
array_push ($itmarray,$_POST['itm'][$key2]);
array_push ($itmidarray,$_POST['itmid'][$key2]);
}
}

我最终得到了这些阵列

Array
(
[0] => 15
[1] => 17
[2] => 21
)
Array
(
[0] => Widget A
[1] => Widget E
[2] => Widget H
)
Array
(
[0] => 1825
[1] => 1821
[2] => 1818
)

然后,基于这三个数组,我用php 设置了每个项目的项目id、描述和销售价格

foreach($itmidarray as $key=>$val) {
$itmid = $val;
$sellprc = $prcarray[$key];
$itm = $itmarray[$key];
<do some sql inserts and updates based on these values then go to the next set>
}

这是有效的,但我觉得这真的很低效,我想知道我是否能做得更好。

谢谢!

您可以像这样一起编写PHP和HTML:

<form action='actionAddItemToOrder.php' method='post'>
<?php while($row = mysqli_fetch_assoc($result)):?>
<p style='margin-left:50;'><p>
<input type='hidden' name='itmid[]' value='<?= $row ["lotitem_id"] ?>'/>Item # <?= $row ["lotitem_id"] ?> - <?= $row["lotitem_description"] ?>(cost$ <?=$row['lotitem_cost'] ?>>
<input type='text' name='sellprc[]' size='5'>
<input type='hidden' name='itm[]' value='$itm'>
<?php endwhile; ?>
<p class='form-button-center'>
<input type='submit' value='Add item'>
</p>
</form>

不知道你想做什么,所以需要更多的信息或一些屏幕截图来避免干扰你的代码。

U可以发送json而不是数组。

首先,如果事物彼此属于/相关,就把它们放在一起。因此,您不需要在表单中定义3个单独的数组,提交表单后必须匹配其中的元素。

另一件事是如何编写HTML内容。如果你不使用像Smarty这样的模板引擎,你仍然可以使用变量来首先构建你的HTML内容。然后在最后你可以打印它。这是你的HTML表单的编辑版本:

构建HTML表单

$myform = "<form action='actionAddItemToOrder.php' method='post'>";
$counter = 0;
while($row = mysqli_fetch_assoc($result))
{
$id = $row["lotitem_id"];
$description = $row["lotitem_description"];
$cost = $row['lotitem_cost'];
$myform .= "<p style='margin-left:50;'><b>
<input type='hidden' name='items[$counter][id]' value='$id'/>
<input type='hidden' name='items[$counter][description]' value='$description'/>
Item #$id - $description (cost ${$cost}): $<input type='text' name='items[$counter][sellPrice]' size='5'>
</p>";
$counter++;
}
$myform .= "<p class='form-button-center'>
<input type='submit' value='Add item'>
</p>
</form>";
echo $myform;

正如您所看到的,我首先使用$myform来构建和存储HTML表单,当所有行都添加到其中时,它就会被打印出来如果你有成千上万的物品,这种方法可能不是最合适的方法

将项目张贴并添加到订单

提交表单后,您可以将具有售价的项目添加到订单中,如下所示(我假设您有一个函数addItemToOrder(),它需要3个参数(:

foreach($_POST['items'] as $item)
{
$sellPrice = trim($item['sellPrice']);
if(!empty($sellPrice) and is_numeric($sellPrice))
{
// add this item to the order...
addItemToOrder($item['id'], $item['description'], $item['sellPrice']);
}
}

最新更新