PHP Düzgün formatta json_encode yapmak
Tablomdaki "taksitler" alanında şu şekilde kayıtlı bir veri mevcut
{"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}
Ben bunu "textarea" içerisine basmak, kullanıcıya da manuel olarak düzenleme imkanı vermek istiyorum. Daha sonrasında da kullanıcı "Update" butonuna basarsa, json formatını bozmadan - sadece taksitlerin karşısındaki float olan sayısal kısmı güncellemesini yaparak tekrar kayıtta tutmak istiyorum yani.
1- Yukarıdaki json formatındaki kayıtı "textarea" içerisine en mantıklı nasıl basabilirim? (Decode ettikten sonra Array ( [taksit_2] => 13.92 ) şeklinde String olarak basıyor; bunu Array'e çevirip oradan encode etmeyi bir türlü başaramadım. Doğru formata sokamadım.
2- Mevcut formatı bozmadan, dediğim gibi ekrana bastıktan sonra kullanıcı sayıları değiştirdikten sonra tekrar aynı format içerisinde nasıl update işlemi yapmamı önerirsiniz?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (2)
Bunun için mysql json fonksiyonlarından yararlanabilirsiniz.
Tamamen çalışma prensibini anlamanız ayrıntılara pek dikkat etmeden şunun gibi bir örnek hazırladım;
Bu örnekte kullandığım t
adında bir db oluşturdum, bir id
ve bir tane de a
adında iki sütun ekledim. a
sütununa sizin json verisini olduğu gibi koydum
Geri kalan kodlar aşağıdaki gibi
index.php
<?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;
}
?>
<!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
$query = $db->query("SELECT * FROM t")->fetchAll(2);
foreach ($query as $t) {
$arr = json_decode($t['a'], true);
foreach ($arr as $item => $value) { ?>
<label for="<?= $item ?>"><?= $item ?></label>
<input type="number" id="<?= $item ?>" name="<?= $item ?>" value="<?= $value ?>"><br>
<?php }
}
?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(function () {
$("input[name^='taksit']").on("change keyup", function () {
$.post('ajax.php', {
index: $(this).attr("id"),
value: parseFloat($(this).val())
}).done(e => {
console.log(e ? 'İşlem başarılı' : 'İşlem başarısız')
})
})
})
</script>
</body>
</html>
ajax.php
<?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;
}
if ($_POST) {
$update = $db->query("UPDATE t SET a = JSON_REPLACE(a, '$.{$_POST['index']}', {$_POST['value']}) WHERE id = 1"); // Buradaki id değerini dinamik yapabilirsiniz
echo (bool)$update->rowCount();
}
Kullanıcıya hata yapma şansı bırakmadan güncelleme yaptırmalısın bu yüzden textarea içine objeyi string olarak yani text olarak koyman iyi fikir değil.
Bunun yerine her alan için ayrı input alanı luşturup
<label>1. taksit</label>
<input type="text" name="taksit[]" value="<?php echo $taktis1; ?>">
<input type="text" name="taksit[]" value="<?php echo $taktis2; ?>">
şeklinde olmalı.
Kaydettirirken de formda ki diğer verilerle beraber değişiklik yapılanlarıda yani hepsini birden alıp kaydettirebilirsin.
Formda ki verileri şu şeklide alacaksın
$new_arr = array();
foreach($_POST["taksit"] as $taksit_name => $tutar){
$new_arr[$taksit_name] = $tutar;
//Sonra :
$jsonUpdate = json_encode($new_arr);
bu şekilde bir sonuç (object) alırsın {"taksit1" : 100, "taksit2" : 50}
/*
Ve php ile veri tabanına kayıt
veriyi tutacağın alanı text olarak yapmalısın.
*/
Sonuç olarak teker teker değil her defasında kolonda ki bütün veriyi güncelleyecek.