Php etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Php etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

16 Nisan 2020

PHP short tag hatası düzeltilmesi

Bildiğiniz gibi sunucu ayarlarında short_tag ayarı açıksa php kodları <?php yerine <? imi ile başlayacak şekilde de çalışıtırılabiliyor. Ancak gerek standartlara uyum açısından gerek sunucu ayarlarında bu ayarın açık olmadığı durumlarda sorun yaşamamak için kısa kullanım yerine standart php imi kullanmanızı tavsiye ederim.

Kullandığınız kod düzenleyicide bul ve değiştir (find & replace) özelliği varsa bu tür durumlarda düzeltme yapabilirsiniz.

Ben Netbeans IDE kullanıyorum ve netbeans ile pratik bir şekilde bu değişikliği nasıl yapaleceğinizi tarif edeceğim.

Öncelikle düzenleme yapmak istediğiniz netbeans projesini açın ve tarafta proje ismini seçin. Bu şekilde replace işlemi için bir kapsam seçmiş oluyoruz. Benzer şekilde soldaki Files kısmından projenizin php kodları bulunan ana dizinini yada isterseniz bir alt dizini de seçebilirsiniz.

Daha sonra klavyede Ctrl H tuşlarına basarak replace işlemine ait pencereyi açın.
Containing Text yazan alana şunu yazın:

<\?( )*(?!php)(?!=)(?!xml)(?!mso)

Replace With alanına ise şunu yazın:

<?php 

Replace with alanına girdiğiniz <?php metni sonuna bir boşluk eklemeyi unutmayın. 

Eşleşme türünün seçildiği Match seçeneğini de Regular Expression olarak seçin.

İsterseniz File Name Patterns alanına da sadece php dosyalarında düzenleme yapmak için *.php girebilirsiniz.



Bu girişleri yaptıktan sonra Continue düğmesine basın. Bunun ardından netbeans değiştirme yapılacak eşleştirmeleri arayıp listeleyecektir. Aşağıdaki gibi bir sonuç ekranı görürsünüz:



Sonuç penceresinin alt tarafından "Replace ... matches" şeklinde kaç adet eşleşme varsa tümünü değiştirmek için bir düğme vardır. Tüm dönüştürme işlemlerini uygulamak için o düğmeyi tıklayın. Bunu yaptığınızda eşleşme olan tüm kodlar standart php açılış imi ile değiştirilecektir.

Bu sayede projenizdeki tüm kısa türde php başlangıç imi kodlarını standart php başlangıç imiyle değiştirmiş olacaksınız.

6 Nisan 2020

Aynı sunucuda PHP 7.2 ve PHP 5.6 birlikte kurulumu

Yerelde çalıştırmam gereken bir proje için güncel php sürümü 7.2 haricinde daha eski bir sürüme de ihtiyacım oldu. Bu nedenle araştırma yaparken internette şu yazıyı buldum.

https://devanswers.co/run-multiple-php-versions-on-apache/

Sayfadaki talimatları uyguladım ve düşük sürüm php gerektiren proje için php 5.6 ile çalışabilir hale getirdim. Sayfadaki yöntemlerden siteye ait sürüm seçimi için htaccess yöntemini uyguladım.

7 Ocak 2020

Web site yönetim paneli yazılımı

Web sitesi yönetimi özellikle de tamamen kontrolü elinde bulundurmak istediğiniz özel bir cms sahibi olmak istediğiniz zamanlarda karmaşık hale gelebilir. Bir web yazılımcı olarak kendi geliştirdiğim web site yönetim paneli yazılımını kullanıyorum ve bu şekilde şimdiye kadar birçok müşterim için ihtiyaçlar doğrultusunda web site yönetim ihtiyacını karşılayacak şekilde özel bir yönetim paneli geliştirme konusunda hizmet sağlıyorum. Bazı müşterilerim beğendikleri hazır bir tema kullanmayı tercih ederken bazı müşterilerim ise özel bir tasarım yaptırmayı tercih ediyorlar. Her iki durumda da arayüzün bana teslim edilmesiyle birlikte müşteri ihtiyaçlarını analiz ederek kullanımı kolay ve pratik bir şekilde web sitesine ait içeriklerin ve verilerin yönetilebileceği bir yönetim paneli hazırlayıp ön yüz yazılımını da yaparak müşterilerime teslim ediyorum.

Aşağıdaki videoda yönetim paneli yazılımının kullanıldığı örnek kullanımı izleyebilirsiniz. Bu sadece örnek bir proje olup yönetim paneli yazılımında müşterilerime daha farklı türlerdeki içerik ve veri yönetimini yapabilecekleri şekilde yönetim alanları mevcuttur ve her projeye göre özel olarak ayarlanmaktadır.

Eğer siz de web sitesi projeniz için yönetim paneli sahibi olmak ve statik web sitesinizi yönetim panelli dinamik bir web sitesi haline getirmek yada beğendiğiniz bir tema ile yeni bir web sitesi sahibi olmak yada sitenizi yenilemek isterseniz yandaki iletişim formu ile bana ulaşabilir ve teklif alabilirsiniz.


Website admin panel

20 Eylül 2015

Web siteniz için yönetim paneli

Serbest (freelance) olarak geliştirdiğim projelerde içerik yönetiminin sağlanması için kendi geliştirdiğim bir yönetim paneli modülünü kullanıyorum. Altyapı olarak yine kendime ait bir mvc tabanlı php framework ile çalışan bu yönetim paneli ile site sahiplerine web sitelerinin içeriğini yönetme konusunda gerekli imkanları sağlıyorum. Kolay kullanımlı ve pratik bir çalışma şekline sahip olan yönetim panelinde menü üzerinde sitenizin içeriğini yönetmeniz için ihtiyaç duyulan yönetim alanlarını ekleyerek müşteri hangi alanlarda kontrol sahibi olmak istiyorsa web sitesinde istediği alanlarda yönetim panelinden kontrol edilecek şekilde yönetim paneli kısmını ve ön yüz yazılımını hazırlayarak dinamik bir web sitesi haline getiriyorum.

İstenirse sitenin mevcut tasarımı korunarak yeni bir altyapı ve yazılım ile yönetim paneli de eklenerek çalışır hale getiriyorum. Eğer yeni bir arayüz ve tasarım isterseniz istenen arayüzün bana teslim edilmesi halinde bu tasarım arayüzünü kullanarak yeni görünümlü web sitesini yine aynı şekilde yönetim paneli de dahil olarak geliştirip müşteriye teslim ediyorum.

Eğer siz de statik sayfalardan oluşan web siteniz için yönetim paneli kontrolünü elde etmek isterseniz yada size sürekli olarak sorun çıkaran ve hatalı çalışan mevcut altyapıdan/yazılımdan memnun değilseniz projeniz için teklif isteyebilirsiniz. Bunun için destek [at] eezgu.com email adresini kullanabilir yada web sitemin iletişim sayfasındaki form ile bana ulaşabilirsiniz:
http://www.eezgu.com/contact

Yönetim paneli hakkında daha detaylı bilgiye ulaşmak için ise aşağıdaki sayfada geliştirdiğim yönetim paneli modülü hakkında açıklamalar bulabilirsiniz:
http://www.eezgu.com/website-admin-panel

13 Temmuz 2013

Php.net yeni tasarım

Php.net yeni tasarımına beta sürüm olarak geçmeye başlamış. Siteye girildiğinde isteğe bağlı olarak yeni sürüme geçilebiliyor. Yeni tasarımda renkler eskisiyle benzer şekilde ancak görünüm daha modern hale getirilmiş. Kullanışlılık açısından da yenilikler yapılmış.

23 Nisan 2012

Web tabanlı mysql veritabanı yönetim aracı

Bir süredir mysql için kullandığım bir web tabanlı veritabanı yönetim aracından bahsetmek istiyorum. Bu yazılım iki farklı isimle geçiyor: Adminer yada phpminadmin. www.adminer.org adresinden ulaşabilirsiniz. Bu yazılım php ile kodlanmış ve phpmyadmin ile benzer işlevlere sahip ancak tek dosya halinde paketlenmiş olarak kullanma imkanı ile işinizi kolaylaştıracaktır. Sunucuya yaklaşık 160kb - 200kb kadar tek bir dosya atarak tüm veritabanı yönetim işlemlerini yapabiliyorsunuz. Mysql dışında farklı veritabanı türlerini destekleyen şekilde de indirip kullanabilirsiniz. Mysql için tablo ve kayıt ekleme, düzenleme, arama gibi temel işlemler yanında yabancı foreign key tanımları, index, trigger, view, procedure, function, event gibi mysql özelliklerini/işlevlerini eklemeye - düzenlemeye izin veren pratik bir araç adminer. Ayrıca yedekleme özelliği de gayet kullanışlı. Bunun dışında bağımsız olarak sorgulama da yapabiliyorsunuz. Daha fazla bilgi almak ve adminer paketini indirmek için www.adminer.org adresini ziyaret edebilirsiniz.

14 Şubat 2012

Memcache kullanım örneği

Ram tabanlı bir önbellek sistemi olan Memcache için basit bir kullanım örneği:

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die("Could not connect");

$version = $memcache->getVersion();
echo "Server's version: " . $version . "
\n"; if (!($tmp_object = $memcache->get('tmp_object'))) { $tmp_object = new stdClass; $tmp_object->str_attr = 'test'; $tmp_object->int_attr = 123; $tmp_object->datetime = date('Y-m-d H:i:s'); echo "Store data in the cache (data will expire in 10 seconds)
\n"; $memcache->set('tmp_object', $tmp_object, false, 10) or die("Failed to save data at the server"); } echo '
' . print_r($tmp_object, 1) . '
';

7 Ocak 2012

Php short open tag sorunu ve çözümü

Bildiğiniz gibi Php dilinde açılış imi olarak standart kullanım <?php şeklinde olmakla birlikte bunun yerine çoğu zaman kısaca <?  şeklinde de yazabilirsiniz ancak bunun için sunucudaki short_open_tag ayarının açık olması gerekiyor. Linux sunucularda muhtemelen bu ayar açık olur ancak windows sunucularda sorun yaşabilirsiniz. Bu sorundan kurtulmak için ya short_open_tag ayarını php.ini ayarlarından açmanız yada kodunuzdaki tüm <? kısımlarını <?php ile değiştirmeniz gerekir. Açılış imi yanında ayrıca  <?='Deneme'?> şeklindeki kısa echo ifadeleri de cabası. Geçenlerde bu sorunla karşılaşıp kodların tamamında düzeltme yapmam gerekti ve bunun için pratik bir çözüm aradım. İnternette bulduğum bazı kodlardan yararlanarak bir PHP konsol komutu oluşturdum. Bu komut ile input dizininde bulunan tüm dosyaları tarayıp kısa imleri normal imlere dönüştürüyor. Yazdığım araç tokenizer işlevlerini kullanıyor. Eğer phpinfo() komutu çıktısında tokenizer başlığı altında Tokenizer Support değeri enabled ise o zaman bu kod sunucunuzda çalışır. Buraya tıklayarak dosyayı indirebilirsiniz. Kullanmak için arşivi açtıktan sonra sunucunuzda bir dizine kopyalayıp. output dizinine yazma yetkisi verdikten sonra input dizinine düzeltmek istediğiniz php dosya/dizinlerini kopyalayıp ardından komut isteminden şu komutu çalıştırın:
php convert_short_tags.php

Bu komutu çalıştırınca input dizinindeki kodlardaki short tag türü php imleri normal hale getirilip çıktılar output dizininde oluşturulacaktır.

15 Mart 2011

Türkiye il ilçe tabloları (mysql)

Daha önce Türkiye il ilçe veritabanına ihtiyacım olduğunda ve hazır olarak bulamayınca bu veritabanı için tablolar oluşturan bir kod yazmıştım php kullanarak. Belki başkalarının da işine yarayabilir diye burada paylaşmak istedim. Bu basit program PTT sitesinden indirilen xls dosyasının csv olarak kaydedilmesinin ardından bu listeyle mysql tabloları için sql dosyası oluşturuyor. PTT sitesinde ilgili dosyayı şu adreste bulabilirsiniz:
http://www.ptt.gov.tr/tr/interaktif/PK.zip

Php kodlarını ve veritabanı tablolarını içeren dosyayı indirmek için şu adresi kullanabilirsiniz:

https://dl.dropbox.com/u/67553961/il_ilce.zip

Paket içinde php script tarafından oluşturulan mysql dosyası da bulunmakta. Ayrıca Ptt sitesinden güncel listeyi alarak tekrar sql oluşturabilirsiniz.

19 Ağustos 2010

PHP hata gösterimini açmak

Eğer sunucunuzda hata mesajlarını göremiyorsanız display_errors ayarı kapalı olabilir. Bu durumda şu şekilde display_errors ayarını açabilirsiniz:
[bash]
cd /etc/php5/apache2
gksudo gedit php.ini
[/bash]
php.ini dosyasını açtıktan sonra şu satırı bulun:
[bash]
display_errors = Off
[/bash]
Off yerine On yazarak dosyayı kaydedin ve apache sunucusunu tekrar başlatın.
[bash]
sudo /etc/init.d/apache2 restart
[/bash]

13 Nisan 2010

(Php) Metin özetlerinde Türkçe karakter problemi

Son zamanlarda birçok web sitesinde anasayfadaki alt sayfalara ait içeriklerin özetinin gösterildiği yerlerde kısaltılmış (özet) metin oluşturulurken bazen Türkçe karakterlerin hatalı göründüğünü farkettim. Hatta bu hatayı çok meşhur olan ve çok sayıda ziyaretçisi olan sitelerde bile görüyorum.

Bu hatanın nedeni Türkçe karakterlerin multibyte türü karakterler içermesidir. Yani tek bir harf birden fazla byte ile temsil ediliyor. Eğer kesme işleminin yapıldığı nokta tam da bu byteların arasına denk geliyorsa o zaman özetteki son karakter garip bir şekilde görünüyor. Bu sorunun nedeni kısaltma işlemi için yanlış işlevlerin kullanılmasıdır. Örneğin Türkçe karakter içeren bir metinde kısaltma yaparken substr() işlevi yerine mb_substr() işlevini kullanırsak böyle bir sorunla karşılaşmayız. Bu işlevle ilgili detaylı bilgiye http://tr.php.net/manual/tr/function.mb-substr.php adresinden ulaşabilirsiniz. Metin türünde veriler üzerinde  buna benzer şekilde işlemler yapan neredeyse her php işlevine karşılık mb_ ile başlayan bir multibyte işlev vardır. Bu şekilde Türkçe karakterlerin sorun çıkardığı yerlerde benzer hatalarla karşılaşmayız.

15 Ocak 2010

PHP kodlarını korumak / şifrelemek

Php dili hepinizin bildiği gibi derlenmeyen yani betiksel olarak çalışan bir dil. Bu yüzden php ile geliştirilen bir yazılım resmi olarak olmasa da aslında açık kaynaktır. Eğer yaptığınız yazılımın başkaları tarafından incelenmesini, düzenlenmesini yada kopyalanması istemiyorsanız bir şekilde kodlarınızı korumanız gerekmektedir. Bunu sağlamanın en mantıksal yolu kodlarınızı kendinize ait sunucunuzda barındırmak olsa da bu yöntem çoğu programcı için uygun değildir. Ayrıca bazı durumlarda yazılımı başkasına teslim etmeniz gerekebilir. Buna bir örnek olarak yazılımınızı bir yada birçok müşteriye satma durumu verilebilir.

Piyasada php kodlarını derlediğini iddia eden birçok yazılım mevcut. Aslında bu derleme normal bir derleme işlemi değil. Bu işlem aslında kaynak kodları bytecode haline getirmektir.

Bu amaçla kullanılan yazılımların sayısı oldukça fazla. Bunların bir kısmı sunucuya bir eklenti kurulmasını gerektirmektedir. Herhangi bir kurulum gerektirmeden çalışacak şekilde kod dönüşümü yapan yazılımlar da mevcut ancak bu yöntem muhtemelen yazılımınızın hızını düşürecektir çünkü kodları asıl haline getirmek için bir ters şifreleme işlemi gereklidir.

Araştırmalarıma göre piyasada bu konuda en iddialı ve en yaygın olarak kullanılan iki yazılım var. Bunlardan biri Zend Guard, diğeri ise Ioncube Encoder. Günümüzde neredeyse bütün web sunucularında bu iki yazılım için çalıştırma ortamı eklentileri kurulu durumda. Bu yazıyı yazdığım sırada bu iki yazılımın fiyatları şu şekildeydi:

Zend Guard: $600
Ioncube Encoder: $199(Basic) , $299 (Pro) , $379 (Cerberus)

Zend guard 'ın fiyatı 1 yıllık kullanım içindir ve kullanmaya devam etmek için her sene bu ücreti tekrar ödemeniz gerekiyor.

Ioncube Encoder için ise ücret bir defa ödeniyor ve 1 yıllık güncelleme ve destek hizmeti ücretsiz olarak ürüne dahil oluyor. Bu süre bitiminde 2 hafta içinde daha düşük bir ücret ödeyerek süreyi uzatabiliyorsunuz.

Benim googleda araştırmalarıma göre Ioncube kalite olarak çok iyi ve arama sonuçlarında gördüğüm kadarıyla bu yazılımla korunan kaynak kodlar diğer ürünlere göre daha sağlam bir şekilde korunuyor. Ayrıca günümüzde neredeyse bir standart olarak bütün sunucularda Ioncube desteği mevcut.

Ioncube için farklı özelliklere sahip 3 sürüm var. Bunlar Basic, Pro ve Cerberus sürümleri. Bu sürümlerin karşılaştırmasını şu adreste görebilirsiniz:
http://www.ioncube.com/sa_encoder.php?page=pricing

Farklarını kısaca açıklamak gerekirse Basic (Entry Level) sürümü ile kodlarınızı incelenmeye ve düzenlenmeye karşı koruyabilirsiniz ancak bu durumda kodlar kopyalanmaya karşı korumasızdır. Pro sürümünde buna ek olarak zaman aşımı, ip ve alanadına göre kısıtlama getirmek üzere lisans dosyası oluşturarak kodlarınızın sadece istediğiniz sitede / istediğiniz süre boyunca kullanılabilmesini sağlayabilirsiniz. Cerberus sürümünde ise Pro sürümündeki özelliklerle birlikte yazılımın çalışacağı makinenin MAC adresine göre kısıtlama getirmenize olanak sağlıyor.

Bu özelliklere göre özel bir projeye ait kodları korumak yada yazılımdaki parola gibi hassas verileri korumak için basic sürümü yeterli olabilir. Yazılımın kopyalarının ticari olarak satılması amacı için ise Pro sürümü uygun olacaktır. Cerberus sürümü ise sadece makine bazlı kısıtlama gerektiren özel durumlarda gerekli olacaktır.

Ben daha önce Basic sürümünü denedim ve memnun kaldım. Ücretsiz olarak indirip kullanılabilen Ioncube Loader modülünü yerel sunucumda kurdum ve kodların sorunsuz olarak çalıştığını gördüm. Ancak daha yüksek güvenlik sağlayan obfuscation (kod karıştırma) seçeneğini kullanmak herhangi bir işlev adının kod içinde string olarak kaydedildiği durumlarda bazı yazılımlarda uygun olmayabiliyor. Ancak bu seçeneği kullanmak zorunlu değil. Yerel makinem dışında kullandığım web sunucusunda da ioncube ile kodlanmış yazılım için deneme yaptım ve yine sorunsuz olarak çalıştığını gördüm. Deneme sürümü iki haftalık kullanım sağlıyor ve deneme sürümü kullanılarak kodlanmış yazılım ise yanlış hatırlamıyorsam üç gün boyunca kullanılabiliyor.

Sonuç olarak Php gibi betiksel bir dil kullanarak ticari yazılım geliştiren yada yaptığı yazılımları korumak isteyen her geliştirici için Ioncube makul bir tercih olacaktır. Profesyonel web geliştirme amacıyla verilecek 200-300 $ gibi bir ücret bu sistemin faydası dikkate alındığında bence çok fazla bir ücret değil.

http://www.ioncube.com

5 Aralık 2008

Xml verisini diziye dönüştürmek

Geçenlerde yazdığım bir XML dönüştürme sınıfını sizlerle paylaşmak istiyorum. Bu sınıf ile xml verisini parametre olarak kullanarak ağaç yapısında bir dizi elde edebilirsiniz.

XML Parser (XML to array) : http://www.phpclasses.org/browse/package/4954.html

Bu sınıfı kullanırken xml verisini iki şekilde aktarabilirsiniz:

  1. XML verisini yapılandırıcı parametresi olarak kullanıp ardından parse() işlevini çağırarak:
    [php]
    $parser = new XmlParser($xml_input);
    $result = $parser-&gt;parse();
    [/php]

  2. Sınıfı parametresiz oluşturup parse() işlevine parametre olarak xml verisini aktararak:
    [php]
    $parser = new XmlParser();
    $result = $parser->parse($xml_input);
    [/php]


Elbette bu sınıfın hataları, eksikleri olabilir. Hata/eksiklik vs. bulduğunuzda bana bildirebilirsiniz.

11 Kasım 2008

Doğrusal diziyi ağaç yapısına dönüştürme

Php gibi sunucu taraflı dillerin ilk ortaya çıkan kullanım alanları muhtemelen form verilerini işlemektir. Bunlara iletişim formları ve çeşitli kayıt formlarını örnek verebiliriz. Ancak formların kullanımı bunlarla sınırlı değildir. Karmaşık veri yapılarını oluşturmak üzere kullanıcıdan giriş kabul etmek amacıyla da form girişi istenebilir. Böyle durumlarda karşılaşabileceğiniz bir sorun doğrusal bir dizi olarak elde ettiğiniz veriyi ($_POST, $_GET, $_REQUEST dizileri) kullanmak için önce bu diziyi yapısal bir halde sınıflandırmaktır. Özellikle kullanıcının giriş yapacağı formda javascript ile yeni alanlar eklemesine izin verecekseniz bu dizi daha da uzun ve karmaşık bir hal alacaktır. Bu sorunla başa çıkmayı kolaylaştırmak üzere bir işlev yazmaya karar verdim:
[php]
function array2tree($arr,$seperator='-&gt;')
{
$arr2 = array();
foreach($arr as $key=&gt;$value){
$root = &amp;$arr2;
$levels = explode($seperator,$key);
$n = count($levels);
$i = 0; foreach($levels as $level){
$i++;
if( !isset($root[$level])){ //seviye daha önceden tanımlı değilse
if($i==$n)//hedef seviye ise değeri aktar
$root[$level]=$value;
else //hedef seviye değilse dizi olarak tanımla
$root[$level]=array();
}
$root = &amp;$root[$level];
}}
return $arr2;
}
[/php]
Bu işlev, adından da tahmin edeceğiniz gibi doğrusal olarak verilen bir diziyi yapısal bir dizi halinde dönüyor. Ancak bu işlevi kullanmak için dizinizdeki elemanların sayısal değil ilişkisel indisli (associative array) olması gerekiyor. Eğer bu işlevi giriş paragrafında açıkladığım örnekteki gibi form verisi üzerinde kullanacaksanız zaten bu koşulu sağlamış olursunuz. Bu durumda dizimizin anahtar değerleri formdaki name değerleri olacaktır. Örnek olarak aşağıdaki şekilde bir $_POST verimiz olduğunu varsayalım.
[php]
$_POST = array(
"type"=&gt;"list",
"children-&gt;child1-&gt;name"=&gt;"eleman 1",
"children-&gt;child1-&gt;value"=&gt;12,
"children-&gt;child2-&gt;name"=&gt;"eleman 2",
"children-&gt;child2-&gt;value"=&gt;56
);
[/php]
Anahtar değerlerine yani form elemanlarının isimlerine dikkat edin. İsimlendirme yapılırken bazı elemanlarda -> ayracının kullanıldığını görürsünüz. Şimdi bu dizi üzerinde array2tree işlevini çalıştıralım ve sonucu print_r işlevi ile gösterelim:
print_r( array2tree( $_POST ) );

Bu çağrıyı yaptığınızda aşağıdaki sonucu elde edersiniz. İsimleri -> ayracı ile ayrılan elemanların alt öğeler haline geldiğini görüyorsunuz. children->child2->value elemanı children dizisi içindeki child2 dizisinin value elemanına dönüşmüştür. İşlevde varsayılan ayraç olarak -> kullanıldı ancak ikinci parametreyi kullanarak istediğiniz ayracı kullanabilirsiniz.
Array(   [type] => list   [children] => Array   (       [child1] => Array           (               [name] => eleman 1               [value] => 12           )       [child2] => Array           (               [name] => eleman 2               [value] => 56           )   ))

2 Kasım 2008

Php ile Javascript arasında veri aktarımı

Daha önce bir yazımda json veri yapısından bahsetmiştim. Bu yazımda da php ile javascript arasında bilgi aktarımının nasıl yapılabileceğini bir örnekle açıklamaya çalışacağım. Önce javascriptdeki nesne yapısından bahsedeyim. Javascriptte bir nesne şu şekilde tanımlanabilir:


obj = new Object;

Şimdi de bu nesneye bazı öğeler ekleyelim:


obj.x = 1;
obj.y = 2;

Bu iki ifadeyle nesnemize x ve y adlarında iki değişken eklemiş olduk. Bu örnekte sınıf kullanmadan sadece veri içeren bir nesne oluşturmuş olduk. (Konumuz veri aktarımı olduğu için şimdilik bununla yetiniyorum. Ama tabiki işlevler içeren bir nesne de oluşturabilirsiniz.).

Oluşturduğumuz bu nesneyi Object kelimesini kullanmadan da oluşturabiliriz:


obj = {"x":1,"y":2};

Tanıdık geldi mi? Bu tanımlama aynı nesnenin daha önce bahsettiğim json yapısı ile tanımlanmış halidir. Zaten json kelimesinin açılımı javascript object notation yani javascript nesne gösterimi demektir. Aşağıdaki gibi bir kodla deneme yapabilirsiniz:


obj = {"x":1,"y":2};
alert( "obj.x="+obj.x );
alert( "obj.y="+obj.y );

Bu kod obj nesnesinin x ve y elemanlarını uyarı vererek bildirecektir. İlk gösterdiğim yöntemdeki gibi her eleman için teker teker atama yapmak yerine json tanımlamasını kullanarak nesne oluşturmanın daha kolay olduğunu görüyorsunuz.

Şimdi asıl meselemiz olan php ile javascript arasında veri aktarımına geçebiliriz. Bunun için php 5.2 sürümünden itibaren kurulum gerektirmeden kullanılabilen json_encode ve json_decode işlevlerini kullanabiliriz. Bu işlevler adlarından tahmin edeceğiniz gibi sırasıyla veriyi json biçiminde kodlayan ve kodlanmış halini php veri yapısına çeviren işlevlerdir. json_decode işlevinin kullanımına bir örnek verelim:

$json_data = '{"x":1,"y":2}';
$php_data = json_decode($json_data);
print_r($php_data);

Burada basitçe json verimizi bir değişkene atayıp json_decode işlevini uygulayarak elde ettiğimiz veriyi (nesneyi) print_r ile yazdırıyoruz. Bunun sonunda şu çıktıyı elde ederiz:

stdClass Object
(
[x] => 1
[y] => 2
)

Tahmin edeceğimiz gibi standart bir php nesnesi elde ettik. Sınıfın türü hariç aynı sonucu veren bir php kodu şu şekilde olur:

class Obj{
var $x=1;
var $y=2;
}
$obj = new Obj();
print_r($obj);

Bunun çıktısı da yukarıdaki gibi olur ancak nesnemiz kendi tanımladığımız Obj sınıfından oluşturulduğu için stdClass yerine Obj adını görürsünüz.

Hazır gelmişken bu kez de tersten gidelim ve oluşturduğumuz bu Obj nesnesini json_encode ile kodlayarak bir json çıktısı elde edelim:

class Obj{
var $x=1;
var $y=2;
}
$obj = new Obj();
$json_data = json_encode($obj);
echo $json_data;

Bu kodu çalıştırarak en baştaki javascript kodumuzda obj nesnesini oluştururken kullandığımız json nesnesini elde ederiz:

{"x":1,"y":2}

Artık json dönüşümlerinin nasıl yapıldığını biliyorsunuz. Ancak hala php ve javascript arasında nasıl veri aktarımı yapılacağından bahsetmedik. Aslında bunun nasıl yapılacağı sizin ihtiyaçlarınıza ve aktarımın hangi yönde (php 'den javascript 'e yada javascript 'den php 'ye ) olacağına bağlıdır. Önce php'den javascript'e yapılan bir aktarım örneği verelim:

<?
$php_data_1 = array( 'a',1,'php','json',2008 );
$php_data_2 = array( 'a'=>1, 'b'=>2, 'c'=>'php', 'd'=>'javascript' );

$json_data_1 = json_encode($php_data_1);
$json_data_2 = json_encode($php_data_2);
?>
<script type="text/javascript">
var nesne_1 = <?=$json_data_1?> ;
var nesne_2 = <?=$json_data_2?> ;
</script>

Bu kodun çıktısı şöyle olur:
var nesne_1 = ["a",1,"php","json",2008] ;
var nesne_2 = {"a":1,"b":2,"c":"php","d":"javascript"} ;

Bu örnekte php tarafında iki adet dizi tanımladık ve bunları json_encode ile kodlayarak javascript kodumuzdaki javascript değişkenlerine atama yapılacak şekilde kullandık. Burada fark edeceğiniz gibi birinci json verisi bir dizidir (öğeler köşeli parantezler içinde) ancak ikincisi nesnedir (öğeler küme parantezleri içinde). Bunun nedeni php'deki array verisinin isimli anahtar değerlerinden oluşması halinde (associative array) aslında bir çeşit nesne olmasıdır. Yani herhangi bir sınıftan türetmediğimiz halde ikinci dizimiz aslında bir nesnedir.

Yukarıdaki örnekte php ile tanımladığımız veriyi javascript koduna aktarmış olduk. Şimdi de bunun tersine, yani javascript ortamından php ortamına (sunucuya) verinin aktarılmasına geçelim. Bu aslında öncekinden daha zordur çünkü öncelikli olarak işlenen kod sunucuda çalıştırılan php kodlarıdır. Javascript kodları ise sunucunun tarayıcıya verdiği çıktının yorumlanması ile çalıştırılır. Önceki örneğimizdeki aktarım yönü bu sıraya uygundu ancak şimdi tarayıcıda oluşturulan yada işlenen verinin sunucuya aktarılması gerekiyor. Bunun için ya json kodunu bir karakter dizisi (string) olarak sunucuya gönderip sunucuda bu veriyi json_decode ile açarız yada veriyi ajax ile POST yada GET yöntemlerinden biriyle gönderip sunucuda $_POST, $_GET yada $_REQUEST ile erişebiliriz. Yada daha karmaşık veri aktarım durumlarında bu ikisinin bir karışımını kullanarak verinin bazı öğelerini parametrelere ayırıp post/get elemanları olarak göndeririz, bir kısmını da json olarak paketleyip yine bu parametrelerden biri olarak aktarabiliriz.

Javascript 'den php 'ye (genel olarak tarayıcıdan sunucuya) veri aktarımı yapılırken sayfanın yenilenmesini istemiyorsak AJAX (Asynchronous JavaScript and XML) kullanmamız gerekiyor. Bu konuyu ise başka bir yazıya bırakıyorum.

14 Ekim 2008

PHP sayfalama örneği

Sitenizde bir tabloya ait kayıtların listesini göstermek istediğinizde çoğunlukla sayfalama işlemi yapmanız gerekir. Aşağıda bunun için yazılmış basit bir örnek olarak "liste" tablosundaki kayıtları sayfalandırma işlemi yaparak listeleyen bir örnek bulabilirsiniz:


[php]
$p=intval($_GET['p']); //sayfa parametresi

$toplam_sayfa = 1;
$n = 5; // bir sayfada listelenecek kayıt sayısı
$toplam=0;
$basla = 0;

$db-&gt;query("SELECT COUNT(*) as x FROM `liste` ");
if($db-&gt;fetch_data()){
$toplam = $db-&gt;data['x'];
}

$toplam_sayfa = ceil( $toplam/$n );
$basla = ($p-1)*$n;

$db-&gt;query("SELECT * FROM `liste` LIMIT {$basla},{$n}");
while($db-&gt;fetch_data()){
// satır gösterilecek bölüm ...
}

//sayfa numaraları bölümü
for($i=1;$i&lt;=$toplam_sayfa;$i++){
echo ($p==$i)?"{$i} ":"{$i} ";
}
[/php]

Örneğimizde ilk önce sayfa parametresini $p değişkenine kaydediyoruz. (Aslında sayfa numarasını bu şekilde belirlemek yerine parametre yoksa yada pozitif tamsayı bir değer değilse sayfa numarasını 1 kabul etmek gerekir.) Daha sonra listemizdeki toplam kayıt sayısını belirliyoruz (8-11). Burada kullanılan $db daha önceden tanımlanmış bir veritabanı sınıfı nesnesidir. 13.satırda toplam sayfa sayısını belirleyip sayfamızdaki ilk satırın tablodaki sırasını belirliyoruz (13-14). Bundan sonra satırlarımızı bir döngü içinde listeleyip (16-19) ardından tüm sayfalar için sayfa numarası bağlantılarını oluşturuyoruz. Mevcut sayfaya ait sayfa noyu sabit sayı olarak diğerlerini bağlantı olarak yazıyoruz.

Sayfalama işlemi temelde bu örnekteki mantığa dayanır. Önemli olan bir sayfada kaç kayıt gösterileceğini belirleyip istenilen sayfa için başlangıç indisini hesaplamaktır. Sorgudaki LIMIT a,b için a değeri ilk satırın indisini, b ise bu kayıttan itibaren kaç kayıt alınacağını belirlemek için kullanılır.

3 Ekim 2008

Php 'de çıktı tamponu (output buffer) kullanımı

Normalde herhangi bir php kodu çalıştırdığınızda oluşan çıktı işlem anında tarayıcıya gönderilir ve bu şekilde kodun çalışmasının bitmesi beklenmeden çıktı verilmeye başlanmış olur. Ama bazı durumlarda çıtının hemen gönderilmesini istemeyiz. Örneğin, içeriği oluşturduğumuz kodun sonunda yaptığımız bir kontrol ile o ana kadar üretilen çıktının ne biçimde kullanılacağı, yada gösterilip gösterilmeyeceği gibi durumlara karar vermek isteyebiliriz. Yada sayfanın bir yerinde oluşturduğumuz çıktıyı başka bir yerde kullanmak isteyebiliriz. Bu örneklere bütün sayfa içeriğinin en başta oluşturulup daha sonra istediğimiz bir biçimde (sayfa şablonu kullanımı vb durumlar için ) kullanıcıya aktarılmasını da ekleyebiliriz. Bu gibi durumlarda çıktı tamponlama kullanabiliriz. Php 'de bunu gerçekleştirmek için çıktı tamponlaması yapılır.

Çıktı tamponu oluşturmak için öncelikle çıktının başladığı noktayı belirtmemiz gerekir. Bunun için ob_start işlevi kullanılır. Çoğunlukla bu işlevin parametreleri kullanılmaz. Çıktıyı sonlandırmak için ise kullanılabilecek çeşitli işlevler vardır. Çıktıyla ne yapmak istediğimize göre bunlardan birini kullanırız. Örneğin çıktıyı herhangi bir işlemden geçirmeden olduğu gibi aktarmak için ob_flush yada ob_end_flush işlevlerini kullanabilirsiniz. ob_end_flush işlevi çıktıyı istemciye gönderip çıktı tamponunu sonlandırır. ob_flush ise aynı işlevi çıktı tamponunu sonlandırmadan gerçekleştirir. (Ayrıca php kodunun çalışması bittiğinde çıktı sonlanmış olur ve çıktı istemciye verilir yani herhangi bir hata durumunda veya işlem bittiğinde eğer çıktı tamponunda çıktı kalmışsa istemciye gönderilir.)

Çıktıyı istemciye vermek yerine içeriğini alıp istediğimiz gibi kullanabiliriz. Bunun için ob_get_contents yada ob_get_clean işlevlerini kullanabilirsiniz. ob_get_contents işlevi çıktı tamponunun içeriğini döner. ob_get_clean ise bununla birlikte çıktı tamponunu sonlandırır. ob_get_clean işlevini çağırmak, ob_get_contents kullanıp ardından ob_clean işlevini kullanmakla aynı işlevi görür.

Çıktı tamponlaması yaparken kullanabileceğiniz bazı yardımcı işlevler de bulunmaktadır. Örneğin ob_get_length işlevi çıktı tamponundaki verinin uzunluğunu döner. ob_get_level işlevi ise mevcut tamponun derinlik seviyesini döner (İçiçe çıktı tamponları başlatabilirsiniz). ob_get_status işlevi de çıktı tamponunun durumu hakkında bilgiler içeren bir dizi döner.

Çıktı tamponu sisteminin çok kullandığı bir durum da kodun herhangi bir yerinde url yönlendirmesi yapılan kodlardır. Yönlendirme yapmak için header işlevi kulanılır ve bu işlev ile çıktının başlık bilgileri düzenlenir. Ancak bu düzenlemeyi yapabilmek için önceden istemciye herhangi bir çıktının verilmemiş olması gerekir. Eğer yönlendirme yapılan çağrıya kadar herhangi bir çıktı verilmişse başlık bilgisinin zaten gönderilmiş olduğunu belirten bir hata mesajı alırsınız. Eğer kodunuzun başında çıktı tamponu başlatırsanız ve yönlendirme yapılan çağrıya kadar herhangi bir çıktı vermezseniz böyle bir hatayla karşılaşmazsınız ve yönlendirme gerçekleşir.

Çıktı tamponlamanın (output buffering) kullanıldığı birçok başka durumla karşılaşabilirsiniz. Çıktı tamponlamayla ilgili php işlevlerinin listesi için:

http://tr2.php.net/manual/en/ref.outcontrol.php

19 Ağustos 2008

Php 'de Mysql kullanımı

Php gibi sunucu taraflı bir dil kullanılan sitelerin çoğu veri depolamak için bir veritabanı sistemi kullanır. Şu an kullanımda olan çeşitli veritabanı sunucuları arasında php ile birlikte en sık kullanılanı MySQL dir. Bu yazıda php kodları ile nasıl mysql sunucusuna bağlanıp sorgu işlemleri gerçekleştireceğinizi ilgili işlevleri açıklayarak örneklerle anlatmaya çalışacağım. Mysql ile ilgili ayrıntılı bilgiye MySQL in resmi sitesi olan www.mysql.com 'dan ulaşabilirsiniz. Ayrıca php.net de bu konuda açıklayıcı bilgi veren ve ilgili php işlevlerini liste halinde görebileceğiniz http://tr2.php.net/mysql adresini kaynak olarak kullanabilirsiniz.

Php ile mysql işlemleri gerçekleştirebilmemiz için ilk önce mysql sunucusuna bağlanmamız gerekir. Bunun için mysql_connect işlevini kullanırız:



$link = mysql_connect($server, $username, $password);

Bu ifadedeki parametrelerimiz sırasıyla sunucu adresi, veritabanı kullanıcı adı ve şifremizdir. mysql_connect işlevi elde edilen bağlantıya ait bir kaynak döner ancak çoğu zaman bunu kullanmaya ihtiyaç duymayız. Ancak aynı kod içinde birden fazla veritabanına eşzamanlı olarak bağlantı sağlamak istiyorsak varsayılan olarak en son yapılan bağlantı kullanıldığı için bunun haricindeki bağlantılarla ilgili sorgulamalarda ilgili kaynak değişkenini kullanırız. Çoğu zaman böyle bir durumla karşılaşmazsınız. Bağlantının başarısız olması durumunda dönüş değeri FALSE olur.

Bağlantı sağlandıktan sonra ilk yapmamız gereken veritabanı seçimi yapmaktır. Bunun için mysql_select_db işlevini kullanırız.



bool mysql_select_db ( string $database_name [, resource $link_identifier ] )


Zorunlu olan tek parametre veritabanı adıdır. İkinci parametre ise kullanmak istediğimiz bağlantıya ait kaynak bağlantı değişkenidir. Bu işlev de başarılı olma durumunda TRUE , hata durumunda FALSE değerini döner.

Veritabanı seçimi de başarıyla tamamlandığında artık sorgulama yapabiliriz. Bunun için ise mysql_query işlevi kullanılır.



resource mysql_query ( string $query [, resource $link_identifier ] )

Bu işlevi bir örnekle açıklayalım:


$sonuc = mysql_query("SELECT * FROM `uyeler` WHERE `id`=12 ");

Bu ifadeyle uyeler tablosunda id değeri 12 olan kaydı elde etmek üzere sorgulama yapıyoruz. Birden fazla bağlantı açtığımız özel bir durum olmadığı sürece ikinci parametreyi kullanmaya ihtiyacımız olmayacak. Bu işlev ile sorgudan elde edilen sonucu bir değişkene kaydediyoruz. Bu sonuç değişkeni sorguyla elde ettiğimiz kayıtları toplu halde içerir ve bu kayıtları sırayla elde etmek için kayıt getirme işlevlerinden birini kullanırız. Bunlar mysql_ fetch_ row, mysql_ fetch_ assoc, mysql_ fetch_ array ve mysql_ fetch_ object işlevleridir. Bu işlevlerin herbiri sonuç verimizin içinden bir kayıt satır çeker.

Elde etmek istediğimiz satırı
mysql_fetch_row işleviyle sayısal indisli bir dizi olarak,
mysql_fetch_assoc işleviyle tablodaki sütun adlarıyla ilişkili bir dizi olarak,
mysql_fetch_array işleviyle ister sayısal, ister ilişkisel, ister her iki türde indisli bir dizi olarak,
mysql_fetch_object işleviyle ise sütun adlarında değişkenlere sahip bir nesne olarak
elde ederiz.

mysql_fetch_assoc işlevi ile bir örnek gösterelim:




$satir = mysql_fetch_assoc($sonuc);
$kullanici_adi = $satir['kullanici_adi'];
...

Bu şekilde elde ettiğimiz satırın sütunlarına erişebiliriz. mysql_fetch_object işlevini kullanmış olsaydık kullanıcı adını

$kullanici_adi = $satir->kullanici_adi ;

şeklinde bir nesne öğesi olarak elde edecektik. Birden fazla kayıt elde etmek için ise aşağıdaki gibi bir döngü kullanabiliriz:


while($satir = mysql_fetch_assoc($sonuc) ){
echo 'Kullanıcı adı: '.$satir['kullanici_adi'];
}

Sorgu sonucuna ait bütün satırlar bittiğinde mysql_fetch_assoc (yada diğer işlevlerden biri) FALSE döneceğinden döngü sona erecektir. Bu şekilde elde ettiğimiz verileri istediğimiz şekilde kullanabiliriz.

Sorgu sonucuna ait veriyi serbest bırakmak için mysql_ free_ result işlevini kullanabilirsiniz. Ama bunun yerine aynı sonuç değişkenini başka sorgularda da kullanabilirsiniz.

Bağlantıyı bitirmek istediğinizde mysql_ close işlevini kullanabilirsiniz. Bu genelde pek kullanılmaz çünkü kodun çalışması sona erdiğinde bağlantı zaten kesilecektir.

17 Ağustos 2008

PHP Hakkında

Php, sunucu taraflı betiksel (script, scripting) bir programlama dilidir. Nesneye yönelik programlamayı destekler ve C tarzı bir sözdizime sahiptir. Daha önce C, C++, Java gibi bir dille ilgilendiyseniz Php 'ye çok kolay uyum sağlayabilirsiniz. Sürekli geliştirilir ve ücretsizdir. Ayrıca neredeyse bütün işletim sistemleri ve platformlarda çalışabilir.

Php kelimesi ilk başta "Personal Home Page" kelimelerinin kısaltması olarak ortaya çıktı ancak daha sonra aynı GNU (Gnu is Not Unix) gibi özyinelemeli (recursive) bir üslupla Php Hypertext Preprocessor (PHP) haline geldi.

Php esnek bir dildir. Örneğin java gibi sıkı tip denetimine sahip değildir. Bir değişkeni kullanmak için onu önceden tanımlamış olmanız gerekmez. Kullanmaya başladığınız anda o değişken tanımlanmış olur ve ona uyguladığınız işlemlere göre biçim değiştirir. Örneğin bir sayı değişkenini karakter katarıyla bitiştirip aynı değişkene atadığınızda o artık bir sayı değil bir karakter katarıdır. Bu konuda ayrıntıya girmeyeceğim ama şunu bilin ki bu ve bunun gibi birçok esneklik programcıya oluşturmak istediği yazılıma odaklanırken kolaylık sağlar ancak bu imkanlar hata yaptığınızda onu farketmenizi zorlaştırır. Bu yüzden sadece sunucunun vereceği olası hata mesajlarına itibar ederek hata almadığınız sürece hızla ilerlemek yerine kontrollü bir şekilde ve sürekli test ederek yazılımınızı geliştirmeye deam etmelisiiniz.

Hazır "yazılım" kelimesinin yeri gelmişken bir konuya açıklık getirmek istiyorum: Php bazılarının düşündüğü gibi sadece bir web sitesi geliştirme şablon aracı değildir. İlk çıktığında belki amacı bu yöndeydi ama sürekli geliştirilmesiyle günümüzde internet üzerinde kullanıma yönelik her türlü yazılımın geliştirme ortamı olmuştur. Php web sitesi oluşturmada şablon oluşturma amacının dışında veritabanı uygulamaları -aslında veritabanı kullanmayan büyük ölçekli php yazılımı yok gibidir- , kontrol panelleri, çok kullanıcılı sistemler (forumlar, paylaşım siteleri vs.), alışveriş siteleri, bazı türde oyun siteleri, kurumsal kaynak planlama yazılımları ve şu an aklıma gelmeyen birçok alanda, özet olarak doğrudan kullanıcı - donanım etkileşimi gerektirmeyen ve kullanım arayüzü sistemi olarak web tarayıcılarının yeterli olduğu her yazılım türü için php dili kullanılabilir. Ayrıca birçok masaüstü yazılımının da php veya benzeri bir dille yazılmış sunucu taraflı bileşenleri vardır.

Php dili için asıl kaynak php dilinin resmi sitesi olan Php.net dir. Bu adreste dilin özellikleri ve yapısı hakkında her türlü bilgiye ulaşılabileceği gibi muhtemelen en çok sevilen özelliği olan arama motorunu kullanarak istediğiniz işlevlere, sınıf özelliklerine, standart değişken tanımlamalarına ve bunlar gibi php ile ilgili ihtiyacınız olan bilgilere kolayca erişebilmenizdir. Bunun yanında başvuru niteliğinde ve örneklerle zenginleştirilmiş bir php kitabı alarak (mysql kullanımı ve apache kurulum bilgileri de içermesi tercih sebebidir) düzenli bir sıra ile konuları takip edebilirsiniz.

Kripto paralar hakkında

Kripto paralar, merkezi olmayan, şifrelenmiş ve dağıtılmış bir veritabanı olan blok zinciri teknolojisi kullanılarak oluşturulan dijital par...