2017-06-09 10 views
1

私はforeachを使用して配列からデータを保存しようとしていますが、たびに配列の最後の要素を保存しています。各ループのPHPは最後の要素のみを返します

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を使用する場合、それが唯一の最後の要素を返します。

は、ここに私のコードです。

私はこの問題を解決するのを手伝ってください。

+2

[各ループでforeachループ内で宣言されたPHP変数が破棄され、再作成されますか?](https://stackoverflow.com/questions/13626812)/are-php-variables-inside-a-foreach-loop-destroy-and-re-created-at-eac) – Pyromonk

+0

更新クエリの 'where'条件??? –

+0

はいどこに条件がありますか。 –

答えて

0

あなたのコードからわかるもの PHPまたはMysqlの問題またはエラーではありません。あなたのロジック すなわち:その問題は

foreach ($prices as $key => $value) { 
     $xx = $value; 

     $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?"); 
     $query2->execute(array($xx)); 
    } 

更新なステートメントは、それぞれ、すべての時間を実行し、テーブルのすべての価格を交換してください。したがって、以前のすべての更新ステートメントを置き換える最新の値を取得しています

+0

ループの外側に挿入コードを書くと、$ xxの値はnullになります –

+0

正確に何を望みますか?私たちにデータベースの例を示してください –

+0

おかげで..あなたは正しい問題は私の論理です。最後にそれを解決しました。 –

0

$ xxは繰り返しの前に作成され、nullに設定されます。各繰り返しの間、上書きされます。この方法、スクリプト、関数のスコープを離れる前に、任意の時点で破棄されることはありません、...

$xx; 
foreach ($prices as $key => $value) { 
     $xx = $value; 
     $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?"); 
     $query2->execute(array($xx)); 
    } 
0

変数$xx = $value;はforeachの外で宣言しなければなりません。..

あなたのコードの変数$xx = $value;で最初の反復中に作成され、それ以降の反復ごとに上書きされます。

それはこのようにする必要があります:PHPの変数については

$xx = $value; 
    foreach ($prices as $key => $value) { 


     $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?"); 
     $query2->execute(array($xx));  



    } 
0

はあなたの問題のために、このAre PHP variables declared inside a foreach loop destroyed and re-created at each iteration?をチェックする必要がループ内で宣言します。

はまた、あなたがあなたの配列を確認する必要があります別のものは、ループの前空ではありません。

そして、あなたは、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)); 
    } 
} 
+0

それを宣言しても最後の要素はまだ保存されています –

+0

私はあなたが変更された更新クエリを表示できますか? –

0

私はゲスあなたはそれが$キー

$キーが$価格の配列における配列値のインデックス作成で使用されて行うことができます

foreach ($prices as $key => $value) { 
     $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?"); 
     $query2->execute(array($value[$key])); 
    } 

希望はこれが助けます。

関連する問題