PHP gercek IP adresini alma

PHP’de proxy uzerinden gelen isteklerin esasen hangi IP’den geldigini bulmaya yarayan bir metod.

private function getRealIpAddr(){
 
                $ip = false;
 
                if(!empty($_SERVER['HTTP_CLIENT_IP'])){
                        $ip=$_SERVER['HTTP_CLIENT_IP'];
                }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
                        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
                }else {
                        $ip=$_SERVER['REMOTE_ADDR'];
                }
 
                return $ip;
        }

PHP Query Cache

basit bir query cache sınıfı. php5 gerekiyor evet.

Kullanımı aşağıdaki gibi. elbette class ilk olarak include edilmeli evet. ikinci parametre true olarak verilirse o dosya için bir cache yoksa eğer ilk olarak cache oluşturulcak ve tekrar çağrıldığında cache’deki veri dönecek

kullanımı:

$dbCache = new dbcache();
 
//eğer query cache'i varsa
    $retVal = $dbCache->checkQueryCache($query);
 
    if($retVal !== FALSE)
   {
	return unserialize($retVal);	
   }
 
//bu satır da querycache'ini yazmak için
//$return değişkeni query'den dönen sonuçların tutulduğu bir array
$dbCache->writeQueryCache($query,serialize($return));

bu da sınıf. cache_dir ile tanımlanan klasöre yazma izni verilmeli:

< ?php
 
/*
 * Class: Simple Query Cache v0.2
 * @author: Doruk Özalp
 * 
 * last update:
 * 23 / 01 / 2010 23:22 PM
 * 
 * changelog:
 * v0.2:
 * added file modification time support
 * 
 * v0.1:
 * initial release
 * 
 * 
 */
 
 
class dbcache
{
	//PRIVATE VARIABLES
	private $cache_file;
	private $base_dir;
	private $this_dir;
	private $lifetime;
	private $query_data;
	private $query;
        private $cache_dir = "assets/output_cache/";
 
	//CONSTRUCTOR
	function __construct()
	{
		$this->setBaseDir($_SERVER["REQUEST_URI"]);
		$this->setThisDir($this->cache_dir) . md5($this->getBaseDir()));
		$this->setLifeTime(3600); // 1-hour
	}
 
	//DECONSTRUCTOR
	function __destruct()
	{
 
	}
 
	//PUBLIC FUNCTIONS
	public function checkQueryCache($query)
	{
		$retVal = FALSE;
 
		$this->setQuery($query);
		$this->setCacheFile($this->getThisDir() . "/" . md5($this->getBaseDir() . $this->getQuery()));
 
		if($this->checkCacheFile())
		{	
			$retVal = $this->loadCacheFile();
		}
 
		return $retVal;
	}
 
	public function writeQueryCache($query, $query_data)
	{
		$this->setQuery($query);
		$this->setQueryData($query_data);		
		$this->setCacheFile($this->getThisDir() . "/" . md5($this->getBaseDir() . $this->getQuery()));
 
			if($this->checkCacheFile())
			{
				clearstatcache();
 
				if(time() - filemtime($this->getCacheFile()) > $this->getLifeTime())
				{
					$this->writecachefile();
				}
			}
			else
			{
				$this->writecachefile();	
			}
	}
 
	//PRIVATE FUNCTIONS
 
	private function checkCacheFile()
	{
		$retVal = FALSE;
 
		if(file_exists($this->getCacheFile()))
		{
			$retVal = TRUE;
		}
 
		return $retVal;
	}
 
	private function loadCacheFile()
	{
		return file_get_contents($this->getCacheFile());
	}
 
	private function writecachefile()
	{
		if(!is_dir($this->getThisDir()))
		{
			mkdir($this->getThisDir(), 0777);
		}
 
		$handle = fopen($this->getCacheFile(), 'w+'); 
		fwrite($handle, $this->getQueryData());
		fclose($handle);
	}
 
	//SETTER AND GETTERS
 
	private function setBaseDir($input)
	{
		$this->base_dir = $input;
	}
 
	private function getBaseDir()
	{
		return $this->base_dir;
	}
 
	private function setThisDir($input)
	{
		$this->this_dir = $input;
	}
 
	private function getThisDir()
	{
		return $this->this_dir;
	}
 
	private function setLifeTime($input)
	{
		$this->lifetime = $input;
	}
 
	private function getLifeTime()
	{
		return $this->lifetime;
	}
 
	private function setCacheFile($input)
	{
		$this->cache_file = $input;
	}
 
	private function getCacheFile()
	{
		return $this->cache_file;
	}
 
	private function setQueryData($input)
	{
		$this->query_data = $input;
	}
 
	private function getQueryData()
	{
		return $this->query_data;
	}
 
	private function setQuery($input)
	{
		$this->query = $input;
	}
 
	private function getQuery()
	{
		return $this->query;
	}
}
?>

PHP Partial Cache

basit bir partial cache sınıfı. php5 gerekiyor evet.

Kullanımı aşağıdaki gibi. elbette class ilk olarak include edilmeli evet. ikinci parametre true olarak verilirse o dosya için bir cache yoksa eğer ilk olarak cache oluşturulcak ve tekrar çağrıldığında cache’deki veri dönecek.

 
$output = new outputcache();
 
$output->load("header.php", true);
$output->load("main.php", true);
$output->load("footer.php", true);

bu da sınıf. cache_dir ile tanımlanan klasöre yazma izni verilmeli:

< ?php
 
/*
 * Class: Simple Output Cache v0.2
 * @author: Doruk Özalp
 * 
 * last update:
 * 22 / 01 / 2010 22:20 PM
 * 
 * changelog:
 * v0.2:
 * added file modification time support
 * 
 * v0.1:
 * initial release
 * 
 * 
 */
 
 
class outputcache
{
	//PRIVATE VARIABLES
	private $output = array();
	private $cache_file;
	private $base_dir;
	private $this_dir;
	private $lifetime;
	private $include_file;
        private $cache_dir = "assets/output_cache/";
 
 
	//CONSTRUCTOR
	function __construct()
	{
		$this->setBaseDir($_SERVER["REQUEST_URI"]);
		$this->setThisDir($this->cache_dir . md5($this->getBaseDir()));
		$this->setLifeTime(3600); // 1-hour
	}
 
	//DECONSTRUCTOR
	function __destruct()
	{
 
	}
 
	//PUBLIC FUNCTIONS
 
	public function load($file, $cache = FALSE)
	{
		$this->setIncludeFile($file);
 
		if($cache === FALSE)
		{
			include_once($this->getIncludeFile());
		}
		elseif($cache === TRUE)
		{
			$this->setCacheFile($this->getThisDir() . "/" . md5($this->getBaseDir() . $this->getIncludeFile()));
 
			if($this->checkCacheFile())
			{
				clearstatcache();
 
				if(time() - filemtime($this->getCacheFile()) > $this->getLifeTime())
				{
					$this->makeCacheFile();
				}
				else
				{
					$this->loadCacheFile();	
				}
			}
			else
			{
				$this->makeCacheFile();	
			}
		}
	}
 
	//PRIVATE FUNCTIONS
 
	private function makeCacheFile()
	{
		$this->start();
 
		include_once($this->getIncludeFile());
 
		$this->setOutput($this->getCacheFile(), $this->getContent());
 
		$this->end();
 
		$this->writecachefile();	
	}
 
	private function checkCacheFile()
	{
		$retVal = FALSE;
 
		if(file_exists($this->getCacheFile()))
		{
			$retVal = TRUE;
		}
 
		return $retVal;
	}
 
	private function loadCacheFile()
	{
		echo file_get_contents($this->getCacheFile());
	}
 
	private function writecachefile()
	{
		if(!is_dir($this->getThisDir()))
		{
			mkdir($this->getThisDir(), 0777);
		}
 
		$handle = fopen($this->getCacheFile(), 'w+'); 
		fwrite($handle, $this->getCacheContent($this->getCacheFile()));
		fclose($handle);
	}
 
	private function getCacheContent($file_md5)
	{
		return $this->getOutput($file_md5);
	}
 
	private function start()
	{
		return ob_start();
	}
 
	private function end()
	{
		return ob_end_flush();
	}
 
	private function getContent()
	{
		return ob_get_contents();
	}
 
	//SETTER AND GETTERS
 
	private function setBaseDir($input)
	{
		$this->base_dir = $input;
	}
 
	private function getBaseDir()
	{
		return $this->base_dir;
	}
 
	private function setThisDir($input)
	{
		$this->this_dir = $input;
	}
 
	private function getThisDir()
	{
		return $this->this_dir;
	}
 
	private function setLifeTime($input)
	{
		$this->lifetime = $input;
	}
 
	private function getLifeTime()
	{
		return $this->lifetime;
	}
 
	private function setCacheFile($input)
	{
		$this->cache_file = $input;
	}
 
	private function getCacheFile()
	{
		return $this->cache_file;
	}
 
	private function setOutput($index, $input)
	{
		$this->output[$index] = $input; 
	}
 
	private function getOutput($index)
	{
		return $this->output[$index];
	}
 
	private function setIncludeFile($input)
	{
		$this->include_file = $input;
	}
 
	private function getIncludeFile()
	{
		return $this->include_file;
	}
}
?>

Merkez Bankasından Günlük Döviz Kurlarını Almak

PHP be Mysql ile Merkez Bankasından günlük kurları almak için ufak bir script. PHP5 gerekiyor tabii ki.

Kullanımı:

$TCMB = new TCMB("http://www.tcmb.gov.tr/kurlar/today.xml");
$TCMB->updateCurrecy();

İlk olarak tablomuz:

CREATE TABLE IF NOT EXISTS `kurlar` (
  `kur_no` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `kur_isim` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  `kur_kod` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  `kur_alis` DECIMAL(6,5) UNSIGNED NOT NULL,
  `kur_satis` DECIMAL(6,5) UNSIGNED NOT NULL,
  `kur_tarih` datetime NOT NULL,
  PRIMARY KEY (`kur_no`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Son Olarak php scriptimiz:

< ?php
class TCMB
{
	private $buying;
	private $selling;
	private $currency_name;
	private $currency_code;
	private $date;
	private $TCMBxml;
 
	function __construct($url)
	{
		$this->setTCMBxml($url);
	}
 
	function __destruct()
	{
 
	}
 
	public function updateCurrecy()
	{
		$xmlContents = simplexml_load_file($this->getTCMBxml(), 'SimpleXMLElement', LIBXML_NOCDATA);		
		$this->setDate(strtotime($xmlContents['Tarih'][0]));
 
		foreach($xmlContents as $object => $value)
		{
			$this->setBuying($value->ForexBuying);
			$this->setSelling($value->ForexSelling);
			$this->setCurrencyCode($value['Kod'][0]);
			$this->setCurrencyName($value->Isim);
 
			$this->insertDate($this->getCurrencyName(), $this->getCurrencyCode(), $this->getBuying(), $this->getSelling(), date("Y-m-d H:i:s",$this->getDate()));
		}
	}
 
	private function insertDate($kur_isim, $kur_kod, $kur_alis, $kur_satis, $kur_tarih)
	{
		$retVal = FALSE;
		$sql = "INSERT INTO kurlar(kur_isim,kur_kod,kur_alis,kur_satis,kur_tarih) VALUES('".mysql_real_escape_string($kur_isim)."','".mysql_real_escape_string($kur_kod)."','".mysql_real_escape_string($kur_alis)."','".mysql_real_escape_string($kur_satis)."','".mysql_real_escape_string($kur_tarih)."')";
		$query = mysql_query($sql, $GLOBALS['baglanti']);
 
		if(mysql_affected_rows() == 1)
		{
			$retVal = TRUE;
		}
 
		return $retVal;
	}
 
	function setTCMBxml($url)
	{
		$this->TCMBxml = $url;
	}
 
	function getTCMBxml()
	{
		return $this->TCMBxml;
	}
 
	function setDate($input)
	{
		$this->date = $input;
	}
 
	function getDate()
	{
		return $this->date;
	}
 
	function setSelling($input)
	{
		$this->selling = $input;
	}
 
	function getSelling()
	{
		return $this->selling;
	}
 
	function setBuying($input)
	{
		$this->buying = $input;
	}
 
	function getBuying()
	{
		return $this->buying;
	}
 
	function setCurrencyName($input)
	{
		$this->currency_name = $input;
	}
 
	function getCurrencyName()
	{
		return $this->currency_name;
	}
 
	function setCurrencyCode($input)
	{
		$this->currency_code = $input;
	}
 
	function getCurrencyCode()
	{
		return $this->currency_code;
	}
}
?>

Parse URL

function parseURL($link)
{
	$text = ereg_replace("([a-z]+)+://([a-zA-Z0-9./-]+)$","<a href="\">\\0</a>",$link);
	$text = ereg_replace("www.+([a-zA-Z0-9./-]+)$","<a href="\">\\0</a>",$link);
 
	return $text;
}

PS: Yarın öbür gün Türkçe karakter kullanmak gerekirse pattern’in içine türkçe karakterleri yazmak lazım evet

Fpdf ve Türkçe Karakter Problemi

fpdf php için yazılmış bedava (free pdf) php ile pdf yaratma kütüphanesidir. Bu ilgi ve alakalı girişten sonra fpdf’in kullanımı ile ilgili bilgi vermek yerine ki bu bilgi kendi sitesinde mevcut, bir klasik olarak karşımıza çıkan güzel dilimiz Türkçe’nin kendine has karakterleri nedeniyle oluşan karakter sorunun çözümüne de değinmeyeceğim çünkü bunun da çözümü var zaten. Burada dikkat edilmesi gereken ve genelde gözden kaçan bir diğer konu yazmak istediğiniz değişkenler “iso-8859-9” olarak encode edilmiş olmalı (bkz. mb_convert_encoding). Veya eğer bir dosya içeriğini yazdırıyorsanız bu dosya da “iso-8859-9” olarak encode edilmiş olmalı.

Codeigniter ve Form Validation

codeigniter framework’un form validation sınıfının kullanıım ile ilgili basit bir örnek.

Not: sadece sınıfın kullanımı ile ilgili diğer gereksiz şeyler yok maalesef

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//form_validation sıfınını yükle
$this->load->library('form_validation');
 
//validation kurallarını ayarla
$this->form_validation->set_rules('username', 'Username', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
$this->form_validation->set_rules('password', 'Password', 'trim|required|callback_validate');
 
//hata formatını ayarla
$this->form_validation->set_error_delimiters('<div class="error">','</div>');
 
//hata mesajlarını ayarla, default olarak ingilizce mesajlar var ehehe
$this->form_validation->set_message('required', '%s lazım abi'); //%s değişkenin ismi
$this->form_validation->set_message('valid_email', 'düzgün mail girsene abi pls ltf tşk');
//kendi fonksiyonumuz için de mesaj ayarlayabiliriz
$this->form_validation->set_message('validate', 'yassak');
 
//kendi yazdığımız fonksiyonları da validation'da kullanabiliriz; callback prefix'i ile birlikte
function validate($input)
{
$retVal = FALSE;
if($input < 10) $retVal = TRUE;
return $retVal;
}
 
//validate et!
if ($this->form_validation->run() == FALSE)
{
//validation başarısız oldu! gerekeni yap!
echo validation_errors();
}
else
{
//validation başarılı oldu!
}

Codeigniter ve Pagination Şeysi

hai!

canım sıkıldı ve codeigniter‘ın çok basit pagination sınıfı ile ilgili bişiler yazalım dedim. öncelikle benim yaptıklarımı yapmak zorunda değilsiniz. burada gayet başarılı anlatılmış aslında. şimdi burada yazacaklarımı anlamanız için azıcık fazla değil ama php bilmen lazım. bununla codeigniter’ın dayalı olduğu MVC altyapısı da bilsen iyi olur. son olarak da bu aşmış framework’e has fonksiyonları bilmen lazım evet kk thx bye.

ilk olarak controller’ımız(users) evet…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function getAllUsers()
{
       $this->load->library('pagination'); //pagination kütüphanesini yükle
 
	$query = $this->users_model->getAllUsers(NULL); //bütün sonuçları al
 
	$config['base_url'] = site_url('users/getAllUsers'); //pagination için kullanılacak fonksiyon 
	$config['total_rows'] = $query->num_rows(); //bütün sonuçların sayısı felan
	$config['per_page'] = 10; //sayfa başına 10 sonuç
 
	$this->pagination->initialize($config); //inişılayz et
 
	//sayfalandırma fonksiyonu 					
	$data['results'] = $this->about_model->getAllUsers(NULL,$config['per_page'],$this->uri->segment(3));
	$data['pagination'] = $this->pagination->create_links(); //linkler otomatik yaratılıyor
 
        $this->load->view('results', $data); //view'u yükle
}

şimdi model’imiz(users_model).. Bu modelde basitçe bir “users” tablosundan bütün veriyi çekiyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getAllUsers($data = array(),$num = NULL, $offset = NULL)  
   {  
          $this->db->select('a.*');  
 
          if(!is_null($num) && !is_null($offset))  
          {  
               $query = $this->db->get('users as a', $num, $offset);  
          }  
          else  
          {  
               $query = $this->db->get('users as a');  
          }  
          return $query;  //bütün sonuçları döndür işte
   }

son olarak ise sırada sonuçların gösterileceği view’ımız(results) var evet 🙂 en altta yer alan pagination değişkenine dikkat pls…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
< ?php if($results->num_rows > 0): ?>
< ?php 
if($this->uri->segment(3))
{
	 $count = $this->uri->segment(3);
}
else
{
	$count = 0;
}
?>
< ?php foreach($results->result() as $object): ?>//bütün sonuçları ölesine yazdırmaca
< ? echo $count++; ?>
< ? echo $object->name; ?>
< ? echo $object->date; ?>
< ? echo $object->email; ?>
< ?php endforeach; ?>
< ?php endif; ?>
1
< ?php echo $pagination; //sayfalandırma linkleri otomatik olarak oluşturulup bu şekilde yazılıyor evet ?>

bu biraz karışık gibi görünebilir ama aslında alıştıktan sonra çok kolaymış cidden…screenshot koymaya üşendiğim için sonucun aynen dokümantasyondaki gibi olacağını arz ederim 🙂 hayırlı olsun…