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

PHP ve MySQL Dersleri

PHP ile web programlama için, temelden başlayarak oturum yönetimine kadar devam eden bir sunum. İyi çalışmalar.



Sunumu İndirmek için TIKLAYIN

Sunum İçeriği:
PHP Tarihçesi
PHP Giriş
PHP Nasıl Çalışır?
PHP Çalışma Şekli
PHP ile neler yapılabilir?
WAMP SERVER KURULUMU
TEMEL SÖZDİZİMİ
Değişkenler
Veri Tipleri
Nesne (Objects) Değişkenler
Dizi Değişkenler
TİP DEĞİŞTİRMEK (settype())
Değişken Değerlerinden Boşluk Kaldırma
Süper Global Değişkenler
SABİTLER
OPERATÖRLER
Aritmetiksel Fonksiyonlar
KONTROL YAPILARI
DÖNGÜLER
FONKSİYONLAR
ÖN TANIMLI GLOBAL DEĞİŞKENLER
$_SERVER
$_GET  ve $_POST
$_COOKIE
DİZİLER
FORMLAR
POST - GET
Üye kayıt formu
MySQL’e bağlantı
Veritabanı içinde Tablo Oluşturma
Veritabanı bağlantısı
Temel Veri Tabanı İşlemleri
OTURUM YÖNETİMİ
Cookie Yöntemi
Session uygulamaları

Php'de verilerin sayfa sayfa gösterilmesi


Opsiyonların belirlenmesi :

Sayfanın en başında ayarlamalar açıklaması ile sayfadaki değişken kavramları belirleyelim. Bunlar, sayfa başına listelenecek kayıt sayısı ve gösterimde kullanacağınız değişimleri içeren değişkenler olabilir.
1.  // sayfa basina listelenecek kayit sayisi
2.  $liste = 10;

Kaynakların belirlenmesi :

Sayfalamak istediğimiz veri büyük ihtimalle mysql'den gelen bir sonuç kümesi olacaktır. Ancak bazen kendi oluşturduğumuz bir dizi de olabilir. İkisinde de sayfalama işlemimiz neredeyse aynı, farklı kısımları döküman boyunca ayrı ayrı belirterek inceleyeceğim zaten.

A) Kaynağımız çok boyutlu bir dizi ise :


Dizimizi örnek kullanım için rastgele sayılarla dolduracağım;
1.  for($i=0; $i<100; $i++){
2.    $dizi[$i][0] = rand(1,100);
3.    $dizi[$i][1] = rand(1,100);
4.    $dizi[$i][2] = rand(1,100);
5.  }

100x3'lük bir matris şeklinde dizimizi 1-100 arasında rastgele sayılarla doldurmuş olduk. Şimdi bu diziyi 10'ar 10'ar sayfalatalım. Öncelikle dizinin boyutlarını biliyor olmamız için dizinin en başta belirlenmiş yani elemanlarının girilmiş olması gerekir. Ardından
1.  $kayit_sayisi = count($dizi);

değişkeninde kayıt sayımızı tutacağız.


Kaynak mysql sonuç kümesi ise :


Herhangi bir vertabanına bağlandıktan sonra bir tablodaki verileri sayfalayarak listelemeye çalışalım. Öncelikle tablodaki veri sayısını belirleyelim :
1.  select count(herhangi_bir_alan_adi) as kayit_sayisi from tablo_adi

Bu sorgu çıktısını fetch edip $kayit_sayisi değişkenine atalım :
1.  $bilgi        = mysql_fetch_assoc($sorgu);
2.  $kayit_sayisi = $bilgi["kayit_sayisi"];


Sayfa sayısının hesabı :

Şimdi kayıt sayısını, sayfanın başında belirlediğimiz sayfa başına listelenecek kayıt sayısına göre hesaplatalım.
1.  $sayfa_sayisi = floor($kayit_sayisi/$liste) + 1;
2.  // ya da kisaca
3.  // $sayfa_sayisi = ceil($kayit_sayisi/$liste);
4.  // seklinde de kullanabilirsiniz.

Sondaki +1'in nereden çıktığını değerler verek çözebiliriz. Örneğin 5 kayıt varken 5/10 = 0.5, bunun alta yuvarlanışı 0 verir. 25 kayıt varken 25/10 = 2.5, alta yuvarlanışı 2. Bu değerlere 1 eklememiz gerekir.

Sayfa sayısı hatası ve çözümü :

Sayfa başına listelenecek kayıt sayısı değerinin tam katları kadar kayıt olduğunda küçük bir sorunla karşılaşıyoruz. Mesela 49 kayıt varken 5 sayfa olması gerekir. yukarıdaki hesapta da doğru olarak çıkar. Ancak 50. kayıtın da 5. sayfada bulunduğunu biliyoruz. 50 kayıt varken sayfa sayısı 6 çıkar. Bu hatayı göz ardı ederek yazdığımız scriptde 6 sayfa bulunur ve 6. sayfada hiç kayıt listelenmez. Bunu kontrol ettirerek sayfa sayısı değerinde oynamamız gerekir. Tam katı olduğunu o sayının, sayfa başına listelenecek kayıt sayısına olan modunun 0 olması ile anlarız ($kayit_sayisi%$liste=0 ise).
1.  if( $kayit_sayisi % $liste == 0 ){
2.    $sayfa_sayisi--;
3.  }

Bunu sayfa sayısını belirlerken ters kontrol ile eklenilmesi gereken 1'i kontrol ile ekleyerek de yapabiliriz.
Böylece doğru olarak sayfa sayısını hesaplamış olduk.

Sayfa kontrolü ve limitlerin belirlenmesi :

PHP kodumuzun en başında GET metodu ile gelen değişkenlerden "sayfa" değişkenini alacağız. Bu değişkenin içeriğinin geçerli olup olmadığını kontrol ettireceğiz;
1.  if( !is_numeric($sayfa) || $sayfa < 1 || $sayfa > $sayfa_sayisi ){
2.    $sayfa = 1;
3.  }

Ters kontrol ile sayfa değişkeni ile gelebilecek hataları engellemiş olduk.
Bundan sonra alt ve üst limitlerimizi oluşturacağız.
1.  $alt_limit = $sayfa * $liste;

Hemen değerler vererek aklımızda kurduğumuz alt limitin doğruluğunu kontrol ediyoruz :
2. sayfada isek 10 indisli kayıt'dan (yani 11. kayıttan) 19'a kadar olanların (aradaki kayıt sayısı 10'dur inanmayanlar saysin :-)) görüntülenmesini bekleriz; 2*10=20, yanlış çıktı. Dizinlerdeki 0 indisinin olması gibi bir sorundur bu ve $sayfa'yı 1 azaltma ile giderebiliriz :
1.  $alt_limit = ($sayfa - 1) * $liste;

işlemi ile alt limiti belirlemiş oluruz. Üst limit de bu sayıya $liste kadar değer eklenmesi ile buluruz. Ancak eğer son sayfa ise ve limitimizin altında kayıt varsa (genellikle böyle olacaktır), üst limit olarak kayıt sayısını atarız.
1.  $ust_limit = $alt_limit + $liste;
2.  if( $ust_limit > $kayit_sayisi ){
3.    $ust_limit = $kayit_sayisi;
4.  }

Bunu yapmazsak çıktı verirken döneceğimiz for içerisinde fazla satırlar yazdırılacaktır.

Sonuçların seçilmesi ve gösterim :

A) Kaynağımız çok boyutlu bir dizi ise :


Dizide basit bir for döngüsü ile bunu halledeceğiz.
1.  for( $i = $alt_limit; $i < $ust_limit; $i++ ){
2.    print($dizi[$i]);
3.  }


B) Kaynak mysql sonuç kümesi ise :


MySQL'de "limit" sayesinde belirli aralıktaki kayıtları seçebiliyorduk. Bunu kullanarak tek sql sorgusunda halletmiş olacağız.
1.  select * from tablo_adi limit $alt_limit,$liste

Sorguda dikkat ettiyseniz üst limiti kullanmadık, çünkü mysql'de limit kavramının kullanımı "... limit baslangic,kac_kayit" şeklindedir. Başlangıcı hesaplamk yeterlidir. Bu sorguyu while ile fetch edip istediğiniz şekilde yazdırabilirsiniz. Eğer o andaki limit kadar kayıt yoksa var olanlar gösterilir.


Sayfa linklerinin gösterilmesi :

Önceki ve sonraki sayfaları sayfa ve sayfa sayısı değişkenlerine göre belirleyeceğiz. 2 küçük kontrol ile bunu halledebiliriz :
1.  if( $sayfa > 1 && $sayfa_sayisi > 1){
2.    print 'Önceki Sayfa ';
3.  }
4.   
5.  // arada o andaki sayfa ve toplam sayfa sayisini gosterelim :
6.  print '' . $sayfa . '/' . $sayfa_sayisi . '';
7.   
8.  if( $sayfa > 1 && $sayfa < $sayfa_sayisi ){
9.    print 'Sonraki Sayfa';
10.}

Örnek çıktı :

Önceki Sayfa 5/15 Sonraki Sayfa


Kaynak : Mehmet Fatih YILDIZ –
www.mfyz.com


Php Güvenliği


Basit PHP Güvenliği:
PHP script'lerinizin güvenli olduğundan emin olmanız için ilk olarak temel kuralları yerine getirmeniz gerekiyor: kullanıcı girdilerinin (input) filtrelenmesi ve çıktıların (output) kontrolü. Eğer bu ikisini doğru olarak yapmıyorsanız script'leriniz her zaman güvenlik problemleri ile karşı karşıya olacaktır. Bu makale'de bu iki işlem ile ilgili yapılması gerekenler anlatılıyor.

Bütün Girileri Filtreleyin:
Script'leriniz harici bir kaynaktan girdi okuduğunda, bu verinin tehlikeli olduğu varsayılmalı ve güvenilmemelidir. Güvenilmemesi gereken değişkenlerden bazıları: $_POST, $_GET, $_REQUEST ve hatta pek mümkün görünmese de önemli veriler içerebilecek olan $_SERVER .

Tehlikeli bir değişkenden gelen veriyi işlemlere tabi tutmadan önce ilk olarak önce onaylanamanız ve filtrelemeniz gerekmektedir. Onaylama işlemi ile sadece sizin istediğiniz verileri içerdiğinden emin olabilirsiniz. Örneğin bir eposta adresi bilgisi bekliyorsanız, onay fonksiyon'unuz girilen verinin doğru bir eposta adresi olup olmadığını kontrol etmeli.

Hemen basit bir örnekle açıklayalım. Aşağıdaki kodda ilk olarak $_POST değişkeninden e-posta adresini alıyorum ve sonra veriyi onaylama işlemine sokuyorum:
PHP Kodu:

$eposta $_POST['eposta']; # Burada veri hala TEHLİKELİ durumda 

// Validate e-mail 
if (valid_eposta($eposta) == false) { 
// Geçerli bir adres değil 
die('Geçerli bir eposta adresi değil!'); 

?>
Veriyi kontrol ederek script'imize tehlikeli verilerin eklenmesi riski büyük ölçüde azaltılmış oldu. valid_eposta() fonksiyon'u PHPit Code Snippet veritabanında da bulunabilecek olan standart bir onay işlemidir.

Verimiz daha güvenli olsa da işimiz daha bitmedi çünkü hala veriyi MySQL veritabanına yerleştirmek istiyoruz ve bu işlemden önce de bazı kontroller yapmamız gerekiyor. PHP tüm önemli karakterlerin escape edildiği
mysql_real_escape_string() standart fonksiyon'unu sunar. Diğer bir yöntem ise SQL sorgusunda veriyi her zaman kesme imleri arasına yerleştirin.

Önceki örneğimize devam edelim:
PHP Kodu:

$eposta $_POST['eposta']; # Burada veri hala TEHLİKELİ durumda 

// Validate e-mail 
if (valid_eposta($eposta) == false) { 
// Geçerli bir adres değil 
die('Geçerli bir eposta adresi değil!'); 


// eposta'nın veritabanı için güvenli hale getirilmesi 
$eposta mysql_real_escape_string($eposta); 

// Artık güvenli! 
?>
Artık elimizdeki eposta verisi veritabanına güvenli bir şekilde işlenebilir. Hatalardan kaçınmak için tehlikeli değişkenlere bir ön ek verilebilir, örneğin:
PHP Kodu:

$t_eposta $_POST['eposta']; # Tehlikeli 

// Onay işlemi 

$g_eposta mysql_real_escape_string($d_eposta); 
?>
Bu şekilde tehlikeli bir veriyi işleme sokarken ön tarafındaki t_ eklentisi ile hemen farkına varabilirsiniz.

Çıktıların filtrelenmesi
Girdilerde olduğu gibi dışarıya sunulan tüm verilerin de (güvenli olarak filtreleyip veritabanına işlediğiniz verilerin dahi) filtrelenmesi gerekmektedir.

Filtrelenmesi gereken en önemli şey probleme yol açabilecek olan HTML tag'leridir. Bunu yapmanın en kolay yolu bütün HTML'i escape işlemine sokan
htmlentities() fonksiyon'udur:
PHP Kodu:

echo htmlentities($_GET['eposta']); 
?>
Bu kod (saldırganın sayfalarınıza JavaScript kodları eklemesine ve diğer kullanıcıların cookie'lerini çalmasını sağlayan) muhtemel XSS (çapraz site betik çalıştırma - cross site scripting) saldırılarını kaldırır. Eğer mümkünse, htmlentities fonksiyon'unun üçüncü argümanı'nı (encoding/charset tipi) da kullanmalısınız. Google'da HTML'i escape işleminde düzgün encoding ayarı yapmadığı için XSS saldırısından etkileniyordu. Google bu açığı 1 aralık'ta kapattı. Basitçe, her zaman encoding tipini belirlemelisiniz:
PHP Kodu:

echo htmlentities($_GET['eposta'], ENT_QUOTES'UTF-8'); 
?>
Eğer bütün HTML tag'lerini filtrelemek istemiyorsanız, bazı tag'lere izin vermek istiyorsanız strip_tags() fonksiyon'unu kullanabilirsiniz. Fakat bu,

htaccess ( HYPERTEXT ACCESS ) dosyası oluşturma


htaccess ( HYPERTEXT ACCESS )
htaccess http sunucunuzda domainlerin ve dosyalara erişimlerin düzenlenebilmesini sağlayan dosyanın adıdır.Bu dosya sunucunuzda her dizinde birer tane olmak üzere birden fazla olabilir.Yanlız bu dosyanın düzenli olmaması,uzun veya karmaşık komutlar içeriyor olması web sayfanıza erişimi yavaşlatacağından olabildiğince düzenli olmasına özen gösteriniz. Burada htaccess ile ilgili temel bilgileri işleyeceğiz. Bu bilgiler mutlaka işinize yarayacaktır.
htacces dosyasını herhangi bir yazı editörü ile oluşturabilirsiniz. Oluşturduğunuz dosyayı kaydederken” .htaccess “ şeklinde kaydetmelisiniz. Aksi takdirde dosyanız sunucunuzda işlenmeyecektir.

Öntanımlı sayfa bilgisini aşağıdaki şekilde değiştirebilirsiniz (sıraya dikkat ediniz).
DirectoryIndex home.html index.htm index.html index.php
Herhangi bir klasöre ait tüm erişimi engellemek için klasörün içinde “.htaccess“dosyası oluşturup içine
deny from all
yazdığınızda klasöre tüm erişim engellenecektir. Ya da tüm dosyalara ait erişimi sağlamak için
allow from all
yazmanız yeterlidir. Eğer sadece bir tek dosya engelleyecekseniz

Order allow,deny
Deny from all
komutunu yazdığınızda adı yazılan dosya erişime kapalı olacaktır.Bu wordpress de wp-config.php dosyasına erişimi engellemek için işinize yarayacaktır.
Bu klasöre yalnızca belirlediğiniz ip adresiyle erişilmesini istiyorsanız
deny from all
allow from 255.255.255.255
komutunu yazabilirsiniz.
Bir klasördeki dosyaların ekranda listelenmesini istiyorsanız
Options +Indexes +MultiViews +FollowSymlinks
IndexOptions FancyIndexing
komutlarını yazabilirsiniz.
Eğer bant genişliğiniz düşük ise,php de;

php_value zlib.output_compression 16386
komutlarını kullanarak veri sıkıştırması yapabilirsiniz
Herhangi bir dosyayı gizlemek için

Order allow,deny
Deny from all
Satisfy All
komutunu yazmanız yeterlidir. Burada “00000” yazan yere dosyanın adını yazmanız yeterlidir.
Sitenizi gezinen kişilerin HTTP 404 hata sayfası yerine kendi düzenlediğimiz bir sayfanın gelmesini istiyorsak ;
ErrorDocument 404 hatadosyası.html
yazmamız yeterlidir.Burada “hatadosyası.html” yazan kısımda kendi dosyamızın bulunduğu yeri göstermemiz gerekmektedir.
Sitenizin URL sinde www kullanılmasını istemiyorsanız

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{http_host} ^www\.siteadınız\.com[nc]
RewriteRule ^(.*)$ http://siteadınız.com/$1 [r=301,nc]
yazmanız yeterlidir.(Bu komutlar aynı zamanda alan adınızı taşımak için de kullanılır)
Site dosyalarınızın dışarıdan kullanılmasını engelleyerek bos.gif adında bir resim dosyası göstermesi için

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+\.)?siteadınız\.com[NC]
RewriteRule .*\.(zip|mp3|avi|mpg|)$ http://www.siteadınız.com/bos.gif [R,NC,L]
komutlarını kullanabilirsiniz.
Sitenize girmek isteyen botları engellemek için

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* – [F]
komutlarını kullanabilirsiniz.