每个循环的PHP只返回最后一个元素

时间:2017-06-09 09:17:24

标签: php arrays loops

我正在尝试使用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时,它只返回最后一个元素。

请帮我解决这个问题。

5 个答案:

答案 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)); 
    }

更新语句每次都执行并替换表的所有价格。因此,您将获得替换所有先前更新语句的最新更新值