v2.5.2
Giriş yap

PHP Düzgün formatta json_encode yapmak

obey00
494 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?

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();
}