PHP ile Kısa If Else Kullanımı

En basitinden bir değişkenin, fonksiyonun vs. TRUE ya da FALSE döndürüp döndürmediğini öğrenmek için uzunca bir if, else ifadesi kullanmamıza gerek yok. Kullandığım bir iki yöntem şöyle:

<?php
$deger = 'Herhangi';
echo $deger == 'Herhangi' ? 'Değer doğru' : 'Doğru değil';

ya da

<?php
function dene($deger = null) {
    return is_null($deger) ? 'Değer gelmedi' : 'Değer geldi';
}

ya da

<?php
function dene($deger = null) {
    if ($deger === null) return true;
    return false;
}

gibi gibi.

RedBeanPHP ile Etiket Sistemi

RedBeanPHP ile herhangi bir tablo için etiket sistemi yapmak istersek, ORM’nin içinde gelen birkaç özellikle beraber yapabiliyoruz. Örneğin, bir blog için gönderi tablomuz olsun. Gönderi tablosunda her gönderi için birden fazla etiket tanımlamak isteyelim. Şöyle örnekleyeyim;

<?php
$post = R::load("post", 5); // 5 numaralı gönderiyi seçiyorum
R::tag($post, ["etiket 1", "etiket 2", "etiket 3"]); // Gönderiye etiketleri tanımlıyorum

Çok basit birkaç işlem göründüğü üzere. Peki bu kodlar ne yapıyor? Veritabanında tag ve post_tag olmak üzere iki tane tablo oluşturuyor. tag tablosuna id, title olmak üzere iki tane sütun, post_tag tablosuna ise id, post_id, tag_id olmak üzere üç tane sütun oluşturuyor ve post tablosu ile ilişkilendiriyor. Bu ilişkilendirmeye Many to Many İlişki Tipi yazısında bahsetmiştim.

Bir gönderiye ait etiketleri listelemek istersek, aşağıdaki kodları yazıyoruz;

<?php
$post = R::load("post", 5); // 5 ID'li gönderiyi seçelim
$etiketler = R::tags($post); // Etiket listesini değişkene atıyorum
foreach ($etiketler as $etiket) { // Ve listeliyorum
    echo $etiket . ",";
}

Daha detaylı kullanımına ve diğer özelliklere şuradaki sayfadan göz atabilirsiniz.

JQuery ile Arama Motoru Dostu URL (SEF)

Arama motoru dostu bağlantılar, WordPress gibi birçok içerik yönetim sisteminde kullanılır. Ben de yazdığım bir betikte kullanma ihtiyacı duydum. Bir gönderinin başlığını arama motoru dostu bağlantı haline getirmesi için bir jQuery eklentisi buldum. Adı jQuery FriendURL. Dimitar Ivanov adlı bir arkadaş yazmış. Kullanımından kısaca bahsedelim.

<script src="js/jquery.friendurl.min.js"></script>
<p>
    <input type="text" id="baslik" placeholder="Başlığı yazınız" /><br />
    <input type="text"id="sef" placeholder="Arama motoru dostu bağlantı" />
</p>

<script type="text/javascript">
$(function(){
    $("#baslik").friendurl({id : "sef"});
});
</script>

Kodu çalıştırdığımız vakit, baslik ID’li girdi elementine yazılan herhangi bir içerik, sef ID’li girdi elementine otomatikmen arama motoru dostu bağlantı olarak düşecektir. Örneğin “Merhaba, bu bir denemedir” yazdığımızda SEF değeri “merhaba-bu-bir-denemedir” olarak eş zamanlı güncellenecek. Fakat “Merhaba, bu türkçe karakter denemesidir” yazdığımızda şöyle bir sıkıntı ortaya çıkacak: “merhaba-bu-trke-karakter-denemesidir“. Türkçe karakterler gözükecek. Buna çözüm için aşağıdaki gibi kullanmamız gerekecek:

<script type="text/javascript">
$(function(){
    $("#baslik").friendurl({id : "sef", divider: "_", transliterate: true});
});
</script>

Burada divider özelliği ile ayırıcıyı _ (alt tire) olarak belirliyoruz ve transliterate özelliğine true değeri vererek aksi karakterleri çevirmesini sağlıyoruz.

Şimdi “Merhaba, bu bir türkçe karakter denemesidir! ÜĞİŞÇÖüğişçö” yazdığımızda bize vereceği sonuç “merhaba_bu_bir_turkce_karakter_denemesidir_ugiscougisco” değeri olacak.

Buradan da test edebilirsiniz. Haydi kolay gelsin.

Slim Framework Rota İşlemleri

Uzun zamandır Slim Framework ile haşır neşirim. Birkaç bir şey yazmak gerekiyor hakkında. Route yani rotalama işlemlerinden bahsedeceğim.

Bazı HTTP istek metotları var, en çok kullandıklarımdan ikisinden bahsedeceğim.

GET Rotası

Aşağıdaki örnekte, normal bir internet sayfasına girişte çalışan metot çalıştırılıyor. Örneğin, kitapçı sitesine giren kullanıcı kitapci.com/kitap/5 adresine girdiğinde, 5 numaralı ID’yi elde etmiş oluyoruz ve sayfaya “5 numaralı kitap ile ilgili işlemler yapılacak” yazdırıyoruz.

<?php
$app = new \Slim\Slim();
$app->get("/kitap/:id", function ($id) use ($app) {
    echo "{$id} numaralı kitap ile ilgili işlemler yapılacak";
});

POST Rotası

Veritabanına yeni bir kitap eklemek istiyoruz ve bir form oluşturup /kitap_ekle sayfasına POST etmek yani göndermek istiyoruz. Bunun için POST rotasını aşağıdaki gibi ayarlıyor ve akabinde gelen değerleri ekrana print_r fonksiyonu yardımıyla yazdırıyoruz. Ayarladığımız bu sayfaya form dışında kitapci.com/kitap_ekle şeklinde girmek istedimizde 404 döndürecektir.

<?php
$app = new \Slim\Slim();
$app->post("/kitap_ekle", function () {
    echo "<pre>";
    print_r($_POST);
    echo "</pre>";
});

Birden fazla istek metodu tanımlama

Bir rotaya hem GET hem de POST istek metotları ile erişmek isteyebiliriz. Bunun için aşağıda göründüğü üzere Slim Framework’ün via() metodunu kullanıyoruz.

<?php
$app = new \Slim\Slim();
$app->map("/kitap", function() {
    echo "<p>Hem GET hem de POST istek metotları ile erişilebilen bir sayfa!";
})->via("GET", "POST");
$app->run();

Rota isimlendirme

İstersek rotaları isimlendirebiliyoruz. Rotaları isimlendirmemizdeki amaç, çatı içinde kullanabileceğimiz yönledirme işlemlerini kısaca halledebilmek. Daha sonrasında urlFor() metodu ile bağlantıyı oluşturuyoruz. Şöyle:

<?php
$app = new \Slim\Slim();

// İsimlendirilmiş rota oluşturalım
$app->get("/kitap/:adi", function ($adi) use ($app) {
echo "Kitap adı: {$adi}";
})->name("kitap");

// İsimlendirilmiş rota için bir URL oluşturalım
$url = $app->urlFor("kitap", array("adi" => "Gelecekteki İlkel"));

İyi çalışmalar.

RedBeanPHP CRUD (Ekleme, Okuma, Güncelleme, Silme) İşlemleri

Slim Framework ve Veritabanı İşlemleri yazısında RedBeanPHP’den bahsetmiştik. Bu sefer CRUD işlemleri nasıl bir basitlikle yapılıyor, ondan bahsedeceğim.

Evvela veritabanı bağlantısını yapıyoruz:

require "rb.php";
R::setup('mysql:host=localhost;dbname=veritabaniadi', 'kullaniciadi','sifre');

Veri Ekleme (Create)

Kitaplar hakkında bir tablomuzun olduğunu varsayıyorum:

$kitap = R::dispense("kitap"); // Tabloyu 'kitap' olarak seçtik
$kitap->baslik = "Gelecekteki İlkel"; // Sütun adını belirleyip değer atadık
$kitap->yazar = "John Zerzan";
$kitap->fiyat = 25.00;

$id = R::store($kitap); // Store ile ekleyip last_insert_id'sini alıyoruz

Veri Okuma (Read)

$kitap = R::load("kitap", 5); // ID'si 5 olan kitabı seçtik
echo $kitap->baslik; // Kitaba ait başlığı yazdırdık.

Veri Güncelleme (Update)

$kitap = R::load("kitap", 5); // ID'si 5 olan kitabı seçtik
$kitap->baslik = "Yeni kitap başlığı"; // Yeni değerler atıyoruz
$kitap->yazar = "Yeni kitap yazarı"; 
$kitap->fiyat = 20.00;
R::store($kitap); // Değerleri veritabanına yazıyoruz

Veri Silme (Delete)

$kitap = R::load("kitap", 5);
R::trash($kitap); // ID'si 5 olan kitabı siliyoruz

Olan biten bu şekilde. Açıklamaları satırlarda yaptım, yapmasam bile anlaşılabilir zaten. Az kod yazarak çok işlem yapılabiliyor. Görüşmek üzere.

Many to Many İlişki Tipi

Veritabanında birden fazla veriyi birden fazla veriye ilişkilendirmek için Many To Many Relationship diye bir yöntem var. Türkçe manası da herhale Çoktan çoğa ilişki tipidir. Bu yönteme bir blog sisteminde ihtiyaç duydum. Bir blog gönderisine bir kategori tanımlamak daha önceden yaptığım bir işti. Ama Bir gönderiye birden fazla kategori tanımlamak istediğimde bu tarz bi yönteme başvurmak gerektiğini öğrendim.

Bir gonderi tablomuz olsun, içerisinde id, baslik, govde alanları olduğunu varsayalım. Bir de kategori tablomuz olsun, içindeki alanlarsa id, adi, aciklama olsun.

Bu noktada her şey tamam. Şimdi yapmamız gereken bu iki tablodaki verileri ilişkilendirmek olacak. Önceden gönderiyi bir kategoriyle ilişkilendirmek için gönderi tablosunda kategori_id adlı bir alan oluşturup gönderinin ait olduğu kategorinin ID’sini eklerdik. Ama birden fazla kategori tanımlamak istenildiğinde bu durum yapılamıyordu. Şimdi, bu durumun üstesinden gelebilmek için hangi gönderi ve kategorilerin hangisiyle ilişkili olduğunu tutabileceğimiz bir tablo oluşturacağız. Tablonun adı gonderi_kategori olsun. İçerisindeki alanlar ise id, gonderi_id, kategori_id olsun. Görsel olarak şöyle:

Gönderi Kategori İlişki

1 numaralı gönderi, 2 ve 3 numaralı kategoriyle ilişkilendirildiğinde, gonderi_kategori tablosuna iki satır eklenir. Yani şöyle:

id gonderi_id kategori_id
1 1 2
2 1 3

Daha sonra uygulamalı bir örnekte görüşmek üzere diyelim.

Slim Framework ve Veritabanı İşlemleri

Bilenler bilir, Slim Framework adlı bir PHP mikro framework (çatı) var. Slim’i detaylandırmadan veritabanı işlemlerini nasıl gerçekleştirdiğimden bahsedeceğim.

Veritabanı işlemlerini yapmak için RedBeanPHP adlı bir ORM (İlişkisel Nesne Eşleştiricisi diye türkçeleştirilebilir) kullanıyorum. İndirmek için composer vb. bir araç kullanmayacağım. Slim’i indirip, aynı klasörün içerisine RedBeanPHP dosyasını atacağım. Hepsini yaptığımızı varsayarak basit bir giriş yapıyorum:

<?php
require "Slim/Slim.php";
require "Slim/rb.php"; // RedBeanPHP dosyasını dahil ediyorum

\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
$app->get("/listele", function () use ($app) { // "listele" rotasını belirliyorum
    $gonderiler = R::findAll("gonderilertablosu"); // Bütün gönderileri findAll ile çekiyorum
    foreach ($gonderiler as $gonderi) { // Sonra listeliyorum
        echo "<h1>{$gonderi->baslik}</h1>";
    }
});
$app->run();

Her şey oldukça basit göründüğü üzere. Daha fazla veritabanı işlemi için RedBeanPHP sitesine bakabilirsiniz.

CentOS’da Composer Yükleme Hatası

Laravel kurulumu yapmak için CentOS’a Composer kurmam gerekiyordu. Composer kurulumu için komutu yazdığımda “The suhosin.executor.include.whitelist setting is incorrect.” gibi bir hata verdi.

Çözüm için php.ini dosyasına bir satır ekledim. Sırayla nasıl yaptığımı anlatayım.

Nano ile php.ini dosyasını açtım:

nano /etc/php.ini

Açtığım dosyanın en altındaki “; END;” satırından öncesine aşağıdaki kodu yazdım:

suhosin.executor.include.whitelist = phar

CTRL + X deyip belgeyi kapattım ve kaydettim. Daha sonra Apache’yi de yeniden başlatırsak tamam olacak:

sbin/service httpd restart

Sonrasında Composer’ı kurabiliriz:

curl  -k -sS https://getcomposer.org/installer | php

Kolay gelsin.