admin: 30 Ağustos 2010 | kategori: Php | yorum yok
Bazı durumlarda PHP ile işlemler yaparken kullanıcılardan tarih girmelerini isteriz. Bu işlem genelde tarih seçici bir arayüzle olsa da nadiren kullanıcı elle tarih girmek zorunda kalabilir. Bu gibi durumlarda hatalı bir sonuç almamak için tarihin geçerli olup olmadığını kontrol etmemiz gerekebilir. Bu nedenle bugünkü yazımız da basit bir tarih kontrol fonksiyonunu nasıl kodlayacağımızı göreceğiz. Kısa bir işlem olacak ancak tüm ayrıntıları öğrenip PHP konusunda gelişmeniz için yaptığımız tüm kodlamayı satır satır inceleyeğiz.
1. Fonksiyonumuzu tanımlayalım
İlk olarak php fonksiyonumuzun yapısını basit şekilde oluşturalım.
<?php
function tarihGecerlimi ($gelenTarih) {
}
?>
Gördüğünüz gibi kodlamamızı çok basit bir şekilde başlattık ve kontrolünü yapacağımız tarihi fonksiyona gelen argümanlar arasında tanımladık. Böylelikle tarihGecerlimi(‘12-25-1995′) şeklinde bir kontrol yapıldığı zaman 12-05-1995 tarihini $gelenTarih değişkeni aracılığıyla işleme alabileceğiz.
2. Tarihi Unix timestamp’a çevirme ve kontrolü
Bu adımımız da PHP’nin varsayılan olarak gelen 2 fonksiyonunu kullanacağız; strtotime ve is_numeric.
strtotime: Bu fonksiyon okunabilir tarih metinlerini sayısal değer olan Unix timestamp’a dönüştürmektedir. Eğer işlemdeki tarih geçerli ise fonksiyon tarihi unix timestamp olarak verecektir. Eğer tarih geçersiz ise FALSE değeri
dönecektir.
is_numeric: Bu fonksiyon sayesinde kontrolü yapılan tarihten timestamp gelip gelmediğini doğruluyoruz. Genel anlamda girilen değerin sayısal olup olmadığını kontrol etmektedir.
<?php
function tarihGecerlimi ($gelenTarih) {
$damga= strtotime($gelenTarih);
if (!is_numeric($damga))
{
return FALSE;
}
}
?>
Gördüğünüz gibi fonksiyonumuz yavaş yavaş gelişiyor. Bu adımda tarihi kontrol edip geçerli bir timestamp olup olmadığı öğrendik. Eğer geçersiz ise fonksiyonu durdurup FALSE değerini döndürdük.
3. Timestamp değerini ay, yıl ve günlere bölerek kontrol
Son bölümde diğer adımdan gelen $damga değerini PHP’nin tarih fonksiyonu ile ay, yıl ve gün olarak parçalayacağız ve PHP’nin diğer bir fonksiyonu olan checkdate ile doğrulayacağız.
<?php
function tarihGecerlimi ($gelenTarih) {
$damga= strtotime($gelenTarih);
if (!is_numeric($damga))
{
return FALSE;
}
$ay= date( 'm', $damga);
$gun= date( 'd', $damga);
$yil = date( 'Y', $damga);
if (checkdate($ay, $gun, $yil))
{
return TRUE;
}
return FALSE;
}
?>
Gördüğünüz gibi final kodumuzda tarihi parçalara ayırdık ve geçerli bir tarih ise TRUE geçersiz bir tarih ise FALSE değerini döndürdük. Böylelikle kısa bir kodlama ile okunabilir tarihlerin doğruluğunu kontrol etmiş olduk. Herhangi bir öneriniz veya istediğiniz varsa, ve hatta hata gördüyseniz yorum kısmında içinizi dökebilirsiniz.
etiketler: checkdate, date, geçerli, is_numeric, kontrol, Php, strtotime, tarih, tarihgeçerlimi
admin: 31 Temmuz 2010 | kategori: Html, Php, Programlama | yorum yok
Bir projenizde HTML dosyalarıyla işlem yapmanız gerektiğini düşünün. Kaynağı önemli değil, yerel veya uzak bir dosya olabilir, ya da anlık olarak oluşturulmuş bir html çıktısı olabilir. Bahsi geçen dosyadan veri çekmek, değiştirmek ve tekrar çıktı yapmak için regular expressions (düzenli ifadeler) her zaman için çözüm yolu değildir. Bu örneğimizde php kullanarak html dosyalarından nasıl veri çekileceğini göreceğiz.
1. Hazırlık
İlk yapmamız gereken şey Php Simple Html Dom Parser adlı kütüphane dosyasını bilgisayarımıza indirmek. İndireceğiniz zip dosyasında birkaç dosya var ancak asıl işimize yarayacak olan simple_html_dom.php, diğerleri örnekler ve yardım dosyaları.
2. Basit Örnekler
Kütüphanenin kullanımı oldukça kolay ancak yine de bazı basit işlevlerini incelemek ve mantığını kavramak gerekiyor.
Html Dosyasını Tanıtma
$html = new simple_html_dom();
// metin olarak tanıtma
$html->load('<html><body><p>Merhaba Dünya!</p><p>İşte ilk örneğimiz</p></body></html>');
// dosyadan tanıtma
$html->load_file('http://arsiv.microturk.net/');
Dosya tanıtma işleminizi örnekte olduğu gibi ister metin olarak isterseniz de dosya olarak yapabilirsiniz. Dosya olarak tanıtmanında seçenekleri mevcuttur. Dosya ister uzak bir sunucuda olabilir ya da kodumuzun çalıştığı yere sunucu da olabilir.
Not: load_file() fonksiyonunun uzak sunucudan dosya çekebilmesi için php.ini dosyasındaki “allow_url_fopen” değeri true olarak aktif olmalıdır.
Verilere Erişim
DOM nesnemizi oluşturduktan sonra find() fonksiyonunu kullanarak dosyamızda koleksiyonlarla işlem yapmaya başlayabiliriz. Koleksiyon seçiciler ile bulunan nesneler grubuna verilen addır. Kullanılan söz dizimi jQuery ile oldukça benzerlik göstermektedir o yüzden jQuery kullananlar için alışması hiçte zor olmayacaktır.
// HTML'i oluştur ve yükle
include('simple_html_dom.php');
$html = new simple_html_dom();
$html->load('<html><body><p>Merhaba Dünya!</p><p>İşte ilk örneğimiz</p></body></html>');
// ikinci paragrafı bulabilmek için "p" etiketini aratıyoruz
$element = $html->find("p");
//ikinci bulunan "p" etiketine ekleme yap
$element[1]->innertext .= " ve devamı da gelecek.";
echo $html->save();
2-4 paragrafları: Önceki örnekte de açıklandığı gibi dosyayı tanıtma ve yükleme işlemi.
7. paragraf: Dosyadaki tüm “p” etiketleri bulur ve 0′dan başlayarak bir array’a atama yapar.
10. paragraf: Bu satırda 2. bulunan “p” etiketine ekleme yapılıyor. Satırda kullanılan innertext işleci sayesinde bulunan nesnenin sadece metin kısmında işlem yapılır. Eğer outertext işlecini kullansaydık bulunan nesnedeki tüm etiketler de işleme alınacaktı.
Birkaç satır daha ekleyerek işlem yaptığımız 2. “p” etiketine class özelliği ekleyeceğiz.
$element[1]->class = "ornek";
echo $html->save();
Diğer Seçici Betikler
Aşağıdaki kullanabileceğiz bazı diğer seçici betikleri de veriyorum. jQuery kullanmışsanız ya da kullanıyorsanız eminim çok tanıdık gelecektir.
# ilk id="foo" nesnesini bul
$tekil= $html->find('#foo', 0);
# tüm class="foo" olan nesneleri bul
$koleksiyon= $html->find('.foo');
# dosyadaki tüm a etiketlerini bul
$koleksiyon= $html->find('a');
# h1 içinde yer alan tüm a etiketlerini bul
$koleksiyon= $html->find('h1 a');
# title özelliği "resimler" olan tüm img etiketlerini bul
$koleksiyon= $html->find('img[title=resimler]');
İlk örnekte 0 değerini vererek sadece ilk bulunan nesnenin işleme alınmasını sağladık. Diğer koleksiyonlarda ise tüm nesneler işleme alınıyor. Kütüphanenin kullanma kılavuzuna buradan erişebilirsiniz.

etiketler: allow_url_fopen, çekme, dom, find, Html, innertext, load_file, outertext, parser, Php, php ile veri okutma, php.ini, plaintext, simple, simple_html_dom, simple_html_dom.php, veri
admin: 30 Ağustos 2009 | kategori: Php | 5 yorum var
Birçok web yer sağlayıcı firma sunucularında dosya alım limitlerini her türlü yönden kısıtlarlar. Gerek upload ile gerekse yedek içe aktarımı özellikleriyle. Bu gibi durumlarda çok büyük MySQL yedeği olan biz kullanıcılar zor durumda kalırız ancak çözüm getirelemeyecek hiçbir sorun yoktur bu alemde.
Bu sorunu çözmek için kullanacağımız yöntem yedek dosyamızı ftp ile erişilebilir (mümkünde sadece sizin bildiğiniz bir klasör adı kullanın, örneğin: 1a2s3d4f) duruma getirerek bir script aracılığıyla parça parça girdi yapmaktır. Kullanacağımız script php ile yazılmış olan BigDump‘dır.
İlk olarak bigdump.php‘yi indirmemiz gerekiyor. Ardından bize sunulan panel üzerinden veritabanını oluşturup bigdump.php dosyasını biraz düzenlemeliyiz.
BigDump düzenlemesi:
bigdump.php‘yi herhangi bir metin editörü ile açtıktan sonra aşağıdaki satırları oluşturduğumuz veritabanı ve elimizdeki veritabanı yedeğine göre düzenlememiz gerekiyor.
$db_server = 'localhost'; //bu değer çok büyük ihtimalle localhost olarak kalacaktır ancak bazı firmalar MySQL için farklı sunucu kullandıkları için IP adresi girmeniz gerekebilir.
$db_name = 'vt_adi'; //bu değer oluşturduğunuz MySQL veritabanının adıdır.
$db_username = 'vt_kullanici';
$db_password = 'vt_kullanici_sifresi';//bu değerlerde MySQL veritabanına bağlanırken kullanacağımız kullanıcı erişim bilgileridir.
$filename = '1a2s3d4f/yedek.sql'; //bu değişkende bigdump.php dosyasının bulunduğu klasörde yer alan 1a2s3d4f klasörünün içinde yedek.sql dosyasını belirliyoruz. 1a2s3d4f gibi bir dosya adı kullanmamın nedeni yedek.sql dosyasına erişimin zorlaştırılmasıdır.
Diğer kısımlara müdahale etmedik. Ben sadece bu değişikleri yaparak bigdump.php dosyasını çalıştırdığımda Start Import linkini kullanarak sorunsuz şekilde aktarım sağladım.
UYARI: Aktarım işleminden sonra bigdump.php ve yedek.sql (örneğimizde) dosyalarını sunucu üzerinden siliniz.
Oluşabilecek sorunlar:
Karşılaştığım tek sorun olan satır boyutu yetersizliğinin üstesinden $linespersession = 3000; değerini yükselterek geldim. Ben 9999 yaptım ve sorunsuz şekilde devam etti. Eğer yetersiz olursa bu değerinde üstüne çıkabilirsiniz.
Eğer bunlar dışında bir sorun ile karşılaşıyorsanız yorum kısmında belirtebilirsiniz, elimden geldiğince yardımcı olmaya çalışırım.
etiketler: aktarım, bigdump, bigdump.php, içe, içeaktarım, import, mysql, Php, yedek
admin: 31 Temmuz 2009 | kategori: Php | 1 yorum var
Aslında bu örnekte php ile bir dosya indirmeyeceğiz, asıl amacımız varolan bir dosyanın direk indirilmesini engellemek ve dosya indirilirken bazı veritabanı işlemleri yapmak. İşlem sırasındaki dosyanın kendi sunucumuzda olması ya da dış bir sunucuda bulunması herhangi bir sorun teşkil etmez.
<?php
$site = "microturk.net";
$dosya = "http://www.microturk.net/dosyalar/deneme.zip";
$ref = @$HTTP_REFERER;
if (!stristr($ref,$site) == false) {
header("Location: $dosya");
} else {
echo "Bu dosya direk indirilemez. <a href=\"$dosya\">tikla</a>";
}
?>
Bu dosyadaki değişkenleri istediğiniz gibi değiştirerek tekrar kullanabilirsiniz. Örneğin $site değişkenini dosyanın indirme bağlantısının bulunduğu bağlantı ile değiştirin. Bu değişken ile ziyaretçinin direk mi geldiği yoksa farklı bir yol ile mi geldiği sınanmaktadır.
Örneğin bu dosyayı dosya.php şeklinde kaydettiğinizi varsayalım ve veritabanınızda bulunan dosyaları indirtmek için kullanacaksınız. Size örnek teşkil etmesi amacıyla şu yöntemi önerebilirim. Dosyaya bağlantı verirken indirtmek istediğiniz dosyanın veritabanındaki belirleyici bir değerini verebilirsiniz, bu genellikle id olur. Örnek olarak dosya.php?id=33. Ardından dosya içinden bu değeri $_GET['id'] ile çekebilir ve veritabanı fonksiyonlarınızı hazırlayarak çekebilirsiniz. Sonra edindiğiniz dosya özellikleri ile çıktıyı değiştirebilirsiniz. Belki de dosyanın kaç kez indirildiğini saymak için header işlecinden sonra veritabanına ekleme yapan bir kod eklersiniz kim bilir.
Bu yazı sadece bir yol göstericidir. Eğer takıldığını noktalar olursa yorum olarak belirtebilirsiniz. İşinize yaradıysa da yorum yazın, malum yorum blogcunun ekmeğidir 
etiketler: dosya, download, indirme, kod, örnek, Php, sayaç, upload
admin: 3 Haziran 2009 | kategori: Php, Projelerim | 12 yorum var
Bir önceki yazımda Windows sunucularda IIS üzerinden yayın yapan sitelerin php ile gelen mail() fonksiyonunu kullanma gibi bir sorunu olduğundan bahsetmiştim ve bu konuyu nasıl çözebileceğimizi göstermiştim. Bu işlemi Wordpress üzerinde uygulamak isteyenler tek tek Wordpress kodlarında düzenleme yapmak istemezler tahminimce. Zaten Wordpress mail göndermek için phpmailer kullanıyor, tek yapmamız gereken SMTP ayarlarını aktive eden ve host, port, kullanıcı adı ve şifre tanımlamalarını yapan bir eklemedir. İşte hazırladığım bu eklenti aynen bu işe yarıyor. Bu arada ilk eklentim oluyor kendileri.
Özellikleri
- Harici SMTP sunucusu üzerinden mail gönderebilme
- SMTP doğrulaması yaparak mail gönderebilme
- Mail gönderiminde SSL şifreleme
- Mail gönderiminde TLS şifreleme
- Gönderen adresini ayarlayabilme
- Gönderen adı olarak değer girebilme
- Değişik portları kullanabilme
Eklenti tek dosyadan oluşuyor; içinde ne ek bir dosya ne ek bir okubeni metni bulunuyor. Gerekli Javascriptleri falan hep tek bir dosyada derledim. Tek yapmanız gereken wp_smr.php dosyasını wp-content/plugins klasörine yüklemektir.
Kurulum bu kadar, şimdi sıra eklentiyi etkinleştirmekte ve gerekli ayarları girmekte. İlk olarak Wordpress yönetim panelimizdeki Eklentiler > Yüklü Eklentiler sayfasına gidip WPSMR yazan eklentiyi etkinleştirmeliyiz. Etkinleştirdikten sonra Wordpress Yönetim Panelindeki Ayarlar > Eposta sayfasına gitmeliyiz. Bu sayfada gerekli sunucu bilgilerini gireceğiz.
Gönderen Adı ve Adresi: bu kısım gönderilecek olan epostalarda from kısmında görünecektir. Eğer herhangi bir ayar girmezseniz wordpress@blogadresiniz.org şeklindeki adres üzerinden gönderilecek ve isim kısmında blog sahibinin ismi yazacaktır.
SMTP Ayarları: Eğer üstteki işaret kutularında SMTP seçili ise bu ayarları görebileceksiniz. Oradaki iki boşluktan ilkine mail.blogadresiniz.org tarzında bir smtp sunucusu girmelisiniz, bu örnekte olduğu gibi büyük ihtimalle mail. ile başlar ancak bazı durumlarda smtp. ile de başlayabiliyor. Diğer küçük boşluğa portu gireceksiniz ki bu da büyük ihtimalle 25′dir ancak bazı durumlarda 587 yada daha farklı birşey olabiliyor.
Şifreleme: Bu kısımda ister SSL ister TLS şifreleme seçebilirsiniz ya da hiç birşey seçmeden normal şifresiz gönderebilirsiniz. Benim önerim şifresiz gönderin.
Doğrulama: Bu seçenek sayesinde direk bir eposta adresi üzerinden yani sunucunun kök ateşleyicisini kullanmadan eposta gönderimi yapabilirsiniz. Bunu doldurabilmek için eposta hesabı oluşturmalısınız ve buradaki gerekli alanlara şifre ve kullanıcı adını girmelisiniz.
Tüm ayarları yaptıktan sonra “Ayarları Güncelle” tuşuyla kaydedin ve herşeyi eklentiye bırakın.
Sonuç
Bu eklenti sadece Wordpress’in iç mail fonksiyonunu tanımlanan değerlere göre düzenler ve SMTP sunucusunu kullanarak bildiri epostaları, yeni kullanıcı uyarısı vs. gibi mesajları sorunsuz bir şekilde göndermenizi sağlar. Kullanın.
etiketler: authentication, doğrulama, gonder, host, iis, mail, mailer, phpmailer, port, send, smtp, ssl, tls, windows, wordpress
admin: 31 Mayıs 2009 | kategori: Php | 20 yorum var
Bazı sunucular güvenlik nedeniyle php ile gelen mail() fonksiyonunu engellerler. Bu durum spam’e engel olmak ya da sunucu üzerine binen yükü azaltmak için konulmuş olabilir. Her neyse, bizim yapmaya çalıştığımız smtp sunucusu üzerinden bir hesap kullanarak php ile mail göndermektir. Bu konuda bahsedeceğim ek fonksiyon ile mailleri php ile smtp üzerinden gönderebilirsiniz: phpmailer. İsterseniz ek olarak ssl kullanarak mailleri şifreleyebilirsiniz.
Mail formunuzu hazırladğınızı ve formun action kısmındaki php dosyasında olduğunu varsayarak;
require_once("class.phpmailer.php");
$mail = new PHPMailer(); //nesneyi oluşturuyoruz
$mail->IsSMTP(); //smtp kullanmak için
$mail->Host = "mail.microturk.net"; //mail sunucunuz
$mail->Port = 587; //25. portta olabilir
$mail->SMTPAuth = true; //onayı aktive ediyoruz
$mail->Username = "posta@microturk.net"; //kullanılacak eposta adresi
$mail->Password = "micromicrobaba"; //şifre
$mail->From = $_POST['eposta']; //formdan gelen mail adresi
$mail->Fromname = $_POST['isim']; //formdan gelen isim
$mail->AddAddress("ataturk@microturk.net","Mustafa Kemal Atatürk");
$mail->Subject = $_POST['konu']; //formdan gelen konu
$mail->Body = $_POST['mesaj']; //formdan gelen mesaj
if(!$mail->Send())
{
echo 'Gönderim Hatası: ' . $mail->ErrorInfo;
exit;
}
echo 'Mesaj başarıyla gönderildi';
Eğer hazır örneği görmek istiyorsanız bu sayfayı, bilgisayarınıza indirerek kendinize göre düzenlemek için bu sayfayı ziyaret edin.
etiketler: authentication, mail, onay, Php, phpmailer, smtp
admin: 24 Mayıs 2009 | kategori: Bloglama, Php | 27 yorum var
Uzun süredir dandik firmalardan ucuz diye hosting alıyordum ve malumunuz uptime yerlerde sürünüyordu. En sonunda Natro‘dan bir hosting paketi sahibi oldum ve blogumu oraya taşımaya başladım. Sunucular Windows olduğundan ve IIS üzerinde çalıştığından kalıcı bağlantılar içinde index.php olmadan çalışmıyordu. http://www.microturk.net/index.php/yazi-basligi şeklinde olması gerekiyordu. Bunu düzeltebilecek ve sanki .htaccess kullanıyormuş gibi kalıcı bağlantıları düzgün kullanmamı sağlayacak bir çözüm yolu aramaya başladım.
Mantık şu: index.php olmadan sayfalar 404 hatası vereceği için bunu kullanabiliriz. Yani eğer 404 sayfasına gelen url’deki gerekli bilgileri alıp 404 sayfasına doğru bir şekilde include edebilirsek istediğimiz sayfayı görüntüleyebiliriz. Bu durumda aslında hata sayfasında olacağız ancak gelen çıktı tam istediğimiz şey olacak.
İlk olarak emin olmamız gereken husulardan biri Hosting firmanız hata sayfalarına URL yönlendirme imkanı veriyor mu onu kontrol etmek olmalı. Kendime göre anlatıyorum; Natronun bana sunduğu Hosting panelinde “Web Sitesi Yönetimi” sekmesinde “Hata Sayfaları”nı düzenleyip istersem bir URL’e yönlendirebiliyorum. Bu sayfayı kullanarak bir sonraki adımda ftp’den aktararak 404 sayfalarını yönlendireceğim sayfayı belirliyorum. Ben dosya adı olarak wp-seo-link-holder.php belirledim. Ardından bu dosyayı bilgisayarımda oluşturum içine aşağıdaki kodları ekleyerek ftp’den Wordpress ana dizinine aktardım.
<?php
$gelenVeri = $_SERVER['QUERY_STRING'];
$_SERVER['REQUEST_URI'] = substr($gelenVeri, strpos($gelenVeri, ':80')+3);
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
include('index.php');
?>
Şimdi sırada Wordpress ayarlarından kalıcı bağlantıları istediğimize göre düzenelemek var.
index.php/%category%/%postname%
yerine artık
/%category%/%postname%
yazabiliriz.
etiketler: bağlantı, kalıcı, link, Php, seo, wordpress
admin: 2 Şubat 2008 | kategori: Php | yorum yok
Bu yazıda bahsedeceğim fonksiyonu oluşturabilmek için biraz kafa patlattım. Kısa gibi görünebilir ama aklıma gelen yolun işe yarar olduğunu düşünüyorum. Başkalarınında işini görmesi için algoritmayı anlatarak kodu vereceğim.
İlk olarak örnek bir dosya url’i belirliyorum. Örn: http://www.microturk.net/dosya_klasoru/dosyanin_ta_kendisi.zip
İlk olarak url’yi ters çevireceğim ki sonda bulunan dosyaya daha kolay erişebilelim. Daha sonra ters çevirilmiş url’deki ilk / işaretini aratacağım ve bulunduğu konumun sayısal sırasını alacağım. Url’i tekrar ters çevirip tüm url’in uzunluğunu alacağım. Ardından elde ettiğim url uzunluğundan url’nin ters olduğu zaman aldığım ilk / işareti konumunu çıkaracağım. Böylelikle dosya adına kadar olan bölümün uzunluğunu bulmuş olacağız. Son olarakta url’yi bulduğumuz uzunluğa kadar keseceğiz. Dosya adını elde ettik.
function dosya_adi($url)
{
if ($url)
{
$url = strrev($url);
$konum = strpos($url,'/');
$konum = strlen($url) - $konum;
$url = strrev($url);
$dosya_adi = substr($url,$konum);
return $dosya_adi;
}
}
Umarım işinize yarar.