v2.5.2
Giriş yap

PHP Düzgün formatta json_encode yapmak

obey00
493 defa görüntülendi

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?

Cevap yaz
Cevaplar (2)
abdullahx
1228 gün önce

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();
}
kartal
1228 gün önce

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.