PHP Multi Process Asenkron Dosya Çalıştırma

Şimdi bildiğiniz gibi PHP’de kodların hepsi execute olduktan sonra sayfada gösterilir. Yani hepsi bitmeden işlem sonuçlanmaz. Bazı durumlar vardır ki, bunun böyle olmasını istemezsiniz. Örnek vermek gerekirse, bir e-posta bülten listeniz olsun. Ve bir konu paylaştıktan sonra atıyorum 5000 kişilik listeye e-posta göndereceksiniz.

Eğer bunu postu paylaşır paylaşmaz yaparsanız mailler gönderilene kadar sayfada bir bekleme süresi olacak. Ancak bizim istediğimiz, bunu arkaplan’da çalıştırarak göndermek. Aslında bunun için çok basit bir şey yazacağız. Öncelikle mailleri gönderecek php dosyasını oluşturalım. Örneğin send-email.php olsun.

<?php

sleep(5); // 5 sn sonra çalış

$postId = $argv[1];
// .. mail gönderme işlemleri vs.

?>

Şimdi postu yayınladıktan sonra şu kodu çalıştırmamız yeterli olacak;

exec('php -f send-email.php -- "5" > /dev/null 2>&1 &');

Burada tabi doğru dosya yolunu vermek önemli. Bu şekilde kodumuz çalıştığında send-email.php’deki 5 saniye bekleme kısmı mevcut sayfaya yansımayacaktır. Biz konumuzu oluşturmuş ve beklemeden işlem yapmaya devam ederken arkaplanda mailler gitmeye devam edecektir. Ayrıca dikkat ettiyseniz send-email.php’ye parametre gönderdik exec() komutu içinde. Gelen parametreleri $argv değişkeninde tutuluyor. 0 indexli olan değer dosyanın adı o yüzden 1’den başlayarak kullanın.

Birden fazla parametre göndermek isterseniz;

exec('php -f send-email.php -- "5" "tayfun erbilen" "deneme" > /dev/null 2>&1 &');

şeklinde gönderebilirsiniz. send-email.php’de $argv[1] $argv[2] $argv[3]şeklinde değerlere ulaşabilirsiniz.

Not: exec() fonksiyonu genelde hostinglerde güvenlikten dolayı kapalı oluyor. Bu yüzden kendi sunucunuzu kullanmaya çalışın, zaten hosting nedir allah aşkına? Boşverin onları 🙂

Kolay gelsin.

PHP’de İfadeleri Karşılaştırmak

Bazen yönetim paneline girişleri veritabanı yerine dosyada tutuyorum. Basit bir if-else kontrolü ile giriş yaptırıyorum. Bu gibi durumlarda, kullanıcı adı ve şifre nasıl yazıldıysa aynen o şekilde yazdırmak gerekiyor. Yani büyük küçük harfe vs. duyarlı oluyor. Bu gibi durumlar için PHP’de karşılaştırma fonksiyonları var. Örneğin 2 ifadenin doğruluğunu karşılaştırıyor. Mesela;

$a = 'Tayfun';
$b = 'Tayfun';
echo strcmp($a, $b); // Çıktı: 0

Eğer sonuç 0 ise, ifadeler birbirine eşit demektir. Ancak bu örneği şöyle değiştirseydik;

$a = 'Tayfun';
$b = 'tayfun';
echo strcmp($a, $b); // Çıktı: -32

Bu durumda ifadeler birbiriyle eşleşmiyor çünkü büyük küçük harf problemi devreye giriyor. Bunu çözmek için ise strcasecmp() fonksiyonunu kullanabiliriz. Aynı örneği birde şöyle yapalım;

$a = 'Tayfun';
$b = 'tayfun';
echo strcasecmp($a, $b); // Çıktı: 0

Sonuç başarılı. Yani bu gibi durumlar için strcasecmp() fonksiyonu kullanılabilir.

strftime() Türkçe Karakter Hatası ve Çözümü [PHP]

PHP’de türkçe tarih belirlerken setlocale() ve strftime() fonksiyonlarını kullanıyoruz. Örnek vermek gerekirse;

setlocale(LC_TIME, 'tr_TR');
echo strftime('%d %B %Y'); // 28 Eyl l 2018

Ancak bu bazı sunucularda türkçe karakter hatalarına yol açıyor. Örneğin yukarıdaki çıktıda olduğu gibi.. Bu gibi durumlarda iki şey yapılabilir.

1. çözüm yolu

setlocale() fonksiyonunda 2. parametrede dil ve ülke kodu verilirken nokta ile karakter seti tanımlaması yapılabilir. Örneğin;

setlocale(LC_TIME, 'tr_TR.UTF-8');

Bu problemi ortadan kaldıracaktır.

2. çözüm yolu

srtftime() fonksiyonu utf8_encode() fonksiyonundan geçirilebilir. Örneğin;

setlocale(LC_TIME, 'tr_TR');
echo utf8_encode(strftime('%d %B %Y')); // 28 Eylül 2018

Bugün benim başıma geldi, çözümü arayıp buldum. Yarın sizinde başınıza gelirse bu şekilde halledebilirsiniz. Kolay gelsin 🙂

Mysql Aynı Tabloda Farklı Koşullara Göre Toplam Kayıt Sayısını Bulmak

Farkındayım başlık çok uzun oldu 😀 Ancak benim işime yaradığı gibi bir gün sizinde işinize yarayabilir. Şimdi örnek vermek gerekirse, yorumlar tablonuz olsun. Yorumların bazıları onaylı, bazıları onaysız olarak kayıt edilmiş. Ve siz toplam yorum sayısını, onaylı yorum sayısını ve onay bekleyen yorum sayısını bir sorguda almak istiyorsunuz. Mantıken nasıl yaparsınız? Ya subquery kullanırsınız ya da bunun yerine SUM() fonksiyonun kullanırsınız. Hemen bir örnek verelim.

Eğer count() fonksiyonunu kullanırsak;

SELECT count(yorum_id) toplam FROM yorumlar;

Sonuç;

+--------+
| toplam |
+--------+
|  2052  |
+--------+

Şimdi SUM() fonksiyonu ile birlikte şöyle bir kullanım yapacağız. Örneğin onay 1 ise onaylı yorumları, 0 ise onaysız yorumları saydıracağız.

SELECT
    count(yorum_id) toplam,
    SUM(onay = 1) onayli_yorumlar,
    SUM(onay = 0) onaysiz_yorumlar
FROM
    yorumlar

Sonuç;

+--------+-----------------+------------------+
| toplam | onayli_yorumlar | onaysiz_yorumlar |
+--------+-----------------+------------------+
|   2052 |               1 |             2051 |
+--------+-----------------+------------------+

Son olarak, eğer birden fazla tabloyu join ile bağladıktan sonra count işlemi yaptığınızda rakamlar saçmalıyorsa DISTINCT ile benzersizleri toplamak gerekir. Ama onun kullanımı biraz daha karışık, şöyle bir kullanım gerektiriyor;

SELECT
    count(yorum_id) toplam,
    REPLACE(SUM(onay = 1) * count(DISTINCT yorum_id) / count(*), '.0000', '') onayli_yorumlar,
    REPLACE(SUM(onay = 0) * count(DISTINCT yorum_id) / count(*), '.0000', '') onaysiz_yorumlar
FROM
    yorumlar
INNER JOIN
    ...

Bu yazım bu kadardı, bir gün böyle birşeye ihtiyaç olursa zaten takıldığınız noktada yorum yazarsınız. Kolay gelsin 🙂

MySQL’de Trigger Kullanımı

Bu makalede sizlerle MySQL’de trigger’ların nasıl kullanıldığını ve amacını konuşacağız. Eğer MySQL’de neden trigger kullanmalıyım sorusuna cevap arıyorsanız kendinize şu soruyu sormanız gerek. Herhangi bir insert, update ya da delete işleminden sonra bir işlem yaptırmak ister miydiniz? Benim anlatacağım senaryoda, posts adında bir tablom olsun. Bu tabloda makalelerimi tutuyorum. Ve makaleyi güncellediğimde, eski versiyonunu revisions tablosuna post id’si ile birlikte kaydetmek istiyorum.

İşte tam olarak bu aşamada bir trigger yazmamız gerek tabi eğer bu işlemi mysql’de çözmek istiyorsak. Yok arkadaş ben PHP’de if ($insert) ise o zaman şuraya $db->query() yazarım diyorsan o senin ameleliğin olur, bir şey diyemem 🙂

Şimdi gelelim bu trigger’ları oluşturmak nasıl oluyor. Temel anlamda bir trigger’ın ihtiyacı olan syntax şudur;

DELIMITER $$
CREATE TRIGGER [trigger_adi] [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON [tablo_adi]
    FOR EACH ROW 
        BEGIN
            -- işlemler
        END$$
DELIMITER ;

Burada DELIMITER $$ ve kısımları, mevcut delimiter’ı $$ ile değiştirmemizi yarıyor. Çünkü defualt olarak ; (noktalı virgül) olduğundan biz trigger içinde herhangi bir noktalı virgül kullanınca kodlar patlıyor. Bu yüzdendir ki bir bütün olarak yorumlanması için delimiter’ı değiştirip $$ yapıyoruz ve END kısmının bitişine noktalı virgül yerine $$ koyuyoruz.

Şimdi gelelim bizim senaryoya. Tablomuz posts tablosuydu ve kolonlarımız id, title ve content olsun. Birde revisions diye bir tablom vardı aynı şekilde id, post_id, title, content, created_at kolonlarına sahip olsun. Şimdi ben posts tablosunda bir veri güncellendiğinde, eski halini revisions tablosuna kaydedecek bir trigger yazmak istiyorum. Nasıl yazarım?

DELIMITER $$
CREATE TRIGGER after_post_update AFTER UPDATE ON posts
    FOR EACH ROW 
        BEGIN
            IF NEW.title != OLD.title OR NEW.content != OLD.content THEN
                INSERT INTO revisions SET post_id = OLD.id, title = OLD.title, content = OLD.content;
            END IF;
        END$$
DELIMITER ;

Burada OLD ve NEW diye anahtarlar gördünüz. Eğer INSERT için trigger yazıyorsak sadece NEWUPDATE için yazıyorsak OLD ve NEWDELETE için yazıyorsak sadece OLD anahtarlarını kullanarak eski ve yeni değerlere ulaşabiliyoruz. Yani trigger’daki OLD.title, update olmadan önceki title değerini, NEW.title update olduktan sonraki title değerini temsil ediyor. Dolayısı ile biz trigger’da şunu yaptık, eğer eski başlık yeni başlıktan farklı ise ya da eski içerik yeni içerikten farklı ise o zaman revisions tablosuna bunu kaydet.

Mevcut trigger’ları görmek isterseniz şu komutu kullanabilirsiniz;

SHOW TRIGGERS;

Oluşturduğunuz trigger’ı kaldırmak için ise;

DROP TRIGGER [trigger_adi]

CSS ile Kayan Label Yapımı vs jQuery Plugini

Bugün gezinirken şöyle bir jquery plugini gördüm;
https://www.jqueryscript.net/demo/jQuery-Floating-Placeholder-Text-Plugin-Placeholder-Label/

Amaç basit, input’un içine bir label yerleştiriyor, tıklayınca animasyonlu olarak onu yukarıya kaydırıyor. Eğer input’a yazı yazılırsa label yukarıda kalmaya devam ediyor ve label’ın texti değiştiriyor. Ve bunun için bir sürü kod yazması gerekmiş eklentiyi yazan arkadaşın.

Bende bu örneği sadece CSS ile nasıl yapacağımı göstermek istedim.

Kısaca şöyle bir HTML yapımız olsun;

<div class="field">
    <input type="text" required autocomplete="off" id="username" value="tayfunerbilen">
    <label for="username" title="Kullanıcı adınızı girin" data-title="Kullanıcı adı">
</div>

Ve CSS kodlarımız;

.field {
    position: relative;
    margin-bottom: 15px;
}

.field label::before {
    content: attr(title);
    position: absolute;
    top: 0;
    left: 15px;
    line-height: 40px;
    font-size: 14px;
    color: #777;
    transition: 300ms all;
}

.field input {
    width: 100%;
    line-height: 40px;
    padding: 0 15px;
    box-sizing: border-box;
    font-size: 14px;
    color: #222;
    border: 1px solid #ccc;
    border-radius: 3px;
}

.field input:focus {
    outline: 0;
    border-color: blue;
}

.field input:valid + label::before {
    line-height: 20px;
    font-size: 12px;
    top: -10px;
    background: #fff;
    padding: 0 6px;
    left: 9px;
    content: attr(data-title);
}

.field input:focus + label::before {
    line-height: 20px;
    font-size: 12px;
    top: -10px;
    background: #fff;
    color: blue;
    padding: 0 6px;
    left: 9px;
}

Daha fazla detay için dersi izlemeniz yeterli

Demo

Node.js, Vue.js, React ve Redux Eğitim Setleri

Merhaba dostlar, yıllar önce prototürk’ü ilk açtığımda eğitmenler arasında sevgili dostum Mehmet Seven’de vardı. O zaman sizlere jQuery dersleriyle eşlik ediyordu ve bir çok kişiye ileri seviye jquery bilgisi kazandırdı. Son yıllarda ise Mehmet, Javascript konusunda uzmanlaştı ve Javascript ile birlikte yeni teknolojileride bilgisine katarak yoluna devam etti.

Çoğu kişi benden Javascript ve framework’leri hakkında eğitim seti istiyor ancak benden çok daha iyi bilgisi olan Mehmet Seven, bu konuda 2 yararlı eğitim seti çıkardı. Bende ilk alanlardanım. Ve setleri javascript ve React, Redux, Node.js’i öğrenmek isteyenlere mutlaka tavsiye ederim.

Node.js’e meraklı olanlar mutlaka aşağıdaki linkten gözatsın;

SIFIRDAN HER YÖNÜYLE JAVASCRİPT & NODE.JS

React ve Redux’a ilgi duyanlar ise şu eğitime gözatsın;

SIFIRDAN HER YÖNÜYLE REACT VE REDUX

Ayrıca kablosuzkedi youtube kanalının sahibi, Codeigniter kitabının yazarı Gökhan Kandemir’in ise, vue.js ile ilgili harika bir eğitim serisi var. Bunuda şiddetle öneririm. Bu tür içeriklerin türkçe olarak kaynaklandırılması çok önemli, öğrenmek isteyenlerede çok büyük bir kolaylık.

SIFIRDAN İLERİ SEVİYE VUE.JS EĞİTİMİ VE UYGULAMA GELİŞTİRME

Hala ingilizceyi bahane mi ediyorsunuz?

İşimizin gereği mutlaka ingilizceyi öğrenmemiz gerekiyor. Eğer hala bir adım atmadıysanız, aşağıdaki eğitim setlerine de bir bakın.

Sıfırdan İleri Seviyeye İngilizce Eğitim Seti (50.5 Saat)

Özel Ders Formatında Sıfırdan Zirveye İngilizce Eğitim Seti (24 saat)

Baştan Sona İngilizce Eğitimi – Sıfırdan Başlayanlar İçin (20.5 Saat)

Udemy’de En Çok Satılan 5 Yabancı PHP Kursu

Merhaba arkadaşlar, bildiğiniz gibi ben Udemy’de eğitmenlik yapıyorum. Ancak aynı zamanda bir öğrenciyimde. Çok fazla eğitim seti satın alıp inceliyorum ve bilgilerimi taze tutmaya çalışıyorum.

Bu yazıda sizlere, benimde satın alıp bakma şansımın olduğu udemy’nin en çok satan 5 php kursunu tanıtmak istiyorum.

PHP FOR BEGİNNERS – BECOME A PHP MASTER – CMS PROJECT

Bu kurs sizlere sıfırdan başlayıp bir PHP ustası olmayı öğretmeyi hedefleyen bir eğitim serisi. Ve dünya çapında en çok satanlar listesinde yer alıyor. Toplamda 36 saat sürüyor.

KURSU İNCELEMEK İÇİN TIKLAYIN

PHP WİTH LARAVEL FOR BEGİNNERS – BECOME A MASTER İN LARAVEL

Bu kurs ile bir php framework’ü olan Laravel’in temellerini öğreneceksiniz. Hiç bilmeyenler için gerçekten açıklayıcı bir eğitim serisi. Ve dünya çapında en çok satanlar listesinde yer alıyor.  Toplamda 31.5 saat sürüyor.

KURSU İNCELEMEK İÇİN TIKLAYIN

PHP OOP: OBJECT ORİENTED PROGRAMMİNG FOR BEGİNNERS + PROJECT

Bu kurs OOP konusuna yeni başlamış kişileri hedefliyor. Eğer sizde ciddi anlamda OOP konusuna merak sarıpta bir şeyler yapmayı başaramadıysanız bu kursun faydasını göreceksiniz. Toplamda 18.5 saat sürüyor.

KURSU İNCELEMEK İÇİN TIKLAYIN

CREATE A SPOTİFY CLONE FROM SCRATCH – JAVASCRİPT, PHP, MYSQL

Bu kurs benim en sevdiğim kurslardan bir tanesi. Spotify’ı bilmeyen yoktur, müzik dinleme uygulaması. Bu kursta PHP, Javascript ve MySQL kullanılarak Spotify benzeri bir sistem geliştiriliyor. Yani proje yaparak PHP öğrenmiş oluyorsunuz. Aynı zamanda javascript ile de bir çok şeyin inceliklerini öğrenebilirsiniz.

KURSU İNCELEMEK İÇİN TIKLAYIN

CREATE A REAL SOCİAL NETWORK LİKE FACEBOOK İN PHP + MYSQL

Bir başka sevdiğim kurs ise, PHP ile Facebook benzeri bir sosyal ağ projesinin oluşturulduğu bu seri. Elbette bu seride sadece PHP değil, MySQL sorgularının derinliklerini, Javascript ipuçlarını da öğrenmiş olacaksınız.

KURSU İNCELEMEK İÇİN TIKLAYIN

ÖNEMLİ NOT!!

Arkadaşlar ingilizce anlatılan eğitim setlerini alıp incelemek ve bir şeyler öğrenmek için ingilizce’yi çok iyi bilmenize gerek yok. Başlangıç düzeyinde bile olsanız, sadece işiniz gereği belli terimlere bile hakim olsanız, yazılan kodlar ortak olduğu için mutlaka anlayıp ders çıkaracağınız konular olacaktır. Ben bu şekilde merak ettiğim konulara daha hızlı ulaşabiliyorum, o yüzden hala ingilizce bilmiyorum diye bahaneleriniz var ise onlar içinde birkaç udemy kursu önereyim, zira bu işi yapacaksınız ingilizce şart! Lütfen artık bahanelerin ardına sığınmayın ve kendiniz için bir şey yapmaya başlayın.

Sıfırdan İleri Seviyeye İngilizce Eğitim Seti (50.5 Saat)

Özel Ders Formatında Sıfırdan Zirveye İngilizce Eğitim Seti (24 saat)

Baştan Sona İngilizce Eğitimi – Sıfırdan Başlayanlar İçin (20.5 Saat)

MySQL’de SOUNDS LIKE ve SOUNDEX

Merhaba arkadaşlar, bu yazımda ve videomda sizlere LIKE dışında kullanabileceğiniz 2 alternatifi göstermek istiyorum. Öncelikle neden ne için kullanmamız gerek onu bir açıklayayım.

Örnek vermek gerekirse sizin bir e-ticaret siteniz olsun. Ve kullanıcı ürün aramak için arama input’une iphone yazıp arattı. Ama oda ne? Bir başka kullanıcı iphone yazmayı beceremedi ve “iphon” ya da “iphom” gibi kelimeler yazdı. Bu durumda sizin şu basit mysql sorgunuz ne döndürecektir sizce?

SELECT * FROM products
WHERE brand LIKE '%iphom%'

Ben söyleyeyim, hiçbir veri bulunamayacak. Eğer kullanıcı “ipho” yazıp bıraksaydı bulunabilirdi ama “iphom” yazınca “iphone” kelimesinden bağımsız bir hal aldı. Ama baktığınızda kulağa hala iphone gibi geliyor değil mi? İşte bu kulağa gelene göre arama yapmak istersek SOUNDS LIKE ve SOUNDEX kullanmamız gerekecek. Şimdi gelelim bu arkadaşlara..

SOUNDS LIKE

Bunu türkçede “.. gibi geliyor” olarak çevirebiliriz. Örnek bir sorgu yapalım.

SELECT * FROM products
WHERE brand SOUNDS LIKE 'iphome'

Bu sorgunun sonucunda iphone markası altında bir ürün var ise gelecektir. Ancak SOUNDS LIKE’ın bir dezavantajı var, eğer kullanıcı “ipho” yazıp aratırsa SOUNDS LIKE çalışmaz çünkü tam olarak kelime kadar yazıp kelimeleri yanlış yazarsanız çalışıyor. Yani mevcut kelimeyi bir şeye benzetemediği için bulamıyor. Bu bağlamda SOUNDS LIKE bize arifeyi gösterdi, ama bayramı göstermedi..

Ama durun! daha bitmedi. Sizin sorununuzu çözecek arkadaş, birkaç yardımcı fonksiyon kullanımıyla SOUNDEX olacak. Ama önce gelin bu SOUNDEX nedir bir anlayalım..

SOUNDEX

SOUNDEX sesin İngilizce telaffuzundan sonra isimleri endekslemek için kullanılan fonetik bir algoritmadır. Yani kelimeleri belli bir algoritmada aramamızı sağlıyor. Şimdi örnek vermek gerekirse;

SELECT SOUNDEX('iphone'), SOUNDEX('iph');

Bu sorguyu çalıştırdığımızda bize I150 ve I100 değerlerin verecek. O zaman “iphone” ifadesinin SOUNDEXdeğeri I150 imiş. Şimdi “iph” kelimesinin ise I100’müş. Aslında burada 0’ları kaldırdığımızda I1 kalıyor. Yani “iphone” kelimesinin I150 SOUNDEX değeriyle başlangıç değerleri aynı. Yani iki ifade birbiriyle uyuşuyor demek oluyor. O zaman sorguyu yazmadan önce mysql’de TRIM fonksiyonunu kullanarak 0 değerini kaldırmayı öğrenelim.

SELECT TRIM(TRAILING '0' FROM 'I100')

Bu sorgu bize sonuç olarak I1 değerini döndürecek. TRAILING ifadesi “sondaki” demektir. Yani sondaki “0” değerlerini kaldırmış olduk. Şimdi bunları toplayıp sorgumuzu yazalım.

SELECT * FROM products
WHERE SOUNDEX(brand) LIKE CONCAT(TRIM(TRAILING '0' FROM SOUNDEX('iphome')), '%');

Not: CONCAT() fonksiyonu 2 ifadeyi birleştirip tek ifade haline getirmek için kullanılıyor.

Sonuç olarak kullanıcınız “iphome” yazdığında iphone markasına ait ürünleri listeleyecek bu sorgumuz. Kullanıcı “iphone”,”ivhone”, “iphane”, “iphano” gibi ifadelerle arama yapsada yine de inatla “iphone” markasına ait ürünler listelenecektir.

MySQL’de JSON Verileriyle Çalışmak

Bu yazımda sizlere mysql’de json olarak depoladığımız veriler üzerinde listelemearamadüzenleme gibi işlemler nasıl yapılır bunlardan bahsetmek istiyorum. Eğer JSON ile uğraşıyorken aklınıza NoSQL veritabanları geliyorsa haklısınız, ancak mysql’de de bir takım işlemler yapabildiğimizi unutmamak lazım 🙂

Öncelikle neden JSON olarak veri depolarız? Ben kendi adıma konuşacak olursam, örneğin seo bilgilerini json formatında tutuyorum. Yani title, description, keywords ama yarın öbürgün ekstra bir bilgi daha ekleyebilirim örneğin noindex, canonical vb. Bunun için sürekli gidip kolon oluşturmak tamamen saçmalık olurdu. Bu yüzden tüm bu değerleri tek bir kolon altında json formatında tutuyorum. Ve yeri geldiğinde bunları filtrelemek, bunlar içinde arama yapmak gerekirse değiştirmek, listelerken ayrı ayrı göstermek isteyebilirim.

İşte bu noktada mysql’de bazı fonksiyonlar bize yardım edecek. Alışılmışın dışında bir sorgu yazıyormuşuz gibi görünsede, aslında ne kadar kolay olduklarını birazdan anlayacaksınız 🙂

JSON Veri Eklemek

Biz aslında PHP tarafında json_encode() fonksiyonu ile dizileri ya da objeleri json haline getirerek ekleyebiliyoruz. Örnek vermek gerekirse;

<?php

$arr = [
    'title' => 'Erbilen.net',
    'description' => 'Tayfun Erbilen\'in Bloğu'
];

echo json_encode($arr);
// Çıktı: {"title": "Erbilen.net", "description": "Tayfun Erbilen'in Bloğu"}

PHP’de json ile ilgili işlemlerin daha fazlası için şu yazıma gözatabilirsiniz. MySQL tarafında elle json veri eklemek istersek;

INSERT INTO tablo_adi
SET kolon_adi = '{"title": "Erbilen.net", "description": "Tayfun Erbilen\'in Bloğu"}'

Gördüğünüz gibi çok ekstra bir şeyi yok. JSON ekleme aynı zamanda şu fonksiyonlar ile de olabilir;

JSON_ARRAY

Bu fonksiyon geriye array döndürecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_ARRAY('tayfun','erbilen');
#    ['tayfun','erbilen']

JSON_OBJECT

Bu fonksiyon geriye obje döndürecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_OBJECT('ad','erbilen','soyad','erbilen');
#    {"ad": "erbilen", "soyad": "erbilen"}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

JSON_MERGE

Bu fonksiyon array ve objeleri birleştirecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_MERGE('{"ad":"tayfun"}','{"soyad":"erbilen"}', '[1,2,3]');
#   [{"ad": "tayfun", "soyad": "erbilen"}, 1, 2, 3]

JSON_TYPE ve JSON_VALID

Bu iki fonksiyon json formatının doğruluğunu kontrol eder. JSON_TYPE’da geriye ARRAY, OBJECT ya da hata mesajı döner. JSON_VALID’de ise format doğru ise 1 değil ise 0 döner. Kullanımı ise;

-- dönen değer ARRAY:
SELECT JSON_TYPE('[5, 7, "erbilen.net"]');

-- dönen değer OBJECT:
SELECT JSON_TYPE('{"ad": "tayfun", "soyad": "erbilen"}');

-- dönen değer hata mesajı:
SELECT JSON_TYPE('{"ad": "tayfun", "soyad": "erbilen"');

-- dönen değer 1:
SELECT JSON_VALID('[5, 7, "erbilen.net"]');

-- dönen değer 1:
SELECT JSON_VALID('{"ad": "tayfun", "soyad": "erbilen"}');

-- dönen değer 0:
SELECT JSON_VALID('{"ad": "tayfun", "soyad": "erbilen"');

JSON içinde Arama

JSON verileri depoladıktan sonra önemli olan onlar içerisinde belli bir düzende arama yapıp onları listelemektir. Bunun için birkaç yararlı fonksiyonu inceleyeceğiz;

JSON_CONTAINS()

Bu fonksiyon ile JSON içerisinde istediğimiz şeyin olup olmadığını kontrol ediyoruz. Örneğin array’de bir değer ya da obje’de bir key value gibi. Hemen örneklendirelim;

# kolon_adi = {"ad":"tayfun","soyad":"erbilen"}
SELECT * FROM tablo_adi
WHERE JSON_CONTAINS(kolon_adi, '{"soyad": "erbilen"}');

Yukarıdaki örnekte kolon_adi kolonunda depolanan json değerler içerisinde soyad objesi olup değeri erbilen’e eşit olanlar listelenecektir.

SELECT * FROM tablo_adi
WHERE JSON_CONTAINS(kolon_adi, '[2]');

Yukarıdaki örnekte ise kolon_adi kolonunda depolanan array içerisinde 2 değeri olanlar listelenecektir.

JSON_SEARCH()

Bu fonksiyon ile JSON olarak depoladığımız değerlerin path’leri bulmanızı sağlıyor. İlk parametresi JSON değeri, ikinci parametresi ise all ya da one olarak belirlenmeli. all derseniz eğer aradığınız değer birden fazla ise hepsini döndürür one derseniz sadece ilkini döndürür. 3. parametre ise aradığınız değer olarak belirlenmeli. Örneğin;

SELECT JSON_SEARCH(kolon_adi, 'all', 'soyad') FROM tablo_adi
# Örnek çıktı:   ["$[0]", "$[1].deneme"]

JSON_EXTRACT()

Bu fonksiyon ile json pathlerini belirleyerek işlem yapabiliyoruz. Örneğin json veri içerisinde soyad’a sahip olanları listelemek istersek;

SELECT * FROM test_tablo
WHERE JSON_EXTRACT(test_kolon, '$.soyad')

Bu örnekte test_kolon içerisinde aşağıdaki gibi bir json saklandığını farz ediyoruz.

{"ad": "tyfn", "soyad": "erbilen"}

Kısaca aşağıdaki JSON verisini baz alırsak;

{
  "a": 1,
  "b": 2,
  "c": [3, 4],
  "d": {
    "e": 5,
    "f": 6
  }
}

O halde JSON_EXTRACT() içerisinde path’leri şu mantıkta kullanabiliriz;

$.a – 1 döndürür
$.c – [3,4] döndürür
$.c[0] – 3 döndürür
$.d.e – 5 döndürür
$**.e – 5 döndürür

Sorgularda JSON Yollarını Almak

JSON Path’leri herhangi bir fonksiyon yardımı olmadan da sorgularda kullanabiliriz. Bunun için tablo_adi->’$.path’ şeklinde bir kullanım söz konusu. Yukarıdaki kullanım şekillerini baz alabilirsiniz.

SELECT kolon_adi->'$.ad' as ad FROM tablo_adi;
# ya da
SELECT * FROM tabo_adi
WHERE kolon_adi->'$.ad' = 'tayfun';

JSON Verilerini Düzenleme

Bu işlem için birkaç fonksiyon var.

JSON_REPLACE()

İlk parametresi json verisi, 2. parametresi path yani yolu, 3. parametresi ise yeni değeri. Daha sonrasında path, value, path, value şeklinde devam ederek kullanılabilir.

UPDATE tablo_adi
SET kolon_adi = JSON_REPLACE(kolon_adi, '$.uye.ad', 'Tayfun')

JSON_SET()

JSON_REPLACE ile aynıdır. Kullanımlarıda aynı şekildedir.

JSON_INSERT()

JSON verisine yeni değerler eklemek için kullanılıyor. Örneğin;

UPDATE tablo_adi
SET kolon_adi = JSON_INSERT(kolon_adi, '$.adsoyad', 'Tayfun Erbilen')
WHERE id = 2

JSON_REMOVE()

JSON verisinden değer silmek için kullanılıyor. Örneğin;

UPDATE tablo_adi
SET kolon_adi = JSON_REMOVE(kolon_adi, '$.adsoyad')
WHERE id = 2

Bu makalemizde buraya kadardı 🙂

Eğer daha fazla merak ettiyseniz mysql’in kendi döküman sayfasından devamını inceleyebilirsiniz.

Bkz: https://dev.mysql.com/doc/refman/en/json-functions.html