Profil detayı eklendi, herkes profillerine girip bir gözatsın! Sevdiğiniz üyelerin cevaplarını takip edin! Tüm güncellemeler

JSON_ARRAY_APPEND slash sorunu /

Merhabalar bir problem yaşıyorum ve işin içinden çıkamadım ne denediysem olmadı


json formatında bi sütunum var ben buraya ilk kayıt esnasında php ile ayarladığım bir jsonu dahil ediyorum


    $add = [
        "type" => 1,
        "date" => "2019-01-22",
    ];


json_ancode($add);


bunu ürün kayıt esnasında kayıt yaptırıyorum sütunda bu şekilde oluyor


[
  {
    "type": 1,
    "date": "2019-01-22"
  }
]


ama ben bu sütuna JSON_ARRAY_APPEND ile yeni bir değer ekletiyorum


product_type = JSON_ARRAY_APPEND(product_type, "$", "'. addslashes( json_encode( $add ) ) .'")


[
  {
    "type": 1,
    "date": "2019-01-22"
  },
  "{\"type\":2,\"date\":\"2019-01-22\"}"
]



bunu düzgün bir şekilde nasıl yapabilirim ?

3

Cevaplar (3)

İşlem devam ediyor, lütfen bekleyin..
Emre BÜYÜKDURMUŞ
Doğru Cevap
@ebykdrms
3 ay önce [Güncellendi]

MySQL 5.7.8 versiyonuyla birlikte MySQL'e gelen yenilikler ile artık json değerleriyle çalışan fonksiyonlarımız var. Bunlardan JSON_ARRAY_APPEND() fonksiyonu, json olarak kayıtlı bir değere ekleme yaparak eklenmiş halini geri döndürüyor.


Siz MySQL'e şu komutu veriyorsunuz:

product_type = JSON_ARRAY_APPEND(product_type,"$","{\"type\":2,\"date\":\"2019-01-22\"}")

Siz burada PHP tarafında addslashes() komutunu kullandığınız için PHP tüm tırnaklardan önce \ karakterini ekliyor. Buradaki amacınız " karakterlerinden dolayı bozuk bir sorgu elde etmemek olmalı. " işaretini serbest bıraksanız SQL sorgusu bozuluyor, serbest bırakmasanız da düzgün bir json veri gönderemiyorsunuz.


Yukarıdaki string ifadeyi bir PHP değişkeninde oluşturuyorsunuz sanırım:

$query='product_type=JSON_ARRAY_APPEND(product_type,"$","'.addslashes(json_encode($add)).'")';

Eğer böyleyse, bu satırı aşağıdaki gibi düzenleyip deneyebilirsiniz:

$query='product_type=JSON_ARRAY_APPEND(product_type,\'$\',\''.json_encode($add).'\')');

Burada, sorgunuzdaki çift tırnakları tek tırnağa çeviriyorum. Böylece json_encode($add) değeriniz tek tırnaklar içinde çift tırnak içeren bir ifade oluyor ve aşağıdaki sorgu oluşuyor:

product_type = JSON_ARRAY_APPEND( product_type, '$', '{"type":2, "date":"2019-01-22"}' )


Eğer $add değişkeninizi dışarıdan alıyorsanız, yani bir sql injection sorunu varsa da güvenliği $add değişkeninin değerlerini kontrol ederek sağlayabilirsiniz.

Cevapla @alikanci3 ay önce
Hocam teşekkür ederim ama ben bu sorunu şöyle hallettim sorun kalmadı mantıklımı sizce

product_type = JSON_ARRAY_APPEND(COALESCE(product_type, "[]"), "$", CAST("'. addslashes( json_encode( $add, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE ) ) .'" AS JSON))
Cevapla @ebykdrms3 ay önce
@alikanci, kullandığınız yöntemde hem PHP hem SQL tarafında (hissedilmeyecek oranda da olsa) iş yükü oluşturuyorsunuz. Yanıtta verdiğim şekilde kullanırsanız sadece PHP tarafında ve daha az iş yüküyle istediğinizi yapabileceksiniz:

$query='product_type=JSON_ARRAY_APPEND(product_type,\'$\',\''.json_encode($add).'\')');
Cevapla @alikanci3 ay önce
Tamamdır teşekkür ederim bu şekilde düzenleyeceğim.
İşlem devam ediyor, lütfen bekleyin..
Recep Karamanlı

json_ancode yazılmış. Yazım hatası var. json_encode($add); olarak test ediniz.


Cevapla @alikanci3 ay önce
@recepkaramanli, öyle birşey olsaydı program fatal error verirdi ama bununla alakalı değil
İşlem devam ediyor, lütfen bekleyin..
Yusuf Kaan Karakaya
@TheYkkk
3 ay önce
neden addslashes kullaniyorsun?


Cevapla @alikanci3 ay önce
çünkü mysql syntax hatası alıyorum bunuda o şekilde çözdüm
Cevapla @alikanci3 ay önce
json_encode( $add, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE ) bu şekildede denedim oluyor addslashes çözüyor bir tek güncelleme esnasında
İşlem devam ediyor, lütfen bekleyin..

Cevap yaz Sadece sorunun cevabını yazın