Çarşamba, 27 Ocak 2010

Veritabanından Satır Çekme Fonksiyonu

 

Bazı formları kullanırken, formlardan kullanıcının göremediği id değerleri çekeriz. Bu yöntemle, tablolar arasında geçiş yapmak kolaydır. Ancak çoğu zaman, formlardan çekilen id değerlerine karşılık gelen başka değişkenleri okumak isteyebiliriz. Bu yazımda controller dosyalarının hepsinde ortak kullanabilen basit ve kullanışlı bir model fonksiyonunu anlatacağım.

Bu fonksiyon oldukça basit bir fonksiyon:

 function get_item_row($table,$column,$arr)
 {
  $query = $this->db->get_where($table,$arr);
  if($query->num_rows() > 0)
  {
   $res = $query->row();
   return $res->$column;
  }else return FALSE;
 }

get_item_row() isimli fonksiyona tablo adı, kolon adı ve WHERE bölümünde kullanılacak bir dizi gönderiyoruz. Fonksiyon bize tablonun istediğimiz kolonuna karşılık gelen değeri geri gönderiyor. Diyelim ki, users isimli bir tablomuz olsun. Formdan gizlice okuduğumuz user_id değerimiz elimizde olsun. Form çalışınca ekrana user_id değerine karşılık gelen username isimli kolondaki değer çekmek istiyorsak, controller dosyamızdan Model fonksiyonunu şöyle çağıracağız:

 $username = $this->Model->get_item_row('users', 'username', array('id' => $this->input->post('user_id'));

Genellikle formlardan gelen bilgilerin çekildiği controller dosyalarında kullanacağımız bu fonksiyon için en uygun kullanım yeri, application/libraries dizini altına oluşturacağımız MY_Model.php dosyası olacaktır.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_model extends Model {
 
    function MY_model()
    {
        parent::Model();
    }

 function get_item_row($table,$column,$arr)
 {
  $query = $this->db->get_where($table,$arr);
  if($query->num_rows() > 0)
  {
   $res = $query->row();
   return $res->$column;
  }else return FALSE;
 }
 
}

Diğer model dosyalarımızı Model sınıfı yerine MY_Model sınıfını genişleterek (extends) oluşturursak, bu fonksiyonu her controller içinden kullanma şansımız olur.

Cuma, 1 Ocak 2010

PHP Sürümlerinde Dikkat Edilmesi Gerekenler

 

CodeIgniter 1.7.2. sürümü PHP`nin (şimdilik) son sürümü olan 5.3.0 sürümü ile uyumlu olduğunu kendi sitesinden okuduk. Çekirdek kodlarında yapılmış değişiklikleri kodları inceleyenler de takip edebilir. Ancak öyle bir hata var ki, ancak rast gelirseniz çözümü için aranıp duruyorsunuz. Bu yazıda hatayı ve en basit düzeltme yöntemindem bahsedeceğim.

Eğer kullandığınız PHP sürümü 5.3.0 ise view dosyalarında php değişkenlerini yazdırmak için eşitlik ifadesini kullanıyorsanız:

<link href="<?=base_url()?>assets/css/styles.css" rel="stylesheet" type="text/css" />
//ya da:
<?=$degisken_adi?>

PHP 5.3.0 versiyonlu kurulumda çalışmayacak ekrana boş değer geri dönecektir. Bu hatayı gidermenin yolunu uzun uzun yazmakla çözmüşler. Üstteki cümleyi aşağıdaki gibi çevirince hata gideriliyor:

<link href="<?php echo base_url()?>assets/css/styles.css" rel="stylesheet" type="text/css" />
//ya da:
<?php echo $degisken_adi?>

Bu tür tespiti zor hatalardan etkilenmemek için çalışan sistemlerin (eğer çok önemli güvenlik açıkları yoksa) yeni sürümlere yükseltilmesinden önce iki kere düşünülmesini tavsiye ederim.

@15 Ocak 2010: Gelen görüşler üzere daha önceki adı "PHP 5.3.0 Sürümündeki Hata" olarak yazdığım bu yazının adını, PHP sürümlerinde dikkat edilmesi gerekenler olarak değiştirdim.

Salı, 15 Aralık 2009

Gmail ile Posta Gönderme

 

Genellikle kiraladığımız sunucular üzerinden e-posta mesajı göndermede sorunlar yaşarız. Sunucular, çoklu mesaj gönderimine "spam mail" olacağı endişesiyle ya da sunucunun fazla zorlanacağını düşünerek genellikle kapalıdırlar. Bu soruna çözüm olarak farklı sunucular üzerinden mesaj gönderme önerilmektedir. CodeIgniter ile Gmail hesabınız üzerinden nasıl e-posta mesajı gönderebileceğinizi bu yazıdan öğrenebilirsiniz.

Öncelikle içinde email kütüphanesinin ayarlarının yer aldığı email.php isimli dosyamızı application/config dizini altında oluşturuyoruz. Bu dosya içinde şu bilgiler yer almalıdır:

<?php

$config = Array(
    'protocol' => 'smtp',
    'smtp_host' => 'ssl://smtp.googlemail.com',
    'smtp_port' => 465,
    'smtp_user' => 'kullanici_adiniz@googlemail.com',
    'smtp_pass' => 'sifreniz',
    'charset' => 'utf-8'
);

Yukardaki ayar dosyamızda smtp_user ve smpt_pass isimli değişkenler, sizin kullanmakta olduğunuz Gmail adresinize ait değişkenler olarak düzeltilmelidir (adres satırında kullandığınız @googlemail.com kısmını değiştirmeyin). Ayar dosyamızı kayıt ettikten sonra application/controller dizini altında, gmail.php isimli bir controller dosyası oluşturalım. Bu dosyamızın içeriği ise şöyle olsun:

<?php

class Gmail extends Controller {

 function Gmail()
 {
  parent::Controller();
 }
 
 function index()
 {
 }

 function yolla()
 {
  $this->load->library('email');
 
  if($this->_send_mail('gonderdigim@mailadresi.com','deneme e-postasi','gmail üzerinden e-posta gönderme denemesi.')) echo "gitti";
  else echo "gidemedi";
 }
 
 function _send_mail($email,$subject,$message){

  $this->email->set_newline("\r\n"); 
  $this->email->from($this->config->item('smtp_user'),'codeigniter.gen.tr');
  $this->email->to($email);

  $this->email->subject($subject);
  $this->email->message($message);

  if(!$this->email->send()) return FALSE;
  else return TRUE;
 }
}


Controller dosyamızda yolla() isimli metod, _send_mail() dahili fonksiyonunu kullanarak sabit bir mesaj göndermektedir. Anlatımın fazla karışık olmaması için bu yazıda mesaj ve gönderilecek e-posta adreslerini ekrandan okutturmadım, sabit gönderdim. Siz istediğiniz değişikliği yapabilirsiniz.

Burada anlatılanları uygularken iki önemli noktaya dikkat etmelisiniz. Birincisi, SSL kullanılıyor olması nedeniyle 465 numaralı portun açık olması (25 değil) gerektiği, diğeri ise email kütüphanesinin yüklenmesinin ardından $this->email->set_newline("\r\n"); cümlesi ile yeni satır eklememiz gerektiğidir.

Programı çalıştırmak için http://localhost/gmail/yolla adersini adres satırına yazmanız durumunda, istediğiniz adrese deneme e-postanızın Gmail üzerinden ulaştığını göreceksiniz. Son not olarak unutmayın, CodeIgniter kullanarak Gmail üzerinden gönderdiğiniz e-postanız da Gmail sent klasörü altına kayıt edilmektedir.