PHP ile Dinamik Form İşlemleri (Bölüm 1 / 3)

Bu dersimizde dinamik form işlemlerini göreceğiz.. Ders boyunca ilk olarak dinamik form yapısını kurup daha sonra sadece input elemanı için işlemlerimizi yapacağız. Diğer bölümlerde select, multi select, textarea ve file upload için işlemlerimizi gerçekleştireceğiz.

Mantık Nedir?

Form elemanlarını oluşturmak için bir diziye ihtiyacımız var.. Oluşturduğumuz form elemanlarının değerlerini tutmak içinde farklı bir diziye daha.
Daha sonra ise bu dizi elemanlarını işleyip değerlerini bir dosyaya kayıt ettirip istediğimiz herhangi bir yerde kullanabiliriz.

TCMB’den Günlük Kurları Çekmek (PHP)

Her zaman günlük kurlar lazım olabilir, tcmb sağolsun bize xml formatında günlük kurları veriyor. Bizde php’nin simlexml kütüphanesi ile kolayca alıp işleyebilir, sitelerimizde gösterebiliriz.

XML Adresi;

http://www.tcmb.gov.tr/kurlar/today.xml

Gelelim nasıl çekeceğimize.. İlk olarak simplexml_load_file() fonksiyonu ile tcmb sitesine bağlanıp bilgileri alıyoruz. Daha sonra obje olarak dönen değerlerden istediklerimizi alabiliriz.

<?php

    $open = simplexml_load_file('http://www.tcmb.gov.tr/kurlar/today.xml');
    
    // dolar
    $usd_alis = $open->Currency[0]->BanknoteBuying;
    $usd_satis = $open->Currency[0]->BanknoteSelling;
    
    // euro
    $euro_alis = $open->Currency[11]->BanknoteBuying;
    $euro_satis = $open->Currency[11]->BanknoteSelling;

    echo 'USD: '.$usd_alis.'<br />EURO: '.$euro_alis;
    
?>

İşte bu kadar basit ???? Kolay gelsin.

PHP’de Eşitlik Kontrol Fonksiyonu

Eğer bir takım verinin diğer bir takım veri ile eşleşip eşleşmediğini kontrol ediyorsanız if ifadesi ile tek tek kontrol ediyor olabilirsiniz. Bunun yerine basit bir fonksiyon yazıp daha kolay kontrol edebiliriz. Fonksiyonumuz şöyle olacak;

function esitlikKontrol($arg, $arg2){
    $result = array_diff($arg, $arg2);
    if ( empty($result) )
        return true;
}

Burada mantık şudur. array_diff() dizide aynı olan elemanları çıkartır. Dolayısı ile eğer boş ise verdiğimiz değerlerin hepsi birbirine eşit demektir. Böylece birçok if koşulundan da kurtulmuş olduk ???? Hemen bir kullanımını örnek ile göstereyim;

$result = esitlikKontrol([1,2,3,4], [1,2,3,4]);
if ( $result ){
    // ilk dizideki elemanlar ikinci dizideki elemanlara eşit
} else {
    // eşit değiller!
}

Not: Dizi için kısa söz dizimini “[]” kullanacaksanız 5.4.0 ve üzeri bir php sürümünüz olması gerektiğini unutmayın.

Fotoğraf Özelliklerini Bulmak (Php, Js)

Yakın zamanda yeni bir fotoğraf makinesi aldım ve amatör olarak fotoğraf çekmeye başladım.. Bundan dolayıda hemen bir 500px.com üyeliği aldım ve fotoğraflarımı yüklerken orada bir şey dikkatimi çekti, hatta dikkat çekmekle birlikte çok hoşuma gitti ???? Yüklediğim fotoğrafa ait bilgileri görebiliyordum, hangi marka ve model fotoğraf makinası ile çektiğimi, zoom değerini vs. vs..

Daha sonra bunu php ile nasıl yapabileceğimi biraz araştırdıktan sonra bir şeyler buldum, test ettim ve güzel bir şekilde çalıştığını gördüm. Bunu sizlerle de paylaşmak istiyorum..

Not: Beni 500px üzerinden takip etmek isterseniz, adresim aşağıdadır ????
http://500px.com/TayfunErbilen

Bir şeyi arıyorsanız bir anahtar kelimeniz olmalı..
Bizim anahtar kelimemiz belli; “Exif

Bu anahtar kelime ile diğer diller içinde bunu bulabiliriz..
Bkz: javascript Exif

Php’de bu işi yapan exif_read_data() adında bir fonksiyon.
http://www.php.net/manual/en/function.exif-read-data.php

En basit haliyle yapmanız gereken tek şey, resmin yolunu belirtmeniz.

<?php
$exif = exif_read_data('tayfunerbilen.png');
print_r( $exif );
?>

Ve çıktısı en basit haliyle şöyle olacaktır;

Array
(
    [FileName] => IMG_5236.JPG
    [FileDateTime] => 1378615652
    [FileSize] => 3438950
    [FileType] => 2
    [MimeType] => image/jpeg
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP, MAKERNOTE
    [COMPUTED] => Array
        (
  ........

Şimdi bizim için önemli olan fotoğraf bilgilerini alıp değişkenlere aktaralım ve ekrana yazdıralım ????

<?php

	$exif = exif_read_data('IMG_5236.JPG');

	$kamera = $exif['Make'];
	$kameraModel = $exif['Model'];
	$fDuragi = $exif['COMPUTED']['ApertureFNumber'];
	$isoHizi = $exif['ISOSpeedRatings'];
	$pozlandirma = $exif['ExposureProgram'];
	$odakUzunluk = $exif['FocalLength'];
	$deklansorHiz = $exif['ExposureTime'];
	$cekilmeZamani = $exif['DateTime'];

>

Ve yazdıralım;

<strong>Kamera:</strong> <?php echo $kamera; ?><hr />
<strong>Kamera Modeli:</strong> <?php echo $kameraModel; ?><hr />
<strong>F Durağı:</strong> <?php echo $fDuragi; ?><hr />
<strong>ISO Hızı:</strong> <?php echo $isoHizi; ?><hr />
<strong>Pozlandırma:</strong> <?php echo $pozlandirma; ?><hr />
<strong>Odak Uzunluğu:</strong> <?php echo $odakUzunluk; ?> mm<hr />
<strong>Deklanşör Hızı:</strong> <?php echo $deklansorHiz; ?> mm<hr />
<strong>Çekilme Zamanı:</strong> <?php echo $cekilmeZamani; ?><hr />

Ancak her fotoğrafda olmayacağını unutmayın. Bu yüzden isset() ve empty() kullanarak kontrollü bir şekilde ekrana yazdırmayı unutmayın.

javascript ile Fotoğraf Bilgilerini Almak

Bunun için google’a “javascript exif” diye aratmanız yeterli. Bir çok eklenti mevcut, ben bir tanesini kullanarak kolayca işlem yapabildim.. Kullandığım eklenti;

https://github.com/jseidelin/exif-js

Kullanımı;

Önce jquery kütüphanesini ve eklentinin 2 js dosyasını sayfaya dahil ediyoruz. Daha sonra input change olduğunda bu olayı yakalayıp fotoğrafın yolunu eklentiye gönderiyor ve değerleri alarak istediğimiz herhangi bir yere yazdırıyoruz..

<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="binaryajax.js"></script>
<script type="text/javascript" src="exif.js"></script>
<meta charset="utf8" />
<style type="text/css">
* {
padding: 0;
margin: 0;
list-style: none;
border: 0;
font-family: Arial;
font-size: 12px
}
body {
padding: 15px;
background: #f5f5f5
}
.container {
width: 400px;
margin: 25px auto
}
.fotograf {
border: 1px solid #ddd;
padding: 15px;
background: #fff;
display: block;
margin-bottom: 10px
}
#ozellikler {
border: 1px solid #ddd;
border-bottom: none;
margin-top: 10px;
display: none
}
#ozellikler li {
padding: 7px;
background: #fff;
border-bottom: 1px solid #ddd
}
#ozellikler li:nth-child(even) {
background: #eee
}
</style>
</head>
<body>
<div class="container">
<label class="fotograf">
<strong>Fotoğraf Seçin:</strong> 
<input type="file" accept="image/jpg" id="fotograf">
</label>
<div id="result">
<ul id="ozellikler"></ul>
</div>
</div>
<script type="text/javascript">
if (window.File && window.FileReader && window.FileList && window.Blob) {
$('#fotograf').change(function(e){
var fotograf = e.target.files[0];
var ozellikler = $('ul#ozellikler');
EXIF.getData(fotograf, function(){
ozellikler.fadeIn().html('');
var kamera = EXIF.getTag(this, 'Make');
if ( kamera ) ozellikler.append('<li><strong>Kamera:</strong> ' + kamera + '</li>');
var model = EXIF.getTag(this, 'Model');
if ( model ) ozellikler.append('<li><strong>Model:</strong> ' + model + '</li>');
var fDuragi = EXIF.getTag(this, 'FNumber');
if ( fDuragi ) ozellikler.append('<li><strong>F Durağı:</strong> ' + fDuragi + '</li>');
var isoHizi = EXIF.getTag(this, 'ISOSpeedRatings');
if ( isoHizi ) ozellikler.append('<li><strong>ISO Hızı:</strong> ' + isoHizi + '</li>');
var pozlandirma = EXIF.getTag(this, 'ExposureBias');
if ( pozlandirma ) ozellikler.append('<li><strong>Pozlandırma:</strong> ' + pozlandirma + '</li>');
var odakUzunluk = EXIF.getTag(this, 'FocalLength');
if ( odakUzunluk ) ozellikler.append('<li><strong>Odak Uzunluğu:</strong> ' + odakUzunluk + '</li>');
var deklansorHiz = EXIF.getTag(this, 'ExposureTime');
if ( deklansorHiz ) ozellikler.append('<li><strong>Daklanşör Hızı:</strong> ' + deklansorHiz + '</li>');
var cekilmeZamani = EXIF.getTag(this, 'DateTime');
if ( cekilmeZamani ) ozellikler.append('<li><strong>Çekilme Zamanı:</strong> ' + cekilmeZamani + '</li>');
});
});
}
</script>
</body>
</html>

PHPMailer Sınıfı ile Gmail Üzerinden E-Posta Gönderimi

Öncelikle bu sınıfı yazana bir teşekkür edelim ???? Daha sonra ise ilk olarak sınıfı indireceğiniz adresi vereyim;

https://code.google.com/a/apache-extras.org/p/phpmailer/

Burada tahmin edebileceğiniz gibi “downloads” sekmesinden en çok indirileni indiriyoruz.Not: Eğer indirme adresinde ssl’den dolayı hata alırsanız “yine de devam et” diyerek indirme işlemine devam edin.

Okumaya devam et “PHPMailer Sınıfı ile Gmail Üzerinden E-Posta Gönderimi”

Ternary (Üçlü) Operatör Kullanımı (PHP)


Bu operatör çok basit şekilde çalışır.. Ve yapısı şöyledir;

KOŞUL ? DOĞRUYSA : YANLIŞSA

Bunu php’de şöyle bir örnek ile daha iyi anlayabiliriz;

$sayfa = isset($_GET['sayfa']) ? $_GET['sayfa'] : 1;

Burada eğer sayfa adında bir get parametresi var ise onun değerini yok ise 1 değerini $sayfa değişkenine atamış olduk.. Bunu uzun olarak if koşulu ile şöyle yapabilirdik;

if ( isset($_GET['sayfa']) ){
    $sayfa = $_GET['sayfa'];
} else {
    $sayfa = 1;
}

Ancak gördüğünüz gibi ternary operatör işimizi çok daha kolaylaştırıyor ve işlemi tek satır haline indiriyor.. Ayrıca iç içede kullanımı vardır.. Örnek vermek gerekirse;

$deger = 1;
$sonuc = ($deger === 1 ? 'Doğru' : ($deger === 2 ? '1 Yanlış' : ($deger === 3 ? 'Hatalı' : 'Tamamen Hatalı')));

Ancak genelde bu şekilde iç içe kullanımı çok okunaklı olmadığı için tavsiye etmem. Tek satırlı işlemler için ideal bir operatördür ve bilmenizde fayda var.

“X Zaman Önce” Yazıldı Fonksiyonu

Bir çok paylaşım sitesinde gördüğümüz “x zaman önce” yazıldı tarzında tarihlerin ne zaman yazıldığını gösteren bir fonksiyondur.

function timeConvert ( $zaman ){
	$zaman =  strtotime($zaman);
	$zaman_farki = time() - $zaman;
	$saniye = $zaman_farki;
	$dakika = round($zaman_farki/60);
	$saat = round($zaman_farki/3600);
	$gun = round($zaman_farki/86400);
	$hafta = round($zaman_farki/604800);
	$ay = round($zaman_farki/2419200);
	$yil = round($zaman_farki/29030400);
	if( $saniye < 60 ){
		if ($saniye == 0){
			return "az önce";
		} else {
			return $saniye .' saniye önce';
		}
	} else if ( $dakika < 60 ){
		return $dakika .' dakika önce';
	} else if ( $saat < 24 ){
		return $saat.' saat önce';
	} else if ( $gun < 7 ){
		return $gun .' gün önce';
	} else if ( $hafta < 4 ){
		return $hafta.' hafta önce';
	} else if ( $ay < 12 ){
		return $ay .' ay önce';
	} else {
		return $yil.' yıl önce';
	}
}

Kullanımı;

<?php
// .. timeConvert fonksiyonu
$tarih = "2013-09-22 15:25:33";
echo timeConvert($tarih);
?>

Dizide Tekrarlanan Elemanları Silme “array_unique()” (PHP)

Bir diziniz var ancak bu dizide birden fazla aynı elemandan bulunuyor ve bu sizi rahatsız ediyor.. Bir şekilde aynı olan dizi elemanlarını kaldırıp sadece bir tanesinin kalmasını istiyorsunuz.. İşte bu durumda php bize şöyle bir fonksiyon sunuyor;
http://php.net/manual/en/function.array-unique.php

Örnek kullanımı;

<?php

$array = array(
	"tayfun",
	"erbilen",
	"tayfun",
	"erbilen.net",
	"tayfun"
);
$newArray = array_unique($array);

print_r( $newArray );

/*

Array
(
    [0] => tayfun
    [1] => erbilen
    [3] => erbilen.net
)

*/

?>

Php’de Zaman Ayarlı Session’lar

Her zaman olmasada bazen zamanı gelince session’ların otomatik sonlanmasını isteriz.. Ama her session için değil, bazı özel durumlar için olabilir.. Bu gibi durumlara basit bir çözüm bulabiliriz.. İşte o basit çözümün kodları;

<?php
 
 session_start();

 /* eğer vaktiGeldi session'ı yok ise sessionları oluştur */
 if ( !isset($_SESSION['vaktiGeldi']) ){
   $_SESSION['vaktiGeldi'] = time() + 20;
   $_SESSION['kullanici_adi'] = 'Tayfun Erbilen';
 }

 /* session zamanı geçmiş ise belirli session'ları yok et */
 if ( time() > $_SESSION['vaktiGeldi'] ){
   unset($_SESSION['kullanici_adi']);
   // ya da session_destroy()
 }

 echo 'Hoşgeldin, <strong>'.$_SESSION['kullanici_adi'].'</strong>';

?>

Şimdi burada yapılan şey şu.. Session oluştururken bir tane zamanın belirtileceği session oluşturulacak.. time() + 20 dememin açıklaması Mevcut zamandan 20 saniye sonrası demek oluyor.. Ve kontrol ederkende mevcut zaman eğer vakit session’ından büyük ise istediğimiz sessionları sonlandırıyoruz..

Ki budurumda 20 saniye sonra kullanici_adi adlı session‘ım kullanılamaz hale gelecektir.. Bu şekilde zaman ayarlı session’lar oluşturup gerektiğinde kullanabilirsiniz..