14 Aralık 2016 Çarşamba

Windows Servis ve WCF Web Servisleri



                       
                             Windows Servisi Olarak WCF Web Servisi Yayınlama


C#'da WCF Servislerini Windows Servisi olarak yayınlamak için izlenecek adımlar:

1- Visual Studio açılır, platforumun sol tarafındaki Visual C# sekmesi altından WCF'ye tıklanarak WCF Service Library seçilerek yeni bir WCF kütüphanesi oluşturulur. Açılan yeni WCF Library projesi arayüzünün sağ tarafındaki Solution Explorer  panelinde oluşturmuş olduğumuz yeni wcf servisi adı altında Service1.cs ve IService1.cs classlarının oluşmuş olduğu görülecektir. Oluşturmuş olduğumuz projeye default olarak eklenen bu örnek class'lar istenirse silinir veya editlenerek yazmak istediğimiz kendi kodumuzu yazabiliriz. Projeyle örnek olarak gelen classları sildiğimiz taktirde kendi classlarımızı oluşturmak için proje adı üzerine sağ tıklanarak Add New Item -> Class diyerek kendi classımızı oluşturabiliriz. Aynı şekilde oluşturduğumuz classın implementi için örnekteki gibi Interface class oluşturabiliriz. Oluşturduğumuz Interface classın kütüphane tanımlama bölümüne using System.ServiceModel; kütüphanesini eklememiz gerekir. Public Interface IService classın üst kısmına [ServiceContract] kodunu eklememiz gerekir. Ayrıca classta tanımlayacağımız her fonksiyon için tanımladığımız fonksiyonun üst kısmına [OperationContract] kodunu eklememiz gerekir. Daha sonra interface classı normal class üzerinde :IService1 şeklinde implemente ederek gerekli kodu yazarız. Tanımlanan classı daha sonra windows service'den çağıracağımız için public yapmamız gerekir.

2- Oluşturmuş olduğumuz projeye Add New Project diyerek sol paneldeki Visual C# sekmesi altından Windows seçilerek Windows Service projesi oluşturulur. Oluşturulan projenin Solution Explorer paneli altındaki App.config sağ tıklanarak Edit WCF Configuration tıklanır. Açılan pencerede Services bölümünde Create a New Service -> Service Type browse'tan oluşturmuş olduğumuz projenin klasörü açılır: -> Bin->Debug->Service.dll seçtikten sonra Next diyerek bir sonraki aşamalara geçilir. Communication Mode aşamasında HTTP seçili bırakılır, bir sonraki adımda Basic Web Services İnteroperability seçili bırakılır, address of your endpoint adımında http:// yazan yere bir endpoint adı sallanır. Tüm bu işlemler tamamlandıktan sonra Configuration penceresinin sol tarafında yer alan Host  çift tıklanarak ardından New buttonuna tıklanır ve Base address PC'mizin ip adresi http://192....:8080 numarası şeklinde girilir. Not: port numarası değiştirilebilir. IP adresini öğrenmek için command promt penceresinde ipconfig yazmak yeterlidir.
Bu işlemi de bitirdikten sonra Configuration panelinde Advanced sekmesi seçilir. Bir alt sekmedeki Service Behaviors tıklanır, ardından gelen panelin Add butonundan serviceMetadata seçilir, ardından new behavior yerine behavior ismi verilerek bu işlem de tamamlanmış olur. Oluşturulmuş olan yeni behavior sekmesine tıklanarak gelen serviceMetadata penceresinden HttpGetEnabled özelliği true yapılır. Daha sonra oluşturulmuş olan bu behavior özellikleri Services sekmesi altındaki oluşturmuş olduğumuz webservisin adına tıklanarak behaviorConfiguration olarak seçilir.



3- Solution Explorer penceresinden Add Reference tıklayarak yapmış olduğumuz WebService.dll dosyasını ve Assemblies->Framework tıklayarak System.ServiceModel kütüphanelerini import ediyoruz.

4- Windows Serivce'nin Service1.cs tıklayarak açılan Design panelde boşlukta sağ tıklayarak Add Installer tıklanır. Böylece oluşturmuş olduğumuz serviceInstaller1 sekmesi üzerine sağ tıklanarak Properties'ten panelin sağ tarafta çıkan Service Name ayarlanır, Start Type Manual olarak bırakılır. serviceProcessInstaller1 sekmesine sağ tıklanarak sağ tarafta çıkan Account  ayarı LocalSystem olarak ayarlanır. Ardından Service1.cs nin click here to switch to code view tıklanarak windows servisi başlatma ve kapama için gereken kodlar yazılır:
ilk önce using System.ServiceModel; tanımlanır, ardından aşağıdaki gibi wcf açma kapama komutları yazılır.

       ServiceHost sh;
        public Service1()
        {
            InitializeComponent();
        }
      protected override void OnStart(string[] args)
        {
            sh = new ServiceHost(typeof(VeriTransfer.VeriGonder));//Referans olarak göstermek için import ettiğimiz wcf servis dosyasını buraya çağırıyoruz. Burada görüldüğü gibi benim WCF web servisimin adı VeriTransfer 'dir.
            sh.Open();
        }

        protected override void OnStop()
        {
            sh.Close();
        }

5- Şuana kadar hazırlamış olduğumuz windows service'nin pc'ye yüklenmesi, Installutil.exe ve windows servisi uygulamamızın kaynak dosyası dizini kullanılarak yapılır. Bunun için command prompt açılır ve kendi windows servis klasörünüzün yolunu bu örneğe editleyerek şu şekilde komut yazılır:

Install :

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe" "C:\Users\Surec\Documents\Visual Studio 2013\Projects\VeriTransfer\WindowsServiceWCF\bin\Debug\WindowsServiceWCF.exe"


Uninstall :

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe"  -u "C:\Users\Surec\Documents\Visual Studio 2013\Projects\VeriTransfer\WindowsServiceWCF\bin\Debug\WindowsServiceWCF.exe"


tüm bu işlemleri yukarıdaki 5 adımı da sorunsuz şekilde yaptığımız taktirde Görev Yöenticisi açarak ->Hizmetler sekmesini tıkladığımızda yapmış olduğumuz windows servisini diğer servisler arasında görebileceğiz.








Muhtemel Hatalar :



This service on local computer started and then stopped. some services stop automatically if then are not in use by other servces or programs

yukarıdaki hatayı aldığımız taktirde öncelikle servisimizin kodlarını kontrol etmemiz gerekiyor öyle ki:
      -  ismini değiştirmiş olduğumuz classların değiştiştirilmesi gereken veya class ile aynı isme sahip olması gereken yerleri incelemek gerekir.
     -  daha sonra hem wcf library'nin olduğu App.Config dosyası incelenmeli hem de windows servisin App.Config dosyası incelenmeli yukarıdaki App.Config ayarları iki taraf için de Edit WCF Configuration üzerinden eksiksiz yapılmalıdı en son ayarlar ile proje Build edilmelidir.














9 Aralık 2016 Cuma

IIS (Internet Information Services) Nedir? IIS'de Web Sitesi Yayınlama



                                          

                                            IIS (Internet Information Services) Nedir?


IIS en basit anlatımla Microsoft'un web sunucusudur. Microsoft tabanlı web sayfalarının ve uygulamalarının barındırıldığı sunucu Internet Information Services (IIS) diye anılır. Buradan anlaşılacağı üzere Asp.net web uygulamaları IIS üzerinde barındırılır ve IIS üzeerinden çalıştırılarak yayınlanabilir. İstemcinin isteklerini sunucuda IIS karşılar ve cevaplandırır. IIS'in varsayılan portu 80 dir.

IIS hosting hizmeti veren kuruluşların Windows tabanlı sunucularında kullanılır. Ayrıca localhost'ta IIS kurulumu yaparak geliştirmiş olduğumuz Asp.net uygulamalarını kendi bilgisayarımız üzerinde de çalıştırabiliriz. Şuanki IIS versiyonu IIS8'dir. Asp.Net geliştirmek için Visual Studio kullanılıyorsa ayrıyeten IIS kurmamıza gerek yoktur.

IIS hosting hizmetini localhost'a kurmak için yapmamız gereken: Başlat -> Denetim Masası -> Windows Özelliklerini Aç/Kapat sekmelerini izleyerek açılan pencereden Internet Information Services seceneğini aktif ettiğimizde sistem IIS için gerekli yazılımı otomatik kuruyor.



                                                IIS'de Web Sitesi Yayınlama


Asp.Net'te yapmış olduğumuz web tabanlı uygulamayı kendi bilgisayarımızda yayınlamak istiyorsak IIS içerisinde ASP.NET barındırılıyor olması gerekir. IIS dışarıdan gelen çağrıları yanıtlayabilemk için varsayılan olarak 80 portu dinler ve gelen talepleri uygun altyapıya devrederek dışarıya HTML çıktısını verir. Biz de geliştirmiş olduğumuz Asp.Net uygulamalarını yayınlamak için IIS üzerinde gerekli konfigürasyonları yapmamız gerekir. Bir Asp.Net uygulamasını IIS üzerinden yayınlamak istiyorsak, IIS üzerinde sanal dizin (Virtual Directory) adını verdiğimiz yapıları kullanmamız gerekir.

Yeni bir web sitesi yayınlamak için ilk olarak Denetim Masası'ından Yönetimsel Araçlar bölümüne geçilip Internet Information Services(IIS) kısa yoluna tıklanarak IIS'in yönetim penceresi açılır.




Yönetimsel Araçlar bölümünden IIS’e çift tıklandığında IIS’in yönetim penceresi açılıyor olacaktır. Bu pencere aracılığı ile IIS üzerinde bulunan siteler görülüp, özellikleri ayarlanabilir ya da yeni bir site eklenebilir. Yeni bir site eklemek için Siteler üzerinde (Sites) mouse’ın sağ tuşu ile tıklanıp açılan menüden Add Web Site(Web Sitesi Ekle) seçeneği seçilmelidir. 




Yukarıdaki işlemden sonra sanal site adı ve fiziksel dosyaların saklanacağı yer soruluyor olacaktır. Site adı bölümüne istediğimiz ismi yazdıktan sonra fiziksel yol (Physical Path) bölümünden de fiziksel dosyalarımızın, yani ASP.NET dosyalarımızın, bulunduğu bölümü seçiyoruz. Ana bilgisayar adı olarak bölümüne www.domainAdı.com değerini yazarak ve Tamam diyerek web sitemizi IIS üzerinde hazır hale getiriyoruz. IP Adresi üzerinden web uygulamamıza IP Adresi üzerinden erişmek istiyorsak IP adresi değerini seçmemiz gerekir. 80 Port default olarak kalırsa ileride olası hataları almamak için daha iyi olur.



  

                         IIS ile ilgili işlemlerden sonra sitemiz kendi bilgisayarımız üzerinde yayınlamak için C:\Windows\System32\drivers\etc dizini altındaki hosts dosyasını aşağıdaki ekranda görüldüğü gibi değiştirerek kaydediyoruz.






 Çıkabilecek Olası Hatalar

 1 -

HTTP Error 401.3 - Unauthorized You do not have permission to view this directory or page because of the access control list (ACL) configuration or encryption settings for this resource on the Web server.

Böyle bir hata alındığı taktirde öncelikle yayınlamak istediğimiz Asp.Net uygulamasının kullandığı Application Pool'u değiştirmeyi denememiz gerekir. Ya da uygulamamızın kullanıyor olduğu Application Pool'un ayarlarını kontrol etmemiz gerekiyor. Ben öyle bir hata aldığımda alttaki resimlerde görüldüğü gibi Asp.Net uygulamamın kullanıyor olduğu DefaultAppPool'u .Net v4.5 Classic ile değiştirdim. Aşağıdaki ayar penceresini açmak için IIS'de yayınlamak istediğimiz Web Sitesinin IIS arayüzünde sol taraftaki adının üzerine mouse'la sağ tuşlayarak Manage Website -> Advanced Setting.. yolunu izlememiz gerekir.



Web sitemizin IIS üzerinde kullandığı pool ayarlarına bakmak için şöyle bir yol izlenmelidir: IIS arayüzünün sol tarafındaki sekmelerden Application Pools -> 

uygulamamızın kullandığı Application Pool'un üzerine mouse ile sağ tuşalayarak aşağıdaki gibi Advanced Settings arayüzünden ayarlar yapılmalıdır.


Identity ayarının ApplicationPoolIdentity olması gerekir.

Ayrıca yukarıdaki hatayı almamak için IIS ayarlarından Authentication ayarlarını yapmamız gerekiyor.



Aşağıdaki görüntüdeki gibi işaretli yerlerin Enabled olarak ayarlanmış olması gerekir.


Ayrıca Anonymous Authentication ayarları için mouse ile üzerine sağ tuş  Edit yaparak aşağıdaki gibi Application Pool Identity seçeneğinin seçili olması gerekir. 





2- 

                                               HTTP Error 403.14 - Forbidden

                                               The Web server is configured to not list the contents of this directory.


Böyle bir hata alındığında ise IIS ayarlarından Directory Browsing ayarına çift tıklayarak Actions durumunu Enabled  yapmamız gerekir.






7 Aralık 2016 Çarşamba

SQL Tabloyu Kendisi Ile Eslestirme



                                       


                                             TABLOYU KENDISI ILE ESLESTIRME:



   SQL'de bazi senaryolara gore tablodaki verilerin ayni tablodaki baska verilerle eslestirilmesi gerekebilir. Asagida yazdigim sorguya gore senaryoda bir sistemin kullanicilarinin liderleri listelenmek istenmistir. Hangi kullanicinin lideri kim ise o kullaniciya bagli liderin ismi ayni tablodan gelecek sekilde karsisina listelenmek istenmistir. Buna gore sorgu asagidaki gibi olmalidir:






SELECT u.cduser,u.nmuser,l.cdleader.l.nmuser FROM aduser as u LEFT OUTHER JOIN aduser as l ON u.cdleader=l.cduser








1 Aralık 2016 Perşembe

XML Webservis Erişim Hatası



                                           XML Webservis Bağlantı Hataları 


C# üzerinden webservislere bağlantı kurma hatası: 


İstemci, yanıt içeriği türünün 'text/html; charset=utf-8' olduğunu algıladı, ancak 'text/xml' bekliyordu.
İstek şu hata iletisini verdi:
--
<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 17272948368014415989</body></html>


Çözüm: Güvenli bağlantı (ssl) kullanıcı giriş bilgileri doğru girildiği taktirde öyle bir hataya maruz kalınıyorsa, bağlanılmaya çalışılan wsdl adresi altındaki servisin istemci IP'sini reject etme durumudur. Bunun çözümü için istemci IP'sinin webservis sunucusunda tanımlanması veya webservis locali çerçevesinde vpn üzerinden tekrar bağlanılması gerekmektedir. Aksi halde servisi veren ilgili kuruma ticket açarak durumdan haberdar edilmesi gerekir.

30 Kasım 2016 Çarşamba

SSL Nedir Ne İşe Yarar ?


      
        SSL ve Kullanım Amacı Nedir?


       SSL'in açılımı, Secure Sockets Layer (Güvenli Giriş Katmanı)'dır. SSL, güvenlik prosedürü çerçevesinde server ile alıcı iletişimi sırasında verilerin şifrelenmesi işlemidir. En bilinen kullanımı ise, web sitelerinin web servisleri ile veri alışverişi sırasında, server ile browserlar arasındaki iletişimin şifrelenmesidir.

        SSL, standart bir algoritmadan oluşmaktadır. Güvenli veri iletişimi için birçok web sitesi SSl teknolojisini kullanmaktadır. SSL işleminin çalışması için server tarafında bir anahtar ve alıcı tarafında çalışacak bir sertifika olması gerekmektedir.

        SSL Sertifikaları Hakkında Genel Bilgiler:

 1-  SSL sertifikaları, site adreslerinin doğruluğunu kontrol eden, iki nokta arasındaki veri iletişimini şifreli kanal üzerinden yaparak güvenli bir şekilde yapılmasını sağlayan bir üründür. Ancak SSL sertifikaları hiç bir zaman yazdığımız kodun veya web sitelerinin virüslere karşı güvenliğini sağlamaz. 

2-  SSL sertifikaları sundukları garantiye, destek hizmetine ve ek özelliklere göre farklılık arz etmektedirler. Temelde tüm sertifkaların sağladığı teknik kazanım aynıdır.

3- SignSec, Comodo, Rapid ürünleri, SSL kullanmak isteyen tüm tekil internet adresleri için uygundur.

4- Wildcard SSL ürünleri internet adresindeki alt isimleri de destekler. Örneğin; www.isimtescil.net, isimtescil.net, admin.isimtescil.net, *.isimtescil.net

5- SSL network üzerindeki bilgi transferi sırasında güvenlik ve gizliliğin sağlanması amacıyla Netscape tarafından geliştirilmiş bir güvenlik protokolüdür.

6- SSL gönderilen bilginin kesinlikle ve sadece doğru adreste deşifre edilebilmesini sağlar. Bilgi gönderilmeden önce otomatik olarak şifrelenir ve sadece doğru alıcı tarafından deşifre edilebilir. Her iki tarafta da doğrulama yapılarak işlemin ve bilginin gizliliği ve bütünlüğü korunur.

7- Veri akışında kullanılan şifreleme yönteminin gücü kullanılan anahtar uzunluğuna bağlıdır. Anahtar uzunluğu bilginin korunması için çok önemlidir. Örneğin; 8 bit üzerinden bir iletimin çözülmesi son derece kolaydır. Bit, ikilik sayma düzeninde bir rakamı ifade eder. Bir bit, 0 veya 1 olmak üzere 2 farklı değer alabilir. 8 bit ise sadece 28=256 olası farklı anahtar içerir. Bir bilgisayar bu 256 farklı olasılığı sıra ile inceleyerek bir sonuca ulaşabilir. SSL protokolünde 40 bit ve 128, 256, 1024 bit şifreleme kullanılmaktadır. 128 bit şifrelemede 2128 değişik anahtar vardır ve bu şifrenin çözülebilmesi çok büyük bir maliyet ve zaman gerektirir. Kötü niyetli bir kişinin 128 bit'lik şifreyi çözebilmesi için 1 milyon dolarlık yatırım yaptıktan sonra 67 yıl gibi bir zaman harcaması gerekir. Bu örnekten anlaşıldığı gibi SSL güvenlik sistemi tam ve kesin bir koruma sağlar.


     Özellikleri :

  • - Mesajların şifrelenmesi ve deşifre edilmesindeki güvenlik ve gizliliği sağlar.
  • - Mesajı gönderenin ve mesajı alanın doğru yerler olduğunu garanti eder.
  • - İletilen dokümanların tarih ve zamanını doğrular.
  • - Doküman arşivi oluşturulmasını kolaylaştırır.
  • - Gelen verinin kodlaması ve şifreyi çözmesi esnasında güvenlik ve gizliliği sağlar
    - Veriyi gönderenin ve veriyi alanın doğru yerler olduğunu garanti eder.

  •  Sertifikasyon Kurumu
          Dijital sertifikaların verilmesi ve yönetilmesini gerçekleştiren kurumlardır. Dijital sertifikalar bu kurumların gizli anahtarıyla imzalanır. Türkiye’deki SSL desteği veren firmalar, yurtdışındaki firmaların temsilciklerini yapmaktadır. Bu yüzden kimlik doğrulamaları yurtdışında veya yurt dışındaki firmanın formatı üzerinden yapılması gerekmektedir. SSL sertifikaları bütün internet tarayıcılarında büyük oranda sorunsuz şekilde desteklemekte ve çalışmaktadır
          SSL Nasıl Çalışır ?
          SSL Public Key/Private Key adı verilen anahtarların kullanımına dayalı bir kodlama yöntemine dayalıdır.
          SSL kodlama için iki adet anahtar bulunmaktadır. Bu anahtarlar, dijital ortamda kodlanmış yazılımlardır. Bir anahtarın kitlemiş olduğu veriyi, sadece diğer anahtar açabilir. Anahtarlarınızı yarattıktan sonra (SSL default olarak bu işlemi yapmaktadır, sizin herhangi bir işlem yapmanıza gerek yoktur), anahtarlardan biri (private key) sizde kalır. Diğer anahtar (public key) ise, bağlantı kurmak istediğiniz kişilere gönderilir.
          Dışarıdan sizinle iletişime geçmek isteyen kişi, public key’i kullanarak mesajı güvenli bir şekilde size gönderir. Veri, size ulaşmadan, transfer sırasında veriye ulaşılsa bile, şifrenin çözülmesi için sizde bulunan private key gerekecektir. SSL türüne göre 40 bit veya 128 bit şifreleme kullanılmaktadır. Bu karmaşıklıktaki şifrelemenin çözülmesi ileri tekniklerle dahi çok zaman alacaktır.
          Kısaca SSL veri alışverişi yapan bilgisayarların, herhangi bir kişinin veriye müdahale etmesini önleyerek, sadece veri alışverişi yapan bilgisayar arasında, güvenli bir şekilde verinin aktarılmasını sağlar.
          
      

29 Kasım 2016 Salı

C# AcceptButton - CancelButton


C#'da Klavye Üzerinden Enter ve Esc Tuşlarını Form Üzerindeki Buttonlara Yönlendirme:

C#'da klavyeden enter ve esc tuşlarının form üzerindeki buttonlara yönlendirmek için form özelliklerinden AcceptButton ile CancelButton ayarlarına form üzerindeki butonlardan hangisine atamak istiyorsak bu iki özelliğin karşısına o buttonların adlarını yazmamız gerekir. 

Accept Button: Form üzerinde Enter tuşuna basıldığında çalıştırılacak olan butonu belirlememizi sağlar.
Cancel Button: Form üzerinde ESC tuşuna basıldığında çalıştırılacak olan butonu belirlememizi sağlar.



Form üzerinde bulunan butonlardan istenilen butona AcceptButton özelliği verilebilir. Bunu yapmak için Form üzerinde boş bir alan fare ile tıklanır. Daha sonra properties penceresinde AcceptButton özelliğinde hangi butona bu özellik verilmek isteniyorsa o buton seçilir.
Bu işlemin aynısı CancelButton için uygulanabilir. Ayarlanan butona yazılacak kodlar klavyeden “ESC” tuşuna basıldığında çalışacaktır.


12 Kasım 2016 Cumartesi

Veritabanından E-Mail Gönderme


PostgreSQL Veritabanı Yönetim Sisteminden E-Mail Gönderme:  Bu yazımda postgresql üzerinde yazılmış bir fonksiyon aracılığıyla kullanıcılara nasıl mail gönderebileceğimizi anlatacağım. Mail göndermede kullandığım fonksiyon pl/tcl dilinde kodlandığı için ilk olarak postgresql'in tcl dil desteği eklentisini yüklememiz gerekecektir.

- PostgreSQL veritabanı yönetim sistemi birden fazla dil desteği sunmaktadır, desteklenen diller PL adı altında pgAdmin arayüzünden, Databases - <kullandığımız veritabanının adı> - Extensions - New Extension.. sekmelerini takip ettiğimizde karşımıza çıkan eklentiler arasında yer alır. PostgreSQL in sql dili için kullandığı default dil 'plpgsql' dir. Extensions olarak karşımıza çıkabilecek desteklenen diğer diller ise, plperl,plpython,pltcl dilleri procedural diller olarak geçmektedir. Saydığım bu dillerin haricinde postgresql  xml,java,php yazılım dillerini de procedural olarak destekleyebilmektedir. Procedural dememizdeki kasıt, bu yazılım dillerini kullanarak pgAdmin konsolunda fonksiyon veya procedure yazarak sql ifadelerinde olduğu gibi yazdığımız fonksiyon veya prosedürleri select ile çağırarak istediğimiz yerde kullanabileceğiz.


 - Aşağıdaki mail göndermede kullandığım fonksiyonu çalıştırabilmemiz için postgresql'in pl/tcl desteğini sağlamamız gerekir. PostgreSQL'de procedural dil desteğinin nasıl sağlandığına dair daha fazla bilgi edinmek isteyen konuyu buradan takip edebilir.


CREATE OR REPLACE FUNCTION send_pgmail( text, text, text, text)
  RETURNS integer AS
$BODY$
set mailfrom $1
set mailto $2
set mailsubject $3
set mailmessage $4
set myHost "<sunucu adresi>" -- buraya maili hangi mal server üzerinden gönderecekseniz o mail server'in host adresini yazmanız gerekmektedir.
set myPort 25 -- buraya kullandığınız port numarasını yazmanız gerekir, yazmanız taktirde sistem default olarak 25 portu üzerinden mail göndermeyi deneyecektir.
set mySock [socket $myHost $myPort]
set toemailaddress_start [string first "<" $mailto]
if {$toemailaddress_start != -1} {
set toemailaddress_finish [string first ">" $mailto]
set toemailaddress_start [expr $toemailaddress_start + 1]
set toemailaddress_finish [expr $toemailaddress_finish - 1]
set toemailaddress [string range $mailto $toemailaddress_start $toemailaddress_finish]
} else {
set toemailaddress $mailto
}
set fromemailaddress_start [string first "<" $mailfrom]
if {$fromemailaddress_start != -1} {
set fromemailaddress_finish [string first ">" $mailfrom]
set fromemailaddress_start [expr $fromemailaddress_start + 1]
set fromemailaddress_finish [expr $fromemailaddress_finish - 1]
set fromemailaddress [string range $mailfrom $fromemailaddress_start $fromemailaddress_finish]
} else {
set fromemailaddress $mailfrom
}
fileevent $mySock writable [list svcHandler $mySock]
fconfigure $mySock -buffering line
puts $mySock "HELO <veritabanı adresi>" -- kullandığınız veritabanı hangi makinada yüklü ise o makinanın veritabanı sunucu adresini buraya yazmanız gerekmektedir.
gets $mySock name
puts $mySock "MAIL FROM: $fromemailaddress"
gets $mySock name
puts $mySock "RCPT TO: $toemailaddress"
gets $mySock name
puts $mySock "DATA"
gets $mySock name
puts $mySock "From: $mailfrom"
puts $mySock "To: $mailto"
puts $mySock "Subject: $mailsubject"
puts $mySock "MIME-Version: 1.0"
puts $mySock "Content-type: text/plain; charset=UTF-8"
puts $mySock "Content-Transfer-Encoding: 8bit"
puts $mySock ""
puts $mySock "$mailmessage"
puts $mySock ""
puts $mySock "."
gets $mySock name
puts $mySock "QUIT"
gets $mySock name
close $mySock
return 1$BODY$

  LANGUAGE pltclu VOLATILE




Fonksiyonun SQL Editörde Kullanımı:
  select send_pgmail('gonderen@mail.com','alici@mail.com','mail konusu','mail icerik');

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>

29 Eylül 2016 Perşembe

SQL' de TARİH İŞLEMLERİ


PostgreSql'de Tarih İşlemleri:

PostgreSql'de Tarih İşlemleri ile İlgili En Çok  Kullanılan Fonksiyonlar ve Örnek Kullanımları: 


SELECT CURRENT_DATE+INTERVAL '1 day';
--- Şuanki tarihin 1 gün sonrasını verir.  '+' yerine '-' kullanıldığında şuanki tarihin 1 gün öncesini verecektir. 1 yerine girilecek sayı kadar şuanki tarihin sonrası veya öncesine göre işlem yapmak mümkündür. Tablo sorgusu üzerinde kullanımı ise;

 (select tarihlerin_yeraldigi_kolon_adi-interval '1 day' from tablo_adi) şeklinde yazılırsa tablodaki ilgili tarihlerin 1 gün öncesini listeleyecektir.

Ayrıca sorguda gün yerine ay, yil üzerinde aynı işlemleri yapmak mümkün bunun örnek gösterimi aşağıdaki gibidir:

select current_date+interval '1 month'; --- Şuanki tarihin 1 ay sonrasını verir.
select current_date+interval '1 year'; --- Şuanki tarihin 1 yıl sonrasını verir.

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
---- Tanımlanan tarihin gününü verir. Sonuç:16

Sorguda 'DAY' yerine 'MONTH' ,'YEAR', 'HOUR', 'MINUTE' girildiğinde tanımlanan tairihin ay,yıl, saat veya dakika verisini döndürür. Kullanım şekilleri şöyle:

- Select extract(month from timestamp '2001-02-16 20:38:40'); --- Sonuç:2 (ay)
- Select extract(year from timestamp '2001-02-16 20:38:40'); ---Sonuç:2001 (yıl)
- Select extract(hour from timestamp '2001-02-16 20:38:40'); ---Sonuç:20 (saat)
- Select extract(minute from timestamp '2001-02-16 20:38:40');

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
--- Tanımlanan tarihte yılın onluk kısmına kadar olanını döndürür. Sonuç: 200


SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
--- Tanımlanan tarihin haftanın kaçıncı gününe denk olduğunu döndürür. Sonuç:5 (0-pazar, 1 p.tesi,...6 c.tesi olarak tanımlıdır.)

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-03-25 20:38:40');
--- Tanımlanan tarihin yılın kaçıncı gününe denk olduğunu döndürür. Sonuç:84


SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
--- Tanımlanan tarihin ay değerinin yıla bölümünden kalanı verir. Sonuç:1



SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');

--- Tanımlanan tarihin saat başlangıcını verir. Sonuç:2001-02-16 20:00:00
'hour' yerine 'month' veya 'year' girildiğinde ay veya yılın başlangıç değerini veir.

    - SELECT date_trunc('month', TIMESTAMP '2001-02-16 20:38:40'); --- Sonuç:"2001-02-01 00:00:00"

   - SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40'); --- Sonuç:"2001-01-01 00:00:00"



SELECT TIMESTAMP 'now';
--- Sistem tarihini döndürür. Sonuç: 2016-09-29 03:26:38.876368



SELECT timeofday();

 --- Güncel tarihin ay ve gün karşılığını verir. Sonuç: "Thu Sep 29 03:28:50.899577 2016 BRT"



SELECT LOCALTIMESTAMP;

--- Güncel tarihi tarih ve saat olarak verir. Sonuç: 2016-09-29 03:31:52.407552


PostgreSql'de Tarih Farkı:

SELECT DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date);
--- Tanımlanan iki farklı tarihin yıl olarak farkını döndürür. Sonuç:1
SELECT (DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date)) * 12 +
        (DATE_PART('month', '2012-01-01'::date) - DATE_PART('month', '2011-10-02'::date));

--- Tanımlanan iki farklı tarihin ay olarak farkını döndürür. Sonuç:3

SELECT '2011-12-31 01:00:00'::timestamp - '2010-09-17 23:00:00'::timestamp; 

--- Tanımlanan iki farklı tarihin gün olarak farkını gün ve saat olarak döndürür. Sonuç: "469 days 02:00:00"


SELECT DATE_PART('day', '2011-12-31 01:00:00'::timestamp - '2011-12-29 23:00:00'::timestamp); 

  --- Tanımlanan iki farklı tarihin gün olarak farkını gün sayısı olarak döndürür. Sonuç: 1        

  Örnek olarak tablolarda kullanımı şu şekildedir:

 Select DATE_PART('day',guncel_tarih_kolon_adi::timestamp - giris_tarihi_kolon_adi::timestamp) from tablo_adi;