MacOS Üzerinde PostgreSQL Kurulumu

Ruby On Rails ile geliştirmeler yapma amacıyla PostgreSQL veritabanına ihtiyaç duydum. MySQL hali hazırda vardı ama PHP alışkanlıklarımı bir kenara koyup daha fazla olumlu yanı olan PostgreSQL deneyimlemek istedim. MacOS üzerinde iki yöntem var; birincisi Postgres.app uygulaması. Kurulumu oldukça basit; internet sitesinde detayları mevcut. Tıkla, yükle, kullan. Ama ben Homebrew paket yöneticisi aracılığıyla kurulum yapmayı tercih edeceğim.

Evvela mevcut paketlerin güncellemesini yapalım

brew update && brew upgrade

PostgreSQL veritabanını yükleyelim

brew install postgres

Kurulum tamamlandıktan sonra yine Homebrew aracılığıyla Postgres’i kontrol edebiliyoruz.

brew services start postgresql # başlatır
brew services stop postgresql # durdurur
brew services restart postgresql # yeniden başlatır

Eğer başarısız olduysa Homebrew services kurulu değildir, şöyle kuralım:

brew tap homebrew/services 

Tüm servisleri görebilmek için

brew services list

Kolay gelsin.

Rails İle MAMP’in MySQL’ini Kullanmak

Merhabalar,

Ruby On Rails ile MySQL veritabanıyla geliştirme yapmadan evvel mysql2 gemine ihtiyaç duyuluyor. gem install mysql2 ile yüklemek istediğimde sistemde MySQL’in yüklü olmadığını söylüyordu. Brew ile ayrı bir MySQL daha kurmak işime gelmiyordu çünkü hali hazırdaki MAMP içerisindeki MySQL’i kullanıyordum. Bu sebepten mysql2 paketini yükleyebilmem için mysql_config‘i işaret etmem gerekiyordu. Şöyle hallettim:

gem install mysql2 -v '0.4.5' -- --with-mysql-config=/Applications/MAMP/Library/bin/mysql_config

Tırnak içindeki sürüm değişebilir. Kolay gelsin.

MVC ile Basit Bir Blog Uygulaması

Daha önceden ufak bir yazı dizisiyle Yeni Başlayanlar için PHP’de MVC başlığında ufak örnekler vermiştik. Bu yazdığımız MVC mimarisini birde blog uygulaması yazılmış halde paylaşmak istedim ve bir blog uygulaması yazdım.

Bu blog uygulamasında yönetim paneli ve ziyaretçi arayüzü mevcut. Detaylara Github deposundan bakabilir ve dosyaları indirebilirsiniz.

Basit PDO Sınıfı ile Veritabanı İşlemlerini Kolaylaştırmak

Neden böyle bir şeye ihtiyaç var diye düşünebilirsiniz belki. Ama acemi ve yeni öğrenen arkadaşlar için böyle bir şey paylaşmak gerekiyor. PDO çok fazla kafa karıştıracak bir şey değil aslında ama öğrenme sürecinde sıkıntı çıkarabiliyor. Özellikle de mysql_connect() fonksiyonundan geçişlerde sancılı olabiliyor. Aşağıda yazdığım sınıf oldukça basit bir kullanıma sahip.

<?php
/**
 * Basit bir veritabanı sınıfı
 * Sorguları çalıştırır
 * PDO ile fetch, fetchAll, fetchColumn ... gibi metodlar
 * zincirleme çalıştırılabilir ve kullanılabilir.
 * 
 * @link http://demirphp.com
 * @author Yılmaz Demir <demiriy@gmail.com>
 */
class BasitPDO
{
   /**
    * PDO sınıfını tutar
    * @var void
    */
   public static $pdo;
   /**
    * PDO bağlantısını kurar
    * @param void $pdo
    */
   public function __construct(\PDO $pdo)
   {
      self::$pdo = $pdo;
   }
   /**
    * Sorgu çalıştırır
    * @param string $query
    * @return void
    */
   public static function query($query)
   {
      if (!self::$pdo instanceof \PDO) {
         throw new \Exception('PDO bağlantısı yapılmamış');
      }
      $stmt = self::$pdo->prepare($query);
      $args = array_slice(func_get_args(), 1);
      if (isset($args[0]) && is_array($args[0])) {
         $stmt->execute($args[0]);
      } else {
         $stmt->execute($args);
      }
      return $stmt;
   }
}

Yukarıdaki dosyayı kaydedelim. Öncelikle veritabanı ayarını yapalım.

Connection.php


$pdo = new \PDO('mysql:host=localhost;dbname=database;charset=utf8', 'kullaniciadi', 'sifre');
$basit_pdo = new BasitPDO($pdo);

Ne yapmak istiyorsunuz? Veritabanından bir tek gönderi mi birden fazla gönderi mi çekmek istiyorsunuz? Bütün haberleri çekelim:

Haberler.php

require 'Connection.php';
$haberler = BasitPDO::query('SELECT * FROM haberler WHERE onaylanmis=?', 'evet')->fetchAll();
 
foreach ($haberler as $key => $haber) {
   echo $haber['baslik'] . '
';
}

Haber.php?id=5

require 'Connection.php';
$id = $_GET['id'];
$haber = BasitPDO::query('SELECT * FROM haberler WHERE id=?', $id)->fetch();
echo $haber['baslik'];

HaberSayisi.php

require 'Connection.php';
$haberSayisi = BasitPDO::query('SELECT * FROM haberler')->rowCount();
// ya da
$haberSayisi = BasitPDO::query('SELECT COUNT(id) FROM haberler')->fetchColumn();
echo $haberSayisi;

Ekleme/Düzenleme/Silme

require 'Connection.php';
$ekle = BasitPDO::query('INSERT INTO haberler (baslik, icerik) VALUES (:baslik, :icerik)', [':baslik' => 'Başlık', ':icerik' => 'İçerik']);
$duzenle BasitPDO::query('UPDATE haberler SET baslik=:baslik WHERE id=:id', [':baslik' => 'Yeni Başlık', ':id' => $_GET['id']]);
$sil = BasitPDO::query('DELETE FROM haberler WHERE id=?', $_GET['id']);

PHP için Kullanışlı Veritabanı Sınıfı

Yazdığım uygulamalarda en çok ihtiyaç duyduğum ve kullandığım şey veritabanı işlemleri yapmak olduğu için bir sınıf yazmaya giriştim. Daha öncesinde ufak tefek girişimlerim olmuştu ve tecrübe edinmiştim. Ama işi en basite indirgemeye ve kullanılabilirliğini arttırabilmeye çalıştım. Şimdi paylaşacağım veritabanı sınıfı benim işimi oldukça kolaylaştırıyor.

DemirPHP Veritabanı Sınıfı

Bu veritabanı sınıfı sayesinde yazdığımız SQL ifadelerini, zincirleme metodlarla oluşturuyoruz. İstersek sorguyu elde ediyor, istersek PDO veri döndürüyoruz. Paketin GitHub kaynağına buradan ulaşabilirsiniz.

Basit bir kullanım örneği:


$db = new Database(new PDO('mysql:host=localhost;dbname=cms', 'root', 'root'));
$db->select()
 ->from('tablo')
 ->join('digerTablo', 'alan1', '=', 'alan2')
 ->where('taslak', '=', 0)
 ->andWhere('id', '=', ':id')
 ->bindParam([':id' => 15])
 ->fetch();

Daha fazla detay, bilgi ve dökümantasyona buradan ulaşabilirsiniz. Soru işaretleri hakkında bana ulaşabilirseniz yardımcı olabilirim. İyi çalışmalar.

PDO’nun En Kolay Hali

Genelde, mysql fonksiyonundan PDO’ya geçişte biraz zorlanılır. Bu yazıda, PHP ile veri çekerken ve eklerken en çok kullandığımız yöntemlerin PDO karşılığını yazacağım.

PDO ile MySQL Veritabanına Bağlanmak

$pdo = new PDO('mysql:host=localhost;dbname=veritabani;charset=utf8', 'kullaniciAdi', 'sifre');

Bu satır, mysql_connect() satırıyla aynı işi hatta daha fazlasını yapar. Hem belirttiğimiz veritabanına bağlanır hem de karakter setini belirler. Böylece türkçe karakter sıkıntısı yaşamayız.

PDO ile Veri Listelemek

$sorgu = $pdo->query('SELECT * FROM tablo');
$ogeler = $sorgu->fetchAll();

foreach ($ogeler as $oge) {
	echo $oge['baslik'] . '<br>';
}

Burada, query() ile sorguyu yazdık ve fetchAll() metodu ile verileri birden fazla yani hepsini çekecek biçimde aldık. Daha sonra foreach() ile sayfaya yazdırdık.

PDO ile Veri Çekmek

PHP’de PDO ile veri çekerken veya listelerken iki yöntemimiz var. Bunlardan birincisi query() metodu diğeriyse önce prepare() yani hazırlama metodu sonrasında execute() yani çalıştır metodu. İlk metodun örneğini veri listelemek bölümünde yaptık, şimdi tekil veri çekerken, ikinci yöntemi yani prepare() metodunu kullanacağız.

$id = $_GET['id'];
$sorgu = $pdo->prepare('SELECT * FROM table WHERE id=?');
$calistir = $sorgu->execute(array($id));
$oge = $calistir->fetch();
echo $oge['baslik'];

Neden ilkinden farkı bir yöntem kullandık?

Çünkü, veritabanı ile bilgi alışverişi yaparken güvenliğe önem vermemiz gerekiyor. Son örnekte, kullanıcıdan gelen bilgiye göre ($id = $_GET['id'] satırına dikkat) bilgi çekiyoruz. Önceleri, yani PDO’dan evvel değişkeni sorgu içine ekleyip de veriler çekiliyordu. Ama SQL Injection dediğimiz açıkları da beraberinde getiriyordu. Biz, bu örnekte önce sorguyu hazırladık, şart yerine ? işareti koyduk ve soru işareti gelen yere $sorgu->execute(array($id)); kısmında göründüğü üzere gelecek verinin $id değişkeni olduğunu söyledik.

Bunun gibi ve bundan farklı birçok örnek mevcut ve kullanıma açık. Mesele mantığı kavramak. Ama en basit hali bu hali. Kolay gelsin. Bir dahaki yazıda, PDO ile veri ekleme, silme ve güncelleme konularına değineceğim.

Esen kalın.

Deprecated: mysql_connect() Hatası Üzerine

PHP’ye yeni başlayanlar, öğrenmek için çaba harcayanlar muhtemelen bu hatayla karşılaşacaklardır. Kafa karıştırmadan hatanın çözümünü söyleyelim…

Hata tam olarak şöyle:

 Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /dosya/yolu/bilmemne.php on line 1

Bu hatayı alıyorsanız, çok eski ve artık desteklenmeyen bir yöntem kullanıyorsunuz demektir. Hatanın türkçesi:

Kullanımı önerilmiyor: mysql_connect(): msyql uzantısının kullanımı önerilmiyor ve yakın gelecekte bu fonksiyon kaldırılacak. mysqli veya PDO kullanın

Peki neden artık bu fonksiyon desteklenmiyor? Çünkü, bu fonksiyon kullanışlı ve yönetilebilir bir fonksiyon değil. Bunun yerine mysqli ve PDO kullanmak gerekiyor.

mysqli nedir?

Bu da tıpkı mysql fonksiyonları gibi bir fonksiyondur ve PHP’nin mysql fonksiyonlarına alternatifidir, eğer illa ki fonksiyonlarla veri çekeceğim diyorsanız bunu kullanın ama bana kalırsa PDO kullanmanızı öneririm.

PDO nedir?

PDO, PHP’nin bir uzantısıdır. PHP Data Objeleri diye anlayabiliriz. Neden öneriyorum, çünkü bu yöntem daha bir nesne yönelimli ve öğrenince daha da kolayınıza gelecektir. Yakın zamanda PDO hakkında bir şeyler yazmak istiyorum, bakalım.

Sonuç olarak, artık bu fonksiyonu kullanmamanızı öneriyorum.

SQL’de Sonraki ve Önceki Satırdaki Veriyi Getirmek

Bir gönderi/blog sistemi düşünelim. Hatta WordPress’ten örnekleyebiliriz. Bazı bloglarda, bir gönderiye girdiğimizde sonraki ve önceki gönderiler için bağlantı olduğunu görürüz. Bunlar için ayrı veriler çekmemiz gerekiyor. Örnek verirken bir model dosyasında kod yazıyormuş gibi örnekleyeceğim, SQL kodundan yola çıkarak sizde geliştirebilirsiniz.

SQL’de Gün İçindeki/Bugüne Ait Kayıtları Listelemek

SQL’de gün içindeki kayıtları listelemek için şöyle bir sorgu gerekiyor:

SELECT * FROM kayitlar WHERE DATE(tarih) = CURDATE()

Bu sorgu, o gün içindeki kayıtları listeliyor. Yani bugün ayın 5’i ise, 5’inde girilen kayıtları gösteriyor.

Bir diğer kullanım ise, son bir günlük kayıtları göstermek. Sorguyu inceleyelim:

SELECT * FROM kayitlar WHERE tarih > DATE_SUB(CURDATE(), INTERVAL 1 DAY)

Bu sorguda son bir gün, yani 24 saatlik kayıtları listeliyor. 1 DAY yazan yeri 1 WEEK yaparak bir haftalık kayıtları, 1 MONTH yazarak son bir aylık kayıtları alabiliyoruz.

Veritabanındaki Tablonun Varlığını Kontrol Etmek

PHP’de PDO ile çalışırken bir tablonun var olup olmadığını kontrol etmek için aşağıdaki yöntem kullanılabilir:

public function checkTable()
{
  try {
    return $this->fetchRow('SELECT * FROM posta');
  } catch(\Exception $e) {
    return false;
    // Veya $this->exec('CREATE TABLE IF NOT EXISTS posta ...');
  }
}

Bir kurulum aşamasında, veritabanındaki tabloları yapılandırma sırasında işe yarayabilir.