PHP İç İçe Foreach Problemi
Veritabanı tablomda iki adet Field var, birincisinde tüm taksit seçeneklerinin YÜZDE değerleri yer alıyor. Şu şekilde:
{"taksit_2":3.92,"taksit_3":4.91,"taksit_4":5.9,"taksit_5":6.88,"taksit_6":7.87,"taksit_7":8.86,"taksit_8":9.84,"taksit_9":10.83,"taksit_10":11.82,"taksit_11":12.8,"taksit_12":13.79}
İkinci tablomda ise; kullanıcının formda bu taksit oranlarının altındaki Text tipindeki INPUT'lara yazdıkları fiyatlar var. O da şu şekilde:
{"taksit_2":"1.00","taksit_3":"2.00","taksit_4":"3.00"}
Yani kullanıcıya ilk başta 2 taksitten 12 taksite kadar 11 adet INPUT gösteriyorum. Kullanıcı yukarıdaki örnekte gösterdiğim gibi mesela 3 adet INPUT'u dolduruyor ve bu şekilde kayıt ediyor. Tablodaki ikinci olan field'e kayıt oluyor burası...
Benim yapmak istediğim şey ise şu: Mesela kullanıcı yukarıdaki örnekte olduğu gibi "taksit_2, taksit_3, taksit_4" seçeneklerine değerler girdiyse; sayfa yenilendiği zaman hangi taksit oranlarına değer verdiyse (yani bu örnekte 3 tane taksit oranına değer girmiş) onların INPUT'larındaki Value'leri müşterinin kayıt ettiği VALUE'ler ile güncelleyeceğim; ayrıca yine o yerlerde birkaç kod parçası yazacağım...
Ancak iç içe foreach döngüsü yaptığım zaman; sadece SON/EN ALTTAKİ kayıt üzerinde işlem yapılıyor; diğerlerini atlıyor.
Örnek kod parçam:
foreach ((array)$cardRates as $key => $val) {
foreach ((array)$arrAlts as $keyTaksit => $valAltTL) {
if($keyTaksit == "taksit_{$cnt}") {
$altTutarTL = $valAltTL;
$altChecked = 'checked';
} else {
$altChecked = null;
}
}
Yukarıdaki kod parçasını çalıştırdığım zaman; sadeceen son hangi kayıt yapıldıysa (örneğin taksit_3, taksit_6, taksit_11 değerlerine müşteri müdahale ettiyse; sadece taksit_11 için işlem yapıyor)
Umarım detaylı açıklayabilmişimdir.
Kıssadan hisse: Veritabanı tablomda 2 adet field mevcut; bunları JSON_DECODE ediyorum. İki tarafta'da KEY'ler aynı düzende kurulu olduğu için; AYNI/ORTAK olan KEY'ler üzerinde bir takım kodlar eklemem/müdahele etmem gerekiyor... Yardımcı olur musunuz?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (6)
abdullahx; bayağı benzer bir senaryo sorulmuş gerçekten. cevabını deneme fırsatım olmadı; birkaç saat önce alternatif çözüm düşünürken FOREACH'ten önce farklı ayrı bir array oluşturup; müşterinin güncellediklerini bu array'e push etmek ve harici oluşturduğum bu array içerisinden if/else yardımı ile kod parçalarımı yazarak sorunu çözdüm. Yine de farklı yöntemler arayan arkadaşlar için de cevabın oldukça faydalı olacaktır diye düşünüyorum. Teşekkürler
Ben bu soruya daha önce bir yerlerde yanıt vermiştim, hatta bunun için hazırladığım kodlar ve veri tabanı örneği bile duruyor hâlâ.
Aşağıda yazdığım kodlarda kullanıcının yazdığı değerler direkt olarak birinci fielddaki ana datayı güncelliyor.İkinci field a da kullanıcının en son kayıt ettiği veriler ekleniyor. Yani diyelim en son 5,6 ve 7 numaralı taksitleri yazıp kayıt ettiyse sadece taksit_5, takist_6 ve taksit_7 kaydoluyor.
index.php
<!doctype html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<?php
try {
$db = new PDO("mysql:host=localhost; dbname=test","root","");
$db-> exec("SET NAMES utf8mb4; SET CHARSET utf8mb4");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Bağlanamadı'. $e->getMessage();
$db = null;
}
$query = $db->query("SELECT * FROM t")->fetch(2);
$taksitler = json_decode($query['field_1'], true);
?>
<form action="ajax.php" method="post">
<?php
for ($i = 2; $i <= 12; $i++): ?>
<label for="taksit_value_<?= $i ?>">Taksit <?= $i ?></label>
<input id="taksit_value_<?= $i ?>" type="number" disabled value="<?= $taksitler['taksit_'.$i] ?>"> <br>
<label for="taksit_input_<?= $i ?>">Taksit <?= $i ?> için değer giriniz</label>
<input id="taksit_input_<?= $i ?>" type="number" name="taksit_<?= $i ?>" step="0.01"><br><br>
<?php endfor;
?>
<input type="submit" value="Onayla">
</form>
</body>
</html>
ajax.php
if ($_POST) {
$lastUpdate = [];
foreach ($_POST as $key => $value) {
if (!empty($value)) { // Yalnızca girilen değerleri güncellemek için
$db->query("UPDATE t SET field_1 = JSON_REPLACE(field_1, '$.$key', $value) WHERE id = 1"); // Buradaki id değerini dinamik yapabilirsiniz
$lastUpdate[$key] = $value;
// Diğer kodlarınızı da burada yazablirsiniz
}
}
if (count($lastUpdate)) {
$update = json_encode($lastUpdate);
$query = $db->prepare("UPDATE t SET field_2 = ? WHERE id = 1");
$query->execute([$update]);
}
}
hocam bu nasıl yapı hiç bir şey anlayamadım soruyu acaba revize mi? etseniz anlaşılırlığı pek yok bence..