30 Ekim 2016 Pazar

SQL'de Değer Döndüren Stored Prosedürleri:


PostgreSql'de Tablo Döndüren Stored Prosedürleri:

 - Bilindiği üzere stored prosedürleri, uygulamada çalıştırmak istediğimiz tüm sql sorguların fonksiyonel şekilde ve modüler olarak saklandığı yapılardır, ayrıca sorguların veritabanı yönetim sisteminde derlendiğinden fark edilir derecede uygulamıza performans sağlayacaktır. Veritabanı ile senkronize çalışması gereken uygulamalarımızın vazgeçilmezi olan stored prosedürlerinden tablonun kendisini döndüren türünü aşağıdaki örnek üzerinden anlatacağım.



CREATE OR REPLACE FUNCTION wfprocesser() -- wfprocesser adında fonksiyon tanımlama
  RETURNS table(idprocess character varying(50),nmprocess character varying(255),idobject character varying(50),nmuserstart character varying(255)) ---RETURNS table() ile tanımladığımız fonksiyonun geriye tablo türünde bir değişken döndüreceğini belirtmiş oluyoruz. Örnekte olduğu gibi table() değişkeninin içerisine tanımladığımız kolon isimleri veritabanındaki hangi tablodan bilgi çekmek istiyorsak değişken tipleriyle beraber o tablonun kolon isimleri, kolon sayı ve sırası ile birebir aynı olması gerekmektedir. 
   AS
$BODY$

BEGIN

--- benim veri çekmek istediğim tablo kolon isimleri ve sırası ile aşağıdaki gibidir.
return query SELECT
DISTINCT(WFPROCESS.IDPROCESS),WFPROCESS.NMPROCESS,WFPROCESS.IDOBJECT, WFPROCESS.NMUSERSTART FROM  WFPROCESS JOIN WFHISTORY ON WFPROCESS.IDOBJECT=WFHISTORY.IDPROCESS;


END
$BODY$
  LANGUAGE plpgsql VOLATILE;


fonksiyonu yukarıdaki gibi tanımladıktan sonra veritabanı yönetim sisteminin sql konsolu üzerinde
select * from wfprocesser() şeklinde sorgu yazdığımızda wfprocesser() fonksiyonunun döndürmüş olduğu tabloya erişim sağlamış olduğunuzu göreceksiniz. Aynı sorguyu herhangi bir yazılım dilinde de aynı şekilde kullanmanız mümkündür. Böylece içinde döngülerin de olabileceği çok karmaşık algoritmaların olduğu bunun gibi fonksiyonların döndürdüğü sonuçlara basit bir tabloymuş gibi erişim sağlayabiliyoruz. Umarım işinize yaramıştır.

PHP ile SMTP Üzerinden Mail Göndermek


PHP Üzerinden SMTP E-Mail Gönderme:


- Bu yazıda php kodu ile SMTP mail nasıl gönderilebileceğini aşağıdaki kod üzerinden anlatacağım. PHP üzerinden mail göndermek için aşağıdaki kodda görüleceği gibi PHPMailer adlı API'yi kullanıyorum. Bahsettiğim php kütüphanesinin son sürümüne buradan ulaşmanız mümkündür. Aşağıdaki kodda ilgili değişiklikleri yaparak kendi bilgisayarınızda derlediğinizde koda ekleyeceğiniz mail hesabına e-mail gittiğini göreceksiniz.


<?php
//phpinfo();-- ile local pc veya php hangi bilgisayar üzerine kurulu ise php hakkındaki teknik bilgilere ulaşmamız mümkündür. Üzerinde çalışıyor olduğumuz PHP'nin sürümü modülleri vs..
date_default_timezone_set('Etc/UTC');

require 'phpmailer/PHPMailerAutoload.php'; -- yukarıdaki linkten indirmiş olduğumuz phpmailer kütüphanesini kendi uygulamamıza şu şekilde import etmemiz gerekmektedir. Burada dikkat etmemiz gereken tek şey kütüphanenin yer aldığı klasör dizinidir.

$mail = new PHPMailer; --PHPMailer adında yeni bir obje tanımlıyoruz.
$mail->IsSMTP(); -- SMTP mail server protokolünün kullanılacağını şu şekilde belirliyoruz.
$mail->SMTPDebug = 0; -- mail göndermede veya kodun çalışıp çalışmaması durumu için hata mesajının alınacağına dair 0 yerine 1, 2, 3 veya 4 yazdığımızda detaylı şekilde SMTP dönütü alabiliriz. Benim kod çalıştığına göre herhangi bir hata mesajı almaya gerek kalmadığı için 0 yazarak o özelliği kapattım.

$mail->SMTPOptions = array( -- SMTP güvenlik doğrulama ayarları
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

$mail->Host = 'mail.dixot.com'; --- buraya mail göndermede kullanacağınız mail serverin sunucu adresini yazmanız gerekmektedir.
$mail->SMTPAuth = true;
$mail->Username = 'test@dixot.com'; --- buraya kullandığınız mail server üzerinden almış olduğunuz mail hesabınızı yazmanız gerekmektedir.
$mail->Password = 'sifre'; -- buraya kullandığınız mail hesabınızın şifresini girmeniz gerekmektedir.
$mail->SMTPSecure = 'ssl'; -- burayı 'ssl' veya 'tls' şeklinde ayarlayabilirsiniz, 'ssl' şekilnde ayarlamanız taktirde kullandığınız mail server üzerinden güvenli bağlantı yapacağınızı söylemiş olursunuz ki ona göre port ayarlaması yapmanız gerekecektir. Örneğin 'ssl' bağlantı için aşağıda görüldüğü gibi portu 465 olarak ayarladım, oysa 'tls' bağlantılar için portun 587 veya 25 olması gerekirdi, port ayarları kullandığınız mail server üzerinde hangi portların açık olduğu ile ilgilidir. Örneğin, SMTP.gmail.com mail serverini kullanıyorsanız buradan port ayarlarına bakabilirsiniz.
$mail->Port = 465;
$mail->SMTPKeepAlive = true;
$mail->From='kimden_gidecek@mail.com'; -- buraya yazdığınız mail adresi mailin hangi mail adresinden gittiğini gösterir.  
$mail->FromName='kimden'; -- mailin kim tarafından gönderildiğini gösterir. 
$mail->AddAddress('kime_gidecek@mail.com'); -- mailin kime gideceğinin mail adresini buraya yazıyoruz.
$mail->IsHTML(true);
$mail->SetLanguage("tr", "phpmailer/language");
$mail->CharSet  ="utf-8"; -- gidecek mailin türkçe karakter desteğini sağlaması için utf-8 ayarlaması
$mail->Encoding="base64";
$mail->Subject = 'Mesaj Konusu';
--- mesajın içeriğini oluşturan bölüm ağaşıdaki gibidir, buraya html kod ile istediğimiz şekilde mesaj gövdesini oluşturabilmemiz mümkündür.
$content = '
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Language" content="tr" />
<div style="background: #eee; padding: 10px; font-size: 14px; width: auto;">Bu bir test e-postasıdır, Türkçe karakter çözümünün kontrolü için gönderilmiş deneme bir maildir..</div>';
$mail->MsgHTML($content);
 --- mesajın ilgili adrese gönderilip gönderilmediğine dair dönüt almak için aşağıdaki kodu yazıyoruz.
if(!$mail->send()) {
    echo 'Mesaj gonderme basarisiz oldu..!';
    echo 'Mailer Error: ' .$mail->ErrorInfo;
} else {
    echo 'Mesaj basariyla gonderildi..';
}

?>

bu kadar, umarım işinize yaramıştır. Başarılar dilerim.

19 Ekim 2016 Çarşamba

PostgreSql'de Döngüler


PostgreSql'de IF - ELSIF - END İçinde FOR Döngüsü Kullanımı:


- PostgreSql veritabanı sorgulamalarında extradan herhangi bir yazılım platformu veya arayüzü kullanımına gerek kalmaksızın sorguları bir değişkene bağlayabilir, değişkenleri bir döngü içerisinde kullanarak istediğimiz değeri döndürecek fonksiyonlar yaratabiliriz. Bu fonksiyonlar, postgres'de bir defalığına derlendiğinden başka yazılım arayüzünden kullanmak üzere bu fonksiyonlara erişim yaptığımızda geliştirdiğimiz uygulamalar çok daha hızlı çalışacaktır. Aşağıdaki örnekte fonksinsert fonksiyonu tanımlanan koşullara bağlı olarak insert ve update işlemleri yapmaktadır.


CREATE OR REPLACE FUNCTION fonksinsert()
  RETURNS trigger AS
$BODY$

DECLARE a INTEGER; -- değişken tanımlama
DECLARE b INTEGER;
DECLARE c INTEGER;
DECLARE d INTEGER;

BEGIN
 --sql sorgulardan dönen sonuçların değişkenlere atanması
a:=(SELECT nrperiod from STSCMETRICTARGET where cdscmetric=8460 order by nryear,nrperiod desc limit 1);
b:=(SELECT nrperiod from STSCMETRICTARGET where cdscmetric=8462 order by nryear,nrperiod desc limit 1);
c:=(SELECT nrperiod from STSCMETRICTARGET where cdscmetric=8462 order by nryear desc limit 1);
d:=(SELECT count(nrperiod) from STSCMETRICTARGET where cdscmetric=8462 AND nrperiod is not null);


IF (a+1 > b) AND (c <> 1) AND (a+1 > d) THEN --- koşul 1
    IF (a+1 < 13) THEN --koşul 2

FOR b IN b..a LOOP  -- FOR -- IN 1..x LOOP döngüsü: örnekte b değişkenine bağlı olarak b'nin değerinden başlamak üzere a'nin değerine olan sayı farkı kadar döngü döner. Döngünün her dönüşünde aşağıdaki INSERT cümleciği işlenmektedir.

 INSERT INTO STSCMETRICTARGET (cdscmetrictarget,CDSCMETRIC,NRPERIOD, NRYEAR, VLWEIGHT, VLACTUAL) SELECT DISTINCT
(select cdscmetrictarget+1 from stscmetrictarget order by cdscmetrictarget desc limit 1) as cdscmetrictarget,
(select 8462 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as CDSCMETRIC,
(select NRPERIOD +1 from stscmetrictarget where cdscmetric=8462 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRPERIOD,
(select NRYEAR from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRYEAR,
(select VLWEIGHT from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLWEIGHT,
(select VLACTUAL from stscmetrictarget where cdscmetric=8460 AND nrperiod=b) as VLACTUAL
 FROM STSCMETRICTARGET where cdscmetric=8460 limit 1;

END LOOP; --- FOR döngü sonu
RETURN NULL;

    ELSE

INSERT INTO STSCMETRICTARGET (cdscmetrictarget,CDSCMETRIC,NRPERIOD, NRYEAR, VLWEIGHT, VLACTUAL) SELECT DISTINCT
(select cdscmetrictarget+1 from stscmetrictarget order by cdscmetrictarget desc limit 1) as cdscmetrictarget,
(select 8462 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as CDSCMETRIC,
(1) as NRPERIOD,
(select NRYEAR+1 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRYEAR,
(select VLWEIGHT from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLWEIGHT,
(select VLACTUAL from stscmetrictarget where cdscmetric=8460 AND nrperiod=b) as VLACTUAL
 FROM STSCMETRICTARGET where cdscmetric=8462 limit 1;

RETURN NULL;

    END IF;

ELSIF (a+1 = b) THEN

    IF (a+1 < 13) THEN

  UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY=DVY AND DVP+1=DAP) AD
  WHERE cdscmetric=8462 AND NRPERIOD=DVP+1 AND NRYEAR=DVY;

   RETURN NULL;
   EXIT;

    ELSE

   UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY+1=DVY AND DAP=1) AD
  WHERE cdscmetric=8462 AND NRPERIOD=1 AND NRYEAR=NRYEAR+1;
  RETURN NULL;
  EXIT;

   END IF;

ELSE

 UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY+1=DVY AND DAP=1) AD
  WHERE cdscmetric=8462 AND NRPERIOD=1 AND NRYEAR=NRYEAR+1;
RETURN NULL;

EXIT;
END IF;
END
$BODY$
  LANGUAGE plpgsql VOLATILE;

16 Ekim 2016 Pazar

Trigger'da Değişken Tanımlama ve İç İçe Döngü (PLPGSQL)



Hedef Tablo İçin Trigger Tanımlama:

- Aşağıda hedef tablo dediğimiz, hangi tablo üzerinde 'insert' veya 'update' yapıdığında trigger'in hangi fonksiyonu tetikleyeceği üzerinde değişiklik yapılacak tablo hedef tablo niteliğini almış olur.

CREATE TRIGGER stscmetrictarget_guncelle
  AFTER INSERT OR UPDATE
  ON STSCMETRICTARGET --- hedef tablo
  FOR EACH ROW                 ---- tetiklenecek fonksiyon hedef tablonun her satırı için geçerli olur
  WHEN (pg_trigger_depth()=0)

 EXECUTE PROCEDURE fonksupdate(); --- tetiklenecek olan fonksiyonun adı




Trigger'da İç İçe IF-ELSIF-ELSE-END Döngüsü ve Değişken Tanımlama




Trigger'da Değişken Tanımlama:

- PostgreSql'de yazdığımız trigger'da bazen değişken tanımlama gereksinimi duyarız, değişken tanımlama şekli aşağıdaki gibi olmalıdır:



CREATE OR REPLACE FUNCTION fonksupdate()
  RETURNS trigger AS
$BODY$

DECLARE a INTEGER; -- a,b ve c değişkenlerinin tamsayı değeri taşıyacağını gösterir.
DECLARE b INTEGER;
DECLARE c INTEGER;

BEGIN
--- 'Begin' den önce tanımlamış olduğumuz değişkenlere sql sorgudan değer ataması aşağıdaki gibi yapılır. Böylece sorgunun sonucu üstte tanımlanan değişkenlere aktarılmış olur.  
SELECT INTO a nrperiod from STSCMETRICTARGET where cdscmetric=8460 order by nryear,nrperiod desc limit 1;
SELECT INTO b nrperiod from STSCMETRICTARGET where cdscmetric=8462 order by nryear,nrperiod desc limit 1;
SELECT INTO c nrperiod from STSCMETRICTARGET where cdscmetric=8462 order by nryear desc limit 1;




Trigger'da İç İçe IF-ELSIF-ELSE-END Döngüsü:


BEGIN

IF ---koşul--- THEN
-------
ELSIF ---koşul--- THEN
-------
ELSE
IF ---koşul--- THEN
------
ELSE
------
END IF;
END IF;

END --- şeklinde yazılabilir.

- Algoritma mantığına göre üstteki sıra değişebilir ancak her 'if ' döngüsü için bir 'end if' yazmayı unutmamak gerekir. Aşağıdaki örnekte iç içe değil de farklı koşullar barındıran alt alta tanımlı IF-END IF bloklarından oluşan bir algoritma yer almaktadır.


BEGIN

IF ---koşul --- THEN
  IF ---koşul ---THEN
    ------------
  ELSE
    ------------
END IF;
END IF;

IF ---koşul --- THEN
  IF ---koşul ---THEN
    ------------
  ELSE
    ------------
END IF;
END IF;

END


- Döngüde yer alan a ve b değişkenlerine nasıl değer aktarıldığı yukarıdaki gibidir, tanımlanan bu değişkenlerin döngüde nasıl kullanıldığı ise aşağıdaki gibidir.


IF (a+1 = b) THEN --- PostgreSql'de = işareti karşılaştırma operatörü olarak eşitliği simgeler.

  IF (a+1 < 13) THEN

  UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY=DVY AND DVP+1=DAP) AD
  WHERE cdscmetric=8462 AND NRPERIOD=DVP+1 AND NRYEAR=DVY;

RETURN NULL;

EXIT; --- üstteki sql komutu işlendikten sonra döngüden çıkış sağlamak için exit; komutu kullanılır.


   ELSE

   UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY+1=DVY AND DAP=1) AD
  WHERE cdscmetric=8462 AND NRPERIOD=1 AND NRYEAR=NRYEAR+1;
RETURN NULL;

EXIT;
 
END IF; --- döngü sonu
END IF;

IF (a+1 <> b) AND (c <> 1) THEN --- PostgreSql'de eşitsizliği tanımlamak için <> veya != karşılaştırma operatörlerinden birini kullanabiliriz.
   IF (a+1 < 13) THEN

   INSERT INTO STSCMETRICTARGET (cdscmetrictarget,CDSCMETRIC,NRPERIOD, NRYEAR, VLWEIGHT, VLACTUAL) SELECT DISTINCT
(select cdscmetrictarget+1 from stscmetrictarget order by cdscmetrictarget desc limit 1) as cdscmetrictarget,
(select 8462 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as CDSCMETRIC,
(select NRPERIOD +1 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRPERIOD,
(select NRYEAR from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRYEAR,
(select VLWEIGHT from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLWEIGHT,
(select VLACTUAL from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLACTUAL
 FROM STSCMETRICTARGET where cdscmetric=8462 limit 1;
RETURN NULL;

EXIT;
ELSE

INSERT INTO STSCMETRICTARGET (cdscmetrictarget,CDSCMETRIC,NRPERIOD, NRYEAR, VLWEIGHT, VLACTUAL) SELECT DISTINCT
(select cdscmetrictarget+1 from stscmetrictarget order by cdscmetrictarget desc limit 1) as cdscmetrictarget,
(select 8462 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as CDSCMETRIC,
(1) as NRPERIOD,
(select NRYEAR+1 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRYEAR,
(select VLWEIGHT from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLWEIGHT,
(select VLACTUAL from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLACTUAL
 FROM STSCMETRICTARGET where cdscmetric=8462 limit 1;
RETURN NULL;

EXIT;

END IF;
END IF;

IF (a+1 <> b) AND (c = 1) THEN

 UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY+1=DVY AND DAP=1) AD
  WHERE cdscmetric=8462 AND NRPERIOD=1 AND NRYEAR=NRYEAR+1;
RETURN NULL;

EXIT;
END IF;

END --- BEGIN sonu
$BODY$
  LANGUAGE plpgsql;

8 Ekim 2016 Cumartesi

PHP'de CSV Doyası Oluşturma:




PHP'de Veritabanından Veri Çekerek CSV Dosyası Oluşturma:


// Veritabanına Bağlanma //

<?php

 $host        = "host=domain_adresi";
 $port        = "port=5432";
 $dbname      = "dbname=veritabani_adi";
 $credentials = "user=veritabani_kullnici password=veritabani_sifre";
 $db = pg_connect( "$host $port $dbname $credentials"  );

// Veritabanına Bağlanamama Durumunda JavaScript ile Alert  Verme //

 if(!$db)
{
     echo '<script language="javascript">';
     echo 'alert("Veritabanina baglanma hatasi..!")';
     echo '</script>';
     exit;
 }



//Veritabanından Gelecek Veriler ile CSV Dosyası Oluşturma  //

function cleanData(&$str)
{
$str = preg_replace("/\t/", "\\t", $str);
$str = preg_replace("/\r?\n/", "\\n", $str);
if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
}



$filename = "website_data_" . date('Ymd') . ".xls";

$option=$_POST['name'];// post yolu ile önceki .php sayfasındaki formun name="name" nesnesinden veri çekmek 
$start_date=$_POST['start_date'];// post yolu ile önceki .php sayfasındaki formun name="start_date" nesnesinden veri çekmek 
$end_date=$_POST['end_date'];



header("Content-Disposition: attachment; filename=\"$filename\"");

header("Content-Type: application/vnd.ms-excel");


$flag = false;

$result = pg_query("Select * from table_name") or die('Veritabanı hatası..!');

pg_close($db);


while(false !== ($row = pg_fetch_assoc($result))) {

if(!$flag) {

  // display field/column names as first row

echo implode("\t", array_keys($row)) . "\r\n";
$flag = true;

}

array_walk($row, 'cleanData');
echo implode("\t", array_values($row)) . "\r\n";

}

exit;
?>


PHP'de Takvim Uygulaması


PHP'de Datepicker (Takvim) ile SQL'de Kullanımı:

Bu makalede php'de postgresql ile veritabanına bağlanma  ve takvim oluşturarak oluşturduğumuz takvimden gelecek tarih değerlerini sql de nasıl kullanıldığını anlatacağım.



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

// Datepicker(Takvim) Nesnesi için css ve js Kütüphanelerinin Yüklenmesi //

<link rel="stylesheet" href="datepicker.css" />// Datepicker(Takvim) nesnesinin bu css/js kütüphanelerinin kullanımına şu siteden bakabilir ve şu siteden temin edebilirsiniz. Daha sonra bu dosyaları php uygulaması için oluşturmuş olduğunuz aynı klasöre attığımızda link ve src yollarında dizin işlemlerine yönelik herhangi bir değişiklik yapmamıza gerek kalmaz. 

<link rel="stylesheet" href="bootstrap.css" />
<script src="jquery-3.1.1.min.js" />
<script src="bootstrap-datepicker.js" />



// Datepicker(Takvim) Nesnesi Fonksiyonunu Çağırma//

<script>
$(function(){
 $('.datepicker').datepicker();
});

</script>



// Veritabanına Bağlanma //

<?php

 $host        = "host=domain_adresi";
 $port        = "port=5432";
 $dbname      = "dbname=veritabani_adi";
 $credentials = "user=veritabani_kullnici password=veritabani_sifre";
 $db = pg_connect( "$host $port $dbname $credentials"  );

// Veritabanına Bağlanamama Durumunda JavaScript ile Alert  Verme //

 if(!$db)
{
     echo '<script language="javascript">';
     echo 'alert("Veritabanina baglanma hatasi..!")';
     echo '</script>';
     exit;
 }

?>

<title>CSV Download</title>
</head>
<body>

// Form (POST) Yoluyla Başka Bir .php Dosyasına Değişken Aktarma //

<form action="phpcsv.php" method="post">// method="post" formun "post" yolu ile action="" da tanımlı .php sayfasına veri aktarabileceğini gösterir. diğer sayfadan veri istenirken de post yolu ile istenmelidir. action="" ise post yolu ile hangi .php sayfaya veri göndermek istediğimizi belirtiriz.
bu örnekte formdaki nesnelerden "phpcsv.php" adlı sayfaya veri post edebileceğimizi belirttim.

<table border="1" cellspacing="2" cellpadding="2">
<tr>
<td><font size="3" color="darkred">CSV Dosyasini buradan indirebilirsiniz.</font></td>
</tr>
<tr>
<td>

// HTML'de Dropdown Tanımlama //

 <select name="name">  // formun post işlemi için php'de diğer dosyadan dropdown nesnesinin name="name" ismi çağrılır.  name hangi .php dosyadan çağrılacaksa name içeriğinin aynı olmasına dikkat edilir. 

<option id="0">Lutfen material kriteri seciniz</option>// burada dropdown nesnesinde listelenecek satırları tanımlıyoruz. Unutmamalıyız ki seçilen satırın option value="" içeriği nesnenin name="name" değişkeni üzerinden istenen sayfaya "post" edilebilir.
<option value="Packaging Materials">Packaging Materials</option>
<option value="Security Materials">Security Materials</option>
<option value="Size Stickers">Size Stickers</option>
<option value="Visual Materials">Visual Materials</option>
<button>Submit</submit>// submit ile dropdowndan seçilen satıra bağlı value="" değeri formdan karşıki .php sayfasına post edilir.
 
</select>
</td>
</tr>
<tr height="10">
<td>
<div class="well">// burada indirmiş olduğumuz css dosyalarından div üzerinden class="" çağırmayı görüyoruz.


// Datepicker(Takvim) Nesnesi Oluşturma //

 Start Date: // Datepicker(takvim) nesnesi için input oluşturma: inputa tıklandığında takvim açılacak takvimden seçilen değer tarih formatında inputa aktarılacak.

<input class="datepicker" type="text" name="start_date" size="20" style="font-family:arial;font-size:10">

</div>
</td>
</tr>
<tr><td>

<div class="well">
 End Date:
<input class="datepicker" type="text" name="end_date" size="20" style="font-family:arial;font-size:10">

</div>
</td>
</tr>
</table>

</form>
</body>
</html>