我正在尝试使用foreach从数组中保存数据,但它每次只保存数组的最后一个元素。
这是我的代码:
public function demo($cakeId, $percent) {
$query = $this->dbh->prepare("SELECT price, price * $percent / 100 as dprice FROM prices WHERE cake_id = ? ");
$query->execute(array($cakeId));
$prices = $query->fetchAll(\PDO::FETCH_ASSOC);
foreach ($prices as $key => $value) {
$d_amount = $value['dprice'];
$price = $value['price'];
$final_price = $price - $d_amount;
}
$query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ? WHERE cake_id = ?");
$query2->execute(array($final_price,$cakeId));
$return['data'] = [];
$return['message'] = "Discount Added";
$return['msgType'] = true;
return $return;
}
$prices
是一个包含所有价格的数组,但是当我在循环中使用$prices
时,它只返回最后一个元素。
请帮我解决这个问题。
答案 0 :(得分:0)
$ xxis在任何迭代之前创建并设置为null。在每次迭代期间,如果将被覆盖。在离开脚本,函数,方法......的范围之前,它不会被销毁。
$xx;
foreach ($prices as $key => $value) {
$xx = $value;
$query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
$query2->execute(array( $xx));
}
答案 1 :(得分:0)
变量$xx = $value;
应该在foreach之外声明..
在您的代码中,变量$xx = $value;
在第一次迭代期间创建,而不是在每次进一步迭代时覆盖。
应该是这样的:
$xx = $value;
foreach ($prices as $key => $value) {
$query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
$query2->execute(array( $xx));
}
答案 2 :(得分:0)
对于php变量声明内部循环,您必须检查此问题Are PHP variables declared inside a foreach loop destroyed and re-created at each iteration?。
在循环之前,你应该检查你的数组的另一件事是 not empty :
你必须为你的更新查询添加条件检查mysql的一些好东西:
$xx;
if(!empty($prices)){
foreach ($prices as $key => $value) {
$xx = $value;
$query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
$query2->execute(array( $xx));
}
}
答案 3 :(得分:0)
我猜你能做的就是使用$ key
$ key是$ prices数组中的数组值索引
foreach ($prices as $key => $value) {
$query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
$query2->execute(array($value[$key]));
}
希望这有助于。
答案 4 :(得分:0)
我可以从您的代码中看到的内容 这不是PHP或Mysql的问题或错误。它的逻辑问题 即:
foreach ($prices as $key => $value) {
$xx = $value;
$query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
$query2->execute(array( $xx));
}
更新语句每次都执行并替换表的所有价格。因此,您将获得替换所有先前更新语句的最新更新值