【发布时间】:2015-07-27 18:38:00
【问题描述】:
我正在尝试通过 php 运行 mysqli 查询,该查询将根据所选内容更新项目的数量。因此,如果用户选择两个数量的项目,该数量应该减少两个。我可以用这段代码成功地做到这一点:
$postparts = $_POST['part_name']; <-- This is an array of the items chosen
$postqty = $_POST['qty']; <-- This is an array of the qty of each item chosen
$combine = array_combine($postparts, $postqty); <-- I combine the arrays to match the qty to the item that was chosen.
foreach ($combine as $part=>$qty)
{
$update = <<<SQL
UPDATE `Houston` SET `qty` = (`qty`-?) WHERE `partnumber` = ?;
SQL;
$result = $mysqli->prepare($update);
$result->bind_param("is", $qty, $part);
$result->execute();
}
上面的代码将从选择的项目中减去适当的数量 - 这里没有问题。但是,我需要执行一个额外的检查,这样如果两个人同时检查同一个项目,第一个会得到一个成功的结果,但是如果项目的数量是 0,那么由于第一个结帐过程,第二个人会失败。我试着这样做:
$postparts = $_POST['part_name'];
$postqty = $_POST['qty'];
$partarray = array();
foreach ($postparts as $part => $id)
{
$finalpart = ($postparts[$part]);
$stuff = explode(',', $finalpart);
$partarray = array_merge($partarray, $stuff);
}
$combine = array_combine($postparts, $postqty);
$in = implode(',', array_fill(0, count($partarray), '?'));
$check = <<<SQL
SELECT * FROM `Houston` WHERE `partnumber` in ($in);
SQL;
$statcheck = $mysqli->prepare($check);
$statcheck->bind_param(str_repeat('s', count($partarray)), ...$partarray);
$statcheck->execute();
$statcheck->store_result();
$statcheck->bind_result($id, $partcat, $partnumber, $partqty);
while ($statcheck->fetch())
{
if ($partqty > 0)
{
foreach ($combine as $part=>$qty)
{
$update = <<<SQL
UPDATE `Houston` SET `qty` = (`qty`-?) WHERE `partnumber` = ?;
SQL;
$result = $mysqli->prepare($update);
$result->bind_param("is", $qty, $part);
$result->execute();
}
}
if ($partqty == 0)
{
header("location:error.php");
}
}
所以这个“几乎”有效 - 除了 foreach 循环运行多次。假设用户签出两个项目 - 然后 foreach 循环运行两次 - 所以订购的数量最终会为每个项目加倍(如果 3 个项目,则数量增加三倍,等等)。我怀疑这种行为的原因是因为我在 while 循环中运行 foreach 循环,但我不确定如何解决这个问题以使其正常工作。有人知道怎么做吗?
【问题讨论】:
-
快速浏览后,我认为您根本不需要 foreach!?您正在对同一数据集进行两次迭代。
-
您可能是对的,但是我该如何进行 mysqli 更新呢?我需要确保从正确的项目中减去正确的数量。我想过用 qty 做与零件相同的事情,并将其放在 while 循环中……我想我应该尝试一下,但不确定如何使用 str_repeat 绑定两个变量?也许我必须走 PDO 路线?