PHP’de explode Fonksiyonu

PHP’de en çok karşıma çıkan fonksiyonlardan birisi olan explode() fonksiyonu hakkında bir kaç kelam etmek gerekiyor. Bu fonksiyonun kullanım amacı, belirli bir karakteri kullanarak bu karakteri içeren dizgeyi parçalara ayırıp dizge haline getirmek.

(PHP 4, PHP 5, PHP 7)
explode — Bir dizgeyi bir ayraca göre bölüp bir dizi haline getirir

Kullanımı

explode(dizge $ayraç, dizge $dizge)

Örneklemelerle kullanımını anlayalım. Örneğin bir formdan etiketler alanı gelmiş olsun. Bu etiketleri virgül yardımıyla parçalara ayırıp dize haline getirelim.

// Örnek POST alan içeriği: php dersleri, fonksiyonlar, nasıl yapılır, içerik
$etiketler = $_POST['etiketler'];

// , karakteriyle dizgeyi bölüyoruz
$etiketlerDizesi = explode(',', $etiketler);
// Her dizge öğesine trim() fonksiyonu uyguluyoruz
// bu fonksiyon, sağdaki ve soldaki boşlukları temizler
$etiketlerDizesi = array_map('trim', $etiketlerDizesi);

// Dizge içeriğini ekrana yazdıralım:
print_r($etiketlerDizesi);

/* 
Sonuç olarak dönen değer şu olacaktır:
Array
(
    [0] => php dersleri
    [1] =>  fonksiyonlar
    [2] =>  nasıl yapılır
    [3] =>  içerik
)
*/

explode Fonksiyonunun Kullanım Alanları

Nerelerde kullanıyoruz bu fonksiyonu hemen söyleyelim. Örneğin, URL barındaki adresi anlamak için kullanıyoruz ya da belli karakterlerle listelenmiş bir yazıyı parçalara bölmek için kullanıyoruz. Ben, örnek olarak basit bir yöntemi anlatacağım. Bu anlatacağım yöntemde URL satırındaki adresi alıp, daha anlaşılabilir hale getireceğiz.

Bahsedeceğim örnekte, modül ve bölüm sistemi olacak. Modüller, anasayfa, haber, galeri gibi kök yöneticiler, bölümler ise alt yöneticileri olacak. Yani örneğin haber modülü için haberGoster, haberEkle gibi ek bölümler olacak.


// Eğer rota varsa rotadır, yoksa kök halindedir
$rota = isset($_GET['rota']) ? $_GET['rota'] : '/';
// Burada explode ile / karakterini kullanara dizgeyi böldük
$rotalar = explode('/', $rota);
// Eğer dize içindeki ilk rota boşsa diziden çıkaralım
// array_shift fonksiyonu dizideki ilk öğeyi çıkarır
if (empty($rotalar[0])) array_shift($rotalar);

// Burada modül eğer varsa ve boş değilse modüldir, değilse geçerli olarak anasayfa'dır
$modul = isset($rotalar[0]) && !empty($rotalar[0]) ? $rotalar[0] : 'anasayfa';
// Burada aynı şekilde modül gibi varsa vardır yoksa giriş'dir
$bolum = isset($rotalar[1]) && !empty($rotalar[1]) ? $rotalar[1] : 'giris';

// Yukarıdaki işlemin diğer bir kullanımı şöyledir:
$modul = null;
if (isset($rotalar[0]) && !empty($rotalar[0])) {
	$modul = $rotalar[0];
} else {
	$modul = 'anasayfa';
}

Yukarıdaki örneği olabildiğince basite indirgediğim için işimizi tam anlamıyla ve sürekli olarak görmeyebilir ama anlamak açısından iyi gelebilir. MVC çatıları sayfanın ne olduğunu explode fonksiyonu ile anlar ve işlemi buna göre yönlendirirler.

PHP’de array_sum Fonksiyonunu Alt Dizelerde Kullanmak

PHP’de array_sum fonksiyonu kullanmam gerekti. Ama normal kök dizide değilde, alt dizideki değerleri toplamam gerekiyordu.

array_sum fonksiyonu ne işe yarar?
Bu fonksiyon bir dize içerisindeki değerlerin toplamını döndürür.

Örnek senaryo, her müşteriye ait tutar/bakiye değerlerini listeleyip hepsinin toplamını en son göstermek.

['Müşteri' => ['Tutar' => 150.00, 'Bakiye' => 360.00]]

<?php
$amount = [];
$balance = [];

foreach ($result as $result) {
    $amount[] = $result['amount'];
    $balance[] = $result['balance'];
    # Listeleme yapacak kod bloğu
}

$totalAmount = array_sum($amount);
$totalBalance = array_sum($balance);

Şeklinde kullanılabilir, kolay gelsin.

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.

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.

PHP ile PDO Sorgu Hatalarını Yakalamak

PHP PDO uzantısını kullanırken, try/catch blokları içerisinde veritabanı bağlantısında oluşabilecek hataları şu şekilde yakalayabiliyoruz.

try {
  $pdo = new \PDO($dsn, $user, $pass);
} catch (\PDOException $e) {
  throw new \Exception('Bağlantı hatası: ' . $e->getMessage());
}

Fakat sorgulardaki hataları bu şekilde yakalayamıyoruz maalesef. Sorgu hatalarını yakalamak için, PDO bağlantısının hemen altına aşağıdaki gibi bir metodla tanımlama yapmamız gerekiyor:

$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

Bunu yaptıktan sonra, aşağıdaki gibi sorgu hatalarını yakalayabiliyoruz:

try {
  $query = $pdo->prepare('SELECT * FROM post');
  $query->execute();
  $posts = $query->fetchAll();
} catch (\PDOException $e) {
  throw new \Exception('Sorgu hatası: ' . $e->getMessage());
}

gibi. Kolay gelsin.