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;
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;
Bu yazımda sizlere mysql’de json olarak depoladığımız veriler üzerinde listeleme, arama, dü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;
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;
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.
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.
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.
Şu yazımda php ile nasıl excel dosyası oluşturulacağını göstermiştim. Bu yazımda ise, daha elzem bir konuya değineceğiz. Geçenlerde bir excel dosyasının içinden verileri almam gerekti, araştırırken baktım ki çok kalabalık kodlar var, benim amacım alt tarafı satır satır okuyup verileri almak o kadar. Sonra bir repo’ya denk geldim, Sergey Shuchkin abimiz bir sınıf yazmış bu işlemler için. Basit, kullanışlı, amaca hitap ediyor.
En çok bankacılık sistemlerinde kullanılan bir olay bu. Örneğin bir hesaptan diğerine para aktarımında aslında 2 sorgumuz var. Önce mevcut hesaptan bakiye düşüyoruz, daha sonra diğer hesabın bakiyesine ekliyoruz. Ancak ya mevcut hesaptan bakiyeyi düştükten sonra diğer hesaba bakiye eklerken anlık bir sorun olursa ne olur? O zaman mevcut hesaptan para çıkar ama diğer hesaba para gelmez, işler karışır.
İşte bunu önlemek için sorguları transaction ile yaparsak, yani bir işlem bloğu içerisinde yaparsak sorun kalmayacaktır.
Transaction’ı PDO’da başlatmak için beginTransaction() metodu kullanılır;
Şimdi transaction içerisinde bu işlemleri yaptığımızda, eğer her 2 sorguda başarı ile sonuçlandıysa, o zaman commit() metodunu kullanarak işlemi tamamlayacağız. Eğer bir sorun olur ise rollBack() metodu ile yaptığımız işlemleri geri alabileceğiz.
if ($sonuc1 && $sonuc2){
$db->commit(); // işlemi tamamla
} else {
$db->rollBack(); // işlemi geri al
}
Siz transaction içindeki sorgularınız commit etmediğiniz sürece, sadece mevcut bağlantınızda veritabanı değişikliğini görürsünüz. Örneğin commite etmeden önce veritabanınızı kontrol ettiğinizde, sorguları çalıştırmış olmanıza rağmen değişikliği göremeyeceksiniz. Ne zaman ki commit metodunu çalıştırıp işlemi tamamlarsınız, o zaman bütün bağlantılarda bu işlem geçerli olacaktır.
Böylece olası durumlarda, kayıpları önlemek için harika bir yolu keşfetmiş oluyoruz.
Not: Eğer bu işlemi PDO’nun metodları ile değilde, mysql ile yapmak isterseniz. O zaman bir şeye dikkat çekmem gerek. Aynı işlemi PDO’nun transaction metodlarını kullanmadan yapalım.
$db->query('BEGIN TRANSACTION');
$sorgu1 = $db->prepare('UPDATE accounts SET balance = balance - :amount WHERE account_id = :id');
$sonuc1 = $sorgu1->execute([
'amount' => 250,
'id' => 1
]);
$sorgu2 = $db->prepare('UPDATE accounts SET balance = balance + :amount WHERE account_id = :id');
$sonuc2 = $sorgu1->execute([
'amount' => 250,
'id' => 2
]);
if ($sonuc1 && $sonuc2){
$db->query('COMMIT'); // işlemi tamamla
} else {
$db->query('ROLLBACK'); // işlemi geri al
}
Burada 2 işlemden birisi başarısız olsa bile otomatik commit ettiği için diğer tüm bağlantılarda da görünecek. Bunun önüne geçmek için, AUTOCOMMIT değerini 0 yapmamız gerekiyor. Yani kodların en başına bir de şunu eklediğimizde;
$db->query('SET AUTOCOMMIT = 0');
Artık işlem sorunsuz şekilde çalışacaktır. Ancak bunun yerine PDO’nun metodlarını kullanmak tabi ki daha yararlı ????
Başka bir anlatımda görüşmek üzere, detaylı anlatım için videoma gözatabilirsiniz.
Merhaba arkadaşlar, bu makalede sizlere PHP’de diziler’de sıkça kullanılan dizi fonksiyonlarından bahsetmek istiyorum. Mümkün olduğunca örneklerle ve fonksiyonların eksik kaldığı yerlerde kendimce çözümlerle sizlere bu dizi mevzusunu aktaracağım. Şimdiden iyi okumalar ????
Merhaba arkadaşlar, bu dersimde sizlere nasıl özel bileşen (widget) oluşturulur bunu göstermek istiyorum.
Öncelikle WP_Widgets sınıfını genişleterek widget için bir class oluşturacağız.
class facebookLikeBox extends WP_Widget {
public function __construct()
{
}
// Yönetim panelindeki görülecek alanı burada hazırlayacağız
public function form($instance)
{
}
// Girilen değerleri burada kaydedeceğiz
public function update($new_instance, $old_instance)
{
}
// Tema alanında gözükecekleri buraya ekleyeceğiz
public function widget($args, $instance)
{
}
}
__construct() Metodu Bu metod, sınıf oluşturulduğunda çağırılacak ilk metoddur. Bu yüzden biz bu alanda üst sınıfın constuct metoduna bazı bilgiler göndereceğiz.
public function __construct()
{
parent::__construct('widget_fblikebox', 'Facebook Likebox', [
'classname' => 'Facebook Likebox',
'description' => 'Facebook likebox oluşturmanızı sağlar'
]);
}
İlk parametrem ID, 2. parametrem başlık, 3. parametrem dizi olarak bir takım değerler göndermekti.form() Metodu Bu kısımda yöneti panelinde bileşeni sürükleyip bırakınca gelecek olan form alanını hazırlayacağız.
Burada get_field_id() ve get_field_name() metodları extend ettiğimiz sınıftan gelmektedir.update() Metodu Bu kısımda form’dan gelen verileri kaydedeceğiz.
public function update($new_instance, $old_instance)
{
$old_instance['fb_url'] = $new_instance['fb_url'];
$old_instance['fblikebox_title'] = $new_instance['fblikebox_title'];
return $old_instance;
}
widget() Metodu Bu kısımda ise temada gözükmesini istediğimiz şeyleri ekleyeceğiz.
Bugünkü WordPress dersimizde yorum bölümünde özel alanlar nasıl eklenir, yorumlarda bunlar nasıl gösterilir ve admin panelinde bu özel alanlar nasıl gösterilip düzenlenir bunları göstermeye çalıştım. İyi seyirler ????
esc_attr() WordPress’in önceden tanımlı güvenlik için kullanılan fonksiyonudur.get_the_author_meta() Özel alanların değerlerini almamız için kullanılan fonksiyondur. İlk parametre özel alanın ismi, ikinci parametre ise varsa üye id’sidir.
Özel alanların güncellenmesi
Bunun içinde bir fonksiyon yazmalı ve özel alanlarımızı güncellemeliyiz.
current_user_can() Mevcut kullanıcı için izin kontrolü yapan fonksiyondur. Burada edit_user yani bilgilerini düzenleme izninin olup olmadığını kontrol ettik.
Tema içerisinde kullanımı
Bunun için tema klasörümde author-bio.php dosyamı açıyorum. Ve uygun bir kısma, göstermek istediğim özel alanı şu şekilde yazıyorum;
<?php echo get_the_author_meta('facebook');
Burada facebook yerine siz kendi özel alan isminizi yazacaksınız. Benim örneğimde bu facebook, twitter ya da instagram olabilirdi ????