‘php’ etiketli yazlar

Email adresi kontrolü için pek çok fonksiyon yazılmıştır. Bunları internette kolayca bulabilirsiniz. Fakat bu fonksiyonlar ne kadar doğru çalışıyor? ‘Comparing E-mail Address Validating Regular Expressions’ isimli yazıda vakti bol saygıdeğer bir arkadaşımız ‘Regular Expression’ ile yapılan 13 adet e-posta doğrulamasını sistemli bir şekilde test etmiş, hangisinin nerede doğru, nerede yanlış çalıştığını güzel bir şekilde listelemiş. Bu testlere göre mükemmel doğrulukta çalışan bir metot bulamamış ama Kohana project‘ten Geert De Deckere tarafından geliştirilen aşağıda göreceğiniz ‘regular expression’ı en başarılı olarak seçmiş. Bu regex’te eksik olan 2 nokta bulmuş. Bu iki noktasizin için problem çıkarmayacaktır. Detayları yukarıda verdiğim adreste bulabilirsiniz. Aşağıda bu regex’in fonksiyon haline getirilmiş halini bulabilirsiniz.

/**
* Eposta adresinin gecerli olup olmadigini kontrol eder.
* @param $eposta
* @return bool eposta gecerli ise 'true', degilse 'false' dondurur.
*/
function epostaDogrumu($eposta){
	return (bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', $eposta);
}

For english: Date & Time Difference in PHP

İki tarih arasındaki farkı hesaplamak için PHP’de date_diff diye bir fonksiyon bulunmakta ama ne yazık ki bu fonksiyon PHP’nin sadece 5.3 ve sonraki versiyonlarında çalışıyor. Dolayısıyla pek çok kişi için tarih-saat farkı hesaplayan bir fonksiyona ihtiyaç var. Bu sayfada bu işi yapan bir fonksiyon bulacaksınız. Aradığınız sadece Türkçe tarih & saat göstermek ise şu yazıya bakınız: PHP ile Türkçe Tarih Gösterimi-Çevrimi

Kullanım

Fonksiyon 3 adet değişken alıyor. Bunlardan sadece birincisi zorunlu.
dateDiff($d1[, $d2=null [, $format="*"]);

İlk iki parametre olarak farkı alınacak tarih ve/veya saatleri giriyorsunuz. Tarih formatı olarak Unix zaman damgası veya ‘strtotime‘ fonksiyonunun kabul ettiği herhangi bir değer kullanılabilir. Dolayısıyla tarih girmek için ‘time()‘ fonksiyonun ya da acayip bir format kullanmıyorsanız MySQL verilerini doğrudan kullanabilirsiniz. ‘strtotime‘ fonksiyonunu kabul ettiği değerler ile ilgili php.net strtotime sayfasına bakabilirsiniz. Girilen zamanların hangisinin büyük olduğu önemli değil. Yani tarihFarki(’12-03-2009′, ‘01-01-2010′) ve tarihFarki(’01-01-2010′, ‘12-03-2009′) size aynı sonuçları getirecektir. Son parametre olan $format sonucun hangi şekilde döndürüleceğini belirler. $format olarak “saniye”, “dakika”, “saat”, “gun”, “hafta”, “ay”, “yil” veya “*” değerlerinden birisini girebilirsiniz. “*” dışındaki seçeneklerde fonksiyon size belirtilen formatta bir sayı döndürecekir. Yani tarihFarki(’2010-01-02′, ‘2010-01-01′, ‘gun’) yazarsanız alacağınız sonuç ‘1′, tarihFarki(’2010-01-02′, ‘2010-01-01′, ‘dakika’) yazarsanız ‘86400′ (bir gündeki dakika sayısı) olur. Eğer $format olarak “*” girerseniz ya da bu alanı hiç kullanmazsanız fonksiyon yukarıda geçen tüm değerleri içeren bir dizi döndürür.

Örnekler

echo "Şu an:".date("r",time())."<br>";
echo "1: ".tarihFarki("20090401040302", time(), "ay")." ay<br>";
echo "2: ".tarihFarki(time(), "2009-07-23 04:00:00", "saat")." saat<br>";
echo "3: ".tarihFarki("-3 day", "2009-07-23 04:00:00", "gun")." gun<br>";
echo "4: ".tarihFarki("2008-06-23", "2009-07-23", "yil")." yıl<br>";
$t=tarihFarki("2008-06-23", "2009-07-23");
echo "5: ";
print_r($t);
echo "<br>";

Kod

/**
 * Iki tarih arasindaki farki bulur.<br>
 * <strong>kullanim:</strong> dateDiff($d1[, $d2=null [, $format="*"]);<br>
 * <strong>ornek:</strong><br>
 * echo "şu an:".date("r",time())."<br>";
 * echo "1: ".tarihFarki("20090401040302", time(), "ay")." ay<br>";
 * echo "2: ".tarihFarki(time(), "2009-07-23 04:00:00", "saat")." saat<br>";
 * echo "3: ".tarihFarki("-3 day", "2009-07-23 04:00:00", "gun")." gun<br>";
 * echo "4: ".tarihFarki("2008-06-23", "2009-07-23", "yil")." yıl<br>";
 * $t=tarihFarki("2008-06-23", "2009-07-23");
 * echo "5: "; print_r($t);
 *
 * @param mixed $d1     ilk tarih. unix zaman damgasi ya da strtome 
 *                      fonsksiyonunun kabul ettigi herhangi bir deger olabilir. 
 *                      ornek: '2009-05-23', '2009-05-23 12:10:04', '-2 day',
 *                      '23-05-2009 12:23', '20090523121004'
 * @param mixed $d2     ikinci tarih. ilkiyle ayni ozellikleri tasir. eger 
 *                      girilmez ya da bos bir deger olarak girilirse o anki 
 *                      tarih olarak alinir. bu iki tarih arasinda 
 *                      hangisinin buyuk hangisinin kucuk oldugu onemli degildir.
 *                      ikisi de ayni sonuc verir.
 * @param str $format   "saniye", "dakika", "saat", "gun", "hafta", "ay", 
 *                      "gun", "*".
 *                      eger girilmez ya da "*" olarak girilirse yukaridaki 
 *                      butun degerleri iceren bir dizi dondurur. belirtilen 
 *                      diger degerlerden birisi girilirse bu tipte bir sayi 
 *                      dondurur.
 * @return mixed        sayi ya da dizi tipinde tarihler arasindaki farki 
 *                      dondurur. dizinin icinde bulunan  degiskenler 
 *                      sunlardir: "saniye", "dakika", "saat", "gun", "hafta", 
 *                      "ay", "gun" olacaktir.
 */
function tarihFarki($d1, $d2=null, $format="*"){
    if($d2==null){
        $d2=$d1;
        $d1=time();
    }
 
    if(!is_int($d1)) $d1=strtotime($d1);
    if(!is_int($d2)) $d2=strtotime($d2);
    $d=abs($d1-$d2);
 
    $format=strtolower($format);
    if(empty($format)) $format="*";
 
    $result = array();
 
    if($format=="*" || $format=="gun")    $result["gun"]   = floor($d/(60*60*24));
    if($format=="*" || $format=="ay")     $result["ay"] = floor($d/(60*60*24*30));
    if($format=="*" || $format=="yil")    $result["yil"]  = floor($d/(60*60*24*365));
    if($format=="*" || $format=="hafta")  $result["hafta"]  = floor($d/(60*60*24*7));
    if($format=="*" || $format=="saat")   $result["saat"]  = floor($d/(60*60));
    if($format=="*" || $format=="dakika") $result["dakika"]= floor($d/60);
 
    if($format!="*") return $result[$format];
    else return $result;
}

Asağıdaki fonksiyon ile bir dizindeki dosyaları silebilirsiniz. Fonksiyon ihtiyacınıza göre farklı şekillerde çalışabilir. Bir dizini alt dizinleriyle birlikte silebilirsiniz, dosya silerken ‘regular expression’ kullanıp dosya adına göre silme işlemi yapabilirsiniz, dizinin sadece içeriğini silebilirsiniz. Aşağıda gerekli bilgileri ve kullanım örneklerini PHPDoc şeklinde türkçe olarak yazdım.

(Click for english: Remove a Directory and Its Content with PHP)

/**
 * bir dizin/klasör icindeki dosyalari siler.
 * kullanim sekli:
 * dizinSil(string $dizin [, bool $dizininKendisiniSil=true 
 *                      [, bool $altDizinleriSil=true 
 *                      [, string $regEx='/.* /']]]); 
 * 
 * kullanim ornekleri:
 * dizinSil('/home/gudubeth/resimler');
 *      //dizin icindeki dosyalari, alt dizinleri ve dizinin kendisi siler
 * dizinSil('/home/gudubeth/resimler', false);
 *      //sadece dizinin icerigini siler. alt dizinler silinir
 * dizinSil('/home/gudubeth/resimler', false, false);
 *      //sadece dizinin icerigini siler. alt dizinler silinMEZ
 * dizinSil('/home/gudubeth/resimler', false, true, '/.*\.jpg/');
 *      //dizin ve altdizinlerdeki jpg uzantili dosyalari siler.
 *
 * @param str $dizin
 *                      dizinin yeri. ornek: /home/guest/temp
 *                      veya c:/appserv/www/tmp
 * @param bool $dizininKendisiniSil
 *                      eger 'true' ise dizinin kendisini siler.
 *                      degil ise sadece dizin icerigi silinir.
 *                      varsayilan deger: 'true'
 * @param bool $altDizinleriSil
 *                      'true' ise yinelemeli (rekursif) calisip
 *                      alt dizinleri de siler.
 *                      varsayilan deger: 'true'
 * @param str $regEx
 *                      sadece $regEx ile secilen dosyalari siler.
 *                      regEx fonksiyonu olarak preg_match kullanilir.
 *                      varsayilan deger: '/.* /' (yani tum dosyalari sil).
 *                      ornek degerler:
 *                          mp3 uzantili dosyalari sil: '/.*\.mp3/'
 *                          adi a ile baslayan dosyalari sil: '/a.* /'
 *                          adinda 'tmp' gecen dosylari sil: '/.*tmp.* /'
 *
 * @return  bool        eger denenen her dosya silindiyse veya silinecek bir
 *                      dosya bulunamadiysa 'true' degerini dondurur.
 *                      Dosya silme islemlerinden herhnagi birisi hatali ise
 *                      'false' dondurur.
 * */
function dizinSil($dizin, $dizininKendisiniSil=true, $altDizinleriSil=true, $regEx="/.*/") {
    if(!$dh = @opendir($dizin)) return false;
    $sonuc=true;
    while (($dosya=readdir($dh))!==false) {
        if($dosya!='.' && $dosya!='..'){
            if(is_dir( $dizin.'/'.$dosya) && $altDizinleriSil)
                $sonuc = dizinSil($dizin.'/'.$dosya, true, true, $regEx) && $sonuc;
            else if(preg_match($regEx, $dosya))
                $sonuc = @unlink($dizin.'/'.$dosya) && $sonuc;
        }
    }
    closedir($dh);
    if($dizininKendisiniSil) $sonuc = @rmdir($dizin) && $sonuc;
    return $sonuc;
}

Kolaylıkların dili PHP ile tarih formatlamak gerçekten kolay bir iş ama sadece ingilizce siteler için. İngilizce bir sitede tarih göstermek için tek ihtiyacınız ‘date‘ fonksiyonu. İlk parametre olarak gireceğiniz belirli karakterlerle tarihi istediğiniz gibi gösterebilirsiniz. Mesela ‘January 12, 2009‘ yazdırmak için ‘echo date(”F j, Y”)‘ yazmanız yeterli olacaktır.

Türkçe Tarih & Saat Fonksiyonu

Tarih ve saat gösterimini en basit şekilde halledebilmeniz için aşağıdaki göreceğiniz fonksiyonu kullanabilirsiniz. Fonksiyonun çalışma prensibi çok basit: date fonksiyonunu çağırıp aldığı çıktıdaki ingilizce kelimeleri türkçeye çeviriyor. Fonksiyonun dışında kalan diziler de bu çevrimler için zaten. Doğrudan date fonksiyonu kullanıldığı için aldığı parametreler temelde date ile aynı. Sadece işleri biraz daha kolaylaştırmak için bu parametrelerin yeteneklerini arttırdım. Şöyle ki: tarih formatının belirlendiği ilk parametrede ay, gün, yıl gibi türkçe kelimeler; gösterilecek tarihin belirlendiği ikinci parametrede ise tek bir tane yerine çok daha çeşitli formatlarda tarihler kullabiliyorsunuz. Basitçe örneklersek, date(”d F Y”) fonksiyonunu tarih(”d F Y”) şeklinde yazabileceğiniz gibi tarih(”gun ay yil”) şeklinde de yazabilirsiniz (çıktısı ‘17 Mayıs 2009′ gibi birşey olacaktır).

Tanımlama:

tarih($format, [$zaman]);
$zaman ile belirtilen zamanı ilk parametrede belirtilen formatta biçimlendirir. $zaman parametresi girilmemişse çalışma zamanındaki zaman kullanılır.

Parametreler:

$format

Biçilendirilecek tarihin formatı. String içerisine yazılan format bilgilerinden oluşur (”d-F-Y” gibi). date fonksiyonunda kullanılan seçeneklerin hepsi bu değişken için de geçerlidir. php.net:date fonksiyonu adresinde detaylı seçenekleri görebilirsiniz. Bu sayfada belirtilen seçeneklerin yanı sıra aşağıda belirtilen türkçe değerler de kullanılabilir.

Biçim Açıklama Örnek sonuç
gun Ay günlerinin sıfır dolgulu iki haneli gösterimi 01′den 31′e
kisagun Ay günlerinin sıfır dolgusuz gösterimi 1′den 31′e
hgun Hafta günlerinin tam metinsel gösterimi Pazar’dan Cumartesi’ye
hgunkisa Ay günlerinin iki harfli metinsel gösterimi Pzt’den Paz’a
ay Ayın tam metinsel gösterimi, Ocak ya da Mart gibi Ocak’tan Aralık’a
kisaay Ayın üç karakterli, metinsel kısa gösterimi Oca’dan Ara’ya kadar
aysayi Ayın sıfır dolgulu sayısal gösterimi 01′den 12′ye
kisaaysayi Ayın sıfır dolgusuz sayısal gösterimi 1′den 12′ye kadar
yil Yılın 4 haneli sayısal, tam gösterimi 1999 ya da 2003 gibi
kisayil Yılın iki haneli gösterimi 99 ya da 03 gibi
saat Saatin, 24-saatlik sıfır dolgulu gösterimi 00′dan 23′e
kisasaat Saatin, 12-saatlik sıfır dolgulu gösterimi 01′den 12′ye
dakika Sıfır dolgulu dakika gösterimi 00 ile 59 arasında
saniye Sıfır dolgulu saniye gösterimi 00 ile 59 arasında
Örnek format Örnek sonuç
“ay, yil” Ocak, 2010
“kisagun ay, hgun” 7 Ocak, Pazartesi
“gun-aysayi-kisayil saat:dakika:saniye” 07-01-10 12:10:54

$zaman:

Biçimlendirilecek zamanı belirtir. Eğer girilmemişse o anki zaman kullanılır. $zaman değeri strtotime fonksiyonun kabul ettiği tüm değerler olabilir. MySQL veritabanından aldığınız değerleri doğrudan kullanabilirsiniz. Aşağıda bu parametrenin alabileceği bazı değerler örneklenmiştir:
“31-12-2009 13:23:10″
“2009-12-31 13:23:10″
“31-12-2009″
“3 gun once”
“-3 gun”
“+5 gun”
“2 yil sonra”

Kullanım Örnekleri

echo tarih("gun/ay/yil saat:dakika:saniye")."; ";
// çıktısı: 30/Aralık/2009 01:06:58;
echo tarih("gun-ay-yil, hgun saat:dakika", "3 gun once")."; ";
// çıktısı: 27-Aralık-2009, Pazar 01:06;
echo tarih("kisagun-kisaaysayi-kisayil, hgun saat:dakika", "+2 ay")."; ";
// çıktısı: 2-3-10, Salı 01:08;
echo tarih("yil.ay.gun saat:dakika:saniye", "2009-12-20 12:10:23")."; ";
// çıktısı: 2009.Aralık.20 12:10:23;
echo tarih("gun ay yil saat:dakika", "20081118100630");
// çıktısı: 18 Kasım 2008 10:06

Kod

$aylarIng=array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
$aylarKisaIng=array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
$gunlerIng=array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
$gunlerKisaIng=array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
$aylar=array("Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık");
$aylarKisa=array("Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara");
$gunler=array("Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar");
$gunlerKisa=array("Pt", "Sa", "Ça", "Pe", "Cu", "Ct", "Pa");
 
/**
 * tarihi turkceye cevirir. tarih temelde date fonksiyonu ile olusturulur.
 * $zaman ise strtotime ile timestamp'e cevrilir. $format'in kullanımi
 * date fonksiyonunda oldugu gibidir. ayni sekilde  $zaman'in alacagi degerler
 * strtotime fonksiyonuna uygun secilebilir.
 *
 * @global array    $aylarIng, $aylar, $gunlerIng, $gunler, $aylarKisaIng,
 *                      $aylarKisa, $gunlerKisaIng, $gunlerKisa
 * @param str       $format
 * @param str/int   $zaman
 * @return str
 */
function tarih($format, $zaman=null){
    if(!$zaman) $zaman=time();
    else{
        $zaman=str_ireplace(array("once","ay", "gun", "yil","dakika","saniye","hafta"),
                           array("ago","month","day","year","minute","second","week"), $zaman);
        $zaman=strtotime($zaman);
    }
    $format=str_ireplace(
        array("kisaaysayi","kisaay","aysayi","kisagun","hgunkisa","hgun","gun","kisayil","yil","kisasaat","saat","dakika","saniye", "ay"),
        array("n",         "M",     "m",     "j",      "D",       "l",   "d",  "y",      "Y",  "h",       "H",   "i",     "s",      "F"),
        $format);
    $tarihStr=date($format, $zaman);
    if(strpos($format, "F")!==false){
        global $aylarIng, $aylar;
        $tarihStr=str_replace($aylarIng, $aylar, $tarihStr);
    }
    if(strpos($format, "l")!==false){
        global $gunlerIng, $gunler;
        $tarihStr=str_replace($gunlerIng, $gunler, $tarihStr);
    }
    if(strpos($format, "M")!==false){
        global $aylarKisaIng, $aylarKisa;
        $tarihStr=str_replace($aylarKisaIng, $aylarKisa, $tarihStr);
    }
    if(strpos($format, "D")!==false){
        global $gunlerKisaIng, $gunlerKisa;
        $tarihStr=str_replace($gunlerKisaIng, $gunlerKisa, $tarihStr);
    }
    return $tarihStr;
}

Kaynaklar:
‘date’ fonksiyonu

SetLocale ile Türkçe Tarih&Saat

Aslında strftime fonksiyonunu kullanarak da türkçe tarih gösterebiliyorsunuz. Fakat bunun için sunucunun bölgesel ayarlarının türkçe olacak şekilde değiştirilmiş olması gerekiyor. Bu ayar yapılamamış olsa bile eğer sunucunuz buna izin veriyorsa PHP kodunuzun başına bir yerlere
setlocale(LC_TIME, ‘tr_TR’);
satırını ekleyerek bölgesel ayarları türkçeye uygun hale getirebilirsiniz. Test için şu php kodunu suncunuzda çalıştırınız:

setlocale(LC_TIME, 'tr_TR');
echo strftime('%A, %d. %B %Y');

Eğer ‘Salı, 05. Ocak 2010′ gibi bir sonuç alıyorsanız bu yöntemi kullanabilirsiniz.

Kaynaklar:
’strftime’ fonksiyonu
’setlocale’ fonksiyonu

Web sitesi hazırlarken sayfalarınızın tarayıcı önbelleğine alınmasını (yani cache’lenmesini) engellemenin iki temel yolu var. Birincisi HTML içerisinde meta etiketleri yazmak, ikincisi sunucu tarafında sayfanın başlığına (header) gerekli satırları eklemek. Aşağıda bu iki yöntemi bulacaksınız.

1. HTML ile sayfanızın önbelleğe alınmasını engelleme

<meta http-equiv=”Pragma” content=”No-Cache” />
<meta http-equiv=”cache-control” content=”no-cache, no store” />
<meta name=”Expires” content=”Mon, 26 Jul 1997 05:00:00 GMT” />

Yukarıdaki kodu sayfanızda <head></head> etiketleri arasında yerleştirmelisiniz. Bu yöntemin dezavantajı XML ya da RSS gibi HTML olmayan sayfalarda kullanılamayacak olmasıdır.

2. Sunucu tarafında engelleme

Ön belleğe alma işlemini sunucu tarafında engellemek için, göndereceğimiz sayfa ile birlikte bazı başlıkları (header) göndermemiz gerekiyor. PHP, ASP.NET ve JAVA/JSP için bu başlıkların nasıl yazılacağını aşağıda bulabilirsiniz. Birinci yöntemden farklı olarak bu başlıkları resimlerde dahil olmak üzere her türlü dosyayı gönderirken kullanabilirsiniz.

PHP

 header("Expires: Mon, 01 Jul 1990 05:00:00 GMT");
 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
 header("Cache-Control: no-store, no-cache, must-revalidate");
 header("Cache-Control: post-check=0, pre-check=0", false);
 header("Pragma: no-cache");

ASP.NET

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0

Yukarıdaki ASP.NET kodunu Stackoverflow’da şu sayfada buldum: Making Sure a Web Page is not Cached Across All Browsers. Denemiş değilim ama muhtemelen doğru çalışıyordur.

Java

response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", -1); //proxy seviyesinde engelleme
Kategoriler: Programlama
Tags: , , ,
devam et >

Etkileşimli ve çok dilli bir siteyle uğraştıysanız kullanıcı girişlerindeki aksanlı karakterleri, aksansız hale getirme ihtiyacı duymuş olabilirsiniz. Aksanlı karakterlerden kasıt ingiliz alfabesinde olmayan ğ, ş, ä gibi karakterler, aksansızlardan kasıt da bunların g, s, a gibi ingiliz alfabesinde bulunan aksansız biçimleri… Dün Wordpress’in kodlarına bakarken tam da bu işi yapan ‘remove_accents’  isimli bir fonksiyon buldum. UTF8 harici değişimler yapılan kısmını aşağıda bulabilirsiniz. Orjinal hali için: Wordpress’te wp-inlcludes/formatting.php içindeki remove_accents isimli fonksiyona bakabilirsiniz. Kod elinizde yoksa da formatting.php dosyasını online olarak görmek için buraya tıklayın.

Örnek kullanım:

echo remove_accents("ğüşıöç ĞÜŞİÖÇ äëïã ÄËÏÃ");
//çıktısı 'gusioc GUSIOC aeia AEIA' şeklinde olacaktır.

(daha fazla…)

Youtube’da ya da kullanıcıların yorumlarının yayınlandığı pek çok yerde görmüşsünüzdür: yorumun yazılış tarihi, 12 Ekim 2009, 12:24 gibi net bir tarih olarak değil de aradan geçen süre bazında (2 gün önce, 5 yıl önce, vb…) gösterilir.

Aşağıdaki bu işi türkçe olarak yapan bir PHP fonksiyonu bulunmakta. PHP’de bulunan strtotime fonksiyonunun kabul ettiği her türlü tarih değerini girdi olarak kullanabilirsiniz. Bu da veritabanınızdan aldığınız tarihi çok büyük ihtimalle direkt olarak kullanabileceğiniz anlamına gelir. Fonksiyonun kullanım şekli, başındaki açıklama satırlarında mevcuttur.

Tarihi türkçe olarak doğrudan ‘12 Ekim 2009′, ‘07-Ağustos-2008, Cumartesi’ gibi şekillerde yazdırmak istiyorsanız PHP ile Türkçe Tarih Gösterimi-Çevrimi başlıklı yazıya gözatmanız daha doğru olur.

/**
 * verilen tarihler arasında geçen süreyi "1 gün önce", "2 hafta önce" gibi
 * günlük kullanım'a uygun kolay anlaşılır bir şekle çevirir. Normal kullanımda
 * o anki tarih baz alınır.
 * İstenirse ikinci parametre kullanılarak, girilen iki tarih arasındaki
 * fark alınabilir.
 * Örnek Kullanım (şu anki tarihi 2009-08-25 13:00:00 olarak kabul edersek):
 *      echo "çıktı: ".cicitarih("2009-08-23 12:05:14"); // çıktı: 2 gün önce
 *      echo "çıktı: ".cicitarih("2009-04-23 10:00:00"); // çıktı: 4 ay önce
 *      echo "çıktı: ".cicitarih("2009-04-23 10:00:00", "2009-05-24 11:00");
 *                                                       //çıktı: 1 ay önce
 * @author gudubeth.net
 * @param str $tarih    hesabın yapılacağı tarih. strtotime fonksiyonu
 *                      tarafından kulanılabilecek her türlü string değerini
 *                      alabilir.
 *                      bkz: http://www.php.net/manual/tr/function.strtotime.php
 * @param str $simdi    boş bırakılırsa, o anki saat baz alınır.
 *                      formatı $tarih alanında olduğı gibidir.
 * @return str
 */
function cicitarih($tarih, $simdi=null){
 
    //aradan geçen süreyi bul
    if(!$simdi) $simdi=time();
    $sure=$simdi-strtotime($tarih);
 
    //eğer geçen süre negatif ise boş metin döndür.
    if($sure&lt;0) return "";
 
    //dönüş metninin oluşturulduğu yer
    //3600: 60*60, yani 1 saat;
    //86400: 60*60*24 yani 1 gün demektir.
    if($sure&lt;60)return round($sure)." saniye önce";
    else if($sure<3600) return round($sure/60)." dakika önce";
    else if($sure<86400) return round($sure/(3600))." saat önce";
    else if($sure<86400*7) return round($sure/(86400))." gün önce";
    else if($sure<86400*30) return round($sure/(86400*7))." hafta önce";
    else if($sure<86400*365) return round($sure/(86400*30))." ay önce";
    else  return round($sure/(86400*365))." yıl önce";
}

Flash kullanarak bir site yaptınız ve bu flash’ın içerisine bir haber bölümü ya da ona benzer, flash dışından güncellenebilecek bir metin eklemek istiyosunuz ama nasıl yapacağınızı bilmiyorsunuz? O zaman bu yazı tam size göre.

Laf kalabalığından hoşlanmayanlar için: bu yazının en altındaki linkten ya da hemen buradan flash, XML, PHP, MySQL dosyalarından oluşan kullanıma hazır bir örneği indirebilirsiniz.

Flash ile dinamik haberler yapımı ekran görüntüsü

Şimdi dinamik haberleri nasıl yapacağınızı anlatayım. Gerçekten kolay olacak. Yukarıdaki resim zaten herşeyi gösteriyor. Bir flash dökümanı açın. İçine bir text alanı yaratın. Farklı bir ‘layout’ kullanmıyorsanız programın alt kısmındaki properties kısmında bu text alanının tipini “Static Text” yerine “Dynamic Text” yapın. Bu bölümün hemen altındaki alana text alanımızın ismini “newsText” olarak girin. Tamam. Şimdi sağ tarafta “Single Line” yazan seçeneği “Multi Line” yapın. Onun da sağında yer alan 3 küçük ikondan ortada yer alan <a> ikonuna tıklayıp haber metninin içerisine HTML kullanılmasına izin verin. Eer scrollbar yani kaydırma çubuğu istiyorsanız CTRL+F7′ye basarak Components penceresini açın. Burada alt taraflarda bir yerlerde UIScrollBar isminde bir Component var. Onu tutup, text alanımızın üstüne çekin.

Son olarak aşağıdaki actionScript kodunu flash dosyanıza ekleyin. news.xml dosyasını da aynı dizine koymayı unutmayın.

PHP ve MySQL dosyaları için yazının devamına bakmanız gerekecek.

(daha fazla…)

Kategoriler: Programlama
Tags: , , , ,
devam et >

Başlık pek açıklayıcı olmadı aslında. Direkt olarak örnekle açıklayayım olayı:
Mesela bir ürün tablonuz var. Ürünleri kategorilerine göre listelemek istiyorsunuz. Bununla da yetinmeyip sayfa başına en fazla 20 tane ürün bulunacak şekilde sayfalama yapmak istiyorsunuz. Temel bilgilere sahip bir yazılımcının tercih edeceği yöntem şuna benzer birşey olur:

Öncelikle sayfalamayı yapabilmek için bu kategorideki toplam ürün sayısını bulmanız gerekir. Bunu şu sorguyla yaparsınız:
SELECT count(id) AS data_count FROM urunler WHERE kategori_id=’3′

Sonra da göstereceğiniz ürünleri
SELECT * FROM urunler WHERE kategori_id=’3′ LIMIT 0,20
sorgusu ile alıp listeleme işlemini yaparsınız. Sonraki sayfalarda satır sayısını tekrar tekrar hesaplamak istemiyorsanız bulduğunuz satır sayısını ‘SESSION’ ya da ‘COOKIE’ kullanarak saklayabilirsiniz. Bu işlemlerdeki sorun aynı sorguyu biraz değiştirerek iki kere yazmanız gerekmesidir. Bu zaman zaman sıkıntı yaratabilir.

MySQL insanları 4. versiyonu çıkarmadan önce oturmuşlar, bu işlemleri tek seferde yapabilmemiz için SQL_CALC_FOUND_ROWS diye birşey yapmışlar.
(daha fazla…)

Kategoriler: Programlama
Tags: , ,
devam et >