Başlangıç > Dökümanlar, MsSQL > PHP & Ms SQL Server 2008 Kullanımı

PHP & Ms SQL Server 2008 Kullanımı

Bilindiği üzere Microsoft IIS(Internet Information Services) 6.0 ve 7.x sürümlerinde artık PHP’ye destek vermektedir. Bununla da kalmayıp SQL Server 2005/2008 ile daha kolay işlem yapmamızı sağlayan “SQL Server Driver For PHP” extension’nı geliştirmiştir. Daha öncede bahsettiğim gibi IIS üzerine PHP kurmak istiyorsak, Windows Server’lar için özel olarak geliştirilen PHP sürümleri üzerinede çalışmalar başlamıştır. VC9  ile geliştirilmekte olan bu PHP sürümlerine http://windows.php.net adresinden ulaşabilirsiniz.

SQL Server Driver For PHP eklentisini IIS 7.x kullanıyorsanız Web Platform Installer ile kurabilirsiniz. Bu eklenti PHP üzerine kurulan curl veya zip kütüphanelerinden farkı yoktur. Aynı diğer eklentiler gibi bir DLL(Dynamic-link library) olarak extension klasörüne atılmakta ve php.ini ayar dosyamızdan diğer eklentiler gibi tanıtılmaktadır. Tek farkı şuan yeni olmasından ve çok yaygın kullanılmamasından dolayı Zend gibi IDE’ler henüz bu extension’nın metodlarını desteklememektedir. Yani bu eklentiyi kullanırken dikkatli olmalısınız. Çünkü Zend Studio v.b. IDE’ler kod tamamlama/ hata yakalama desteğini henüz bu extension için vermemektedirler.

Şimdi gelelim manuel kurulumunu nasıl yapacağımıza. Öncelikle http://tinyurl.com/5z3u6s bu adresin sizi yönlendireceği Microsoft Download sayfasından ilgili eklentiyi indiriniz. Daha sonra size dosyaları çıkartması için bir hedef dizin soracaktır. Uygun bir dizine dosyaları çıkarttıktan sonra ilgili dizine giderek içindeki dosyalara bakalım. Bizim için önemli olan içerisinde 2 adet .dll uzantılı dosya vardır. Bunların ikiside benzer isimlerdedir. Birinde sadece _ts.dll diye bir fazlalık vardır. Bu DLL eğer PHP sürümünüz thread safe ise kullanmanız gereken DLL’dir. Diğeri tahmin ettiğiniz gibi PHP’nin non thread safe sürümünü kullanıyorsanız kurmanız gereken eklentidir.Peki, ben bunu nasıl anlayacağım diyorsanız. PHP’nin kurulu olduğu dizine bakınız eğer php5ts.dll dosyasını kullanıyorsanız, PHP kurulumunuz thread safe’dir. Php5.dll ise non-thread safe sürümünü kullanmaktasınızdır.  Biz php_sqlsrv_ts.dll olanını kopyalayarak PHP’mizin kurulu olduğu dizindeki ext isimli klasörün içine atıyoruz. Bu sizde extension isminde de olabilir. Daha sonra php.ini dosyamızı açarak extension’ların tanıtıldığı bölüme extension=php_sqlsrv_ts.dll şeklinde eklentimizi PHP’ye tanıtıyoruz. Son olarak IIS veya Apache server’mıza restart atıyoruz.

Pc’niz de SQL Server 2005 veya SQL Server 2008 kurulu ise artık çalışmalarımıza başlayabiliriz. Biz bu uygulamaları yaparken IIS 7.5 üzerine FastCGI olarak Web Platform Installer yardımı ile kurulumumuzu yaptık ve SQL Server 2008 Enterprise Edition SP1 ‘i kullandık. PHP sürümü olarakta 5.x ve IDE olarakta Zend Studio 6.x kullandık.

 

 

 

İlk önce SQL Management Studio ile SQL Server’mıza bağlanıyoruz. Ardından aşağıdaki gibi bir sql table oluşturuyoruz. Tüm kodlara ve dosyalara yazının sonundaki vereceğim linkten ulaşabilirsiniz.

db_create

Bu table’mızın adı tbl_users olsun. Şimdi sıra geldi PHP tarafından bu table’a sql command göndermeye. Öncelikle en basit anlamda SQL Server 2008 ile nasıl çalışacağınızı anlatacağım daha sonra OOP’e uygun şekilde SQL Server ile çalışacağız.

İlk olarak bağlantımızı sağlayalım. Bunu 2 şekilde yapabiliriz.

  1. Windows Authentication
  2. SQL Server Authentication

Ben her zaman 2. Seçeneğini tercih ediyorum. :) Ama siz 1. Seçenek ile bağlanmak isterseniz Bağlantı kodunuz aşağıdaki şekilde olacaktır. Diğerini örnekte kullanacağımdan burada açıklamıyorum.

Windows Authentication Connection;

$connStr = array(“Database”=>”myMsSQL”);

Sadece veri tabanı adını belirtmemiz yetiyor. Bunun dışında eğer bağlanacağımız SQL Server default’un dışında farklı bir port üzerinden servis’i dinliyorsa bunun için’de server name’i tanımlarken aşağıdaki şekilde tanımlamalıyız.

define(“myServer”,”10.20.30.40, 7541″);

myServer’ı da sqlsrv_connect(); metoduna sqlsrv_connect(myServer); şeklinde verirsek 10.20.30.40 IP’li SQL Server’a 7541 no’lu porttan bir connection request(Bağlantı isteği) gönderecektir.

Hazır bağlantılara değinmişken SQL Server For PHP extension’ı connection pooling’i de desteklemektedir. Yine Connection String’imiz de true(1)/false(0) değerlerini vererek kullanabiliriz.

$connStr = array(“Database”=>”myMsSQL”,

“ConnectionPooling”=>true);

Bu kadar giriş bilgisinden sonra sanırım çalışmalarımıza başlayabiliriz.

İlk önce SQL Server ile nasıl iletişime geçeceğimizi görelim.

  1. “myMsSQL”,
  2.                                  “UID”=>”sa”,
  3.                                  “PWD”=>”10”);
  4. // SQL connection.
  5. $conn = sqlsrv_connect(Server,$connStr);
  6. !$conn ? exit(“Connection Error: “.print_r(sqlsrv_errors(),true)) : print(“Baglanti Saglandi!”);
  7. // Close the connection.
  8. sqlsrv_close($conn);
  9. ?>

Burada yaptıklarımızı kısaca açıklayacak olursak, ilk önce bağlantı bilgilerimizi tanımladık. Daha sonra sqlsrv_connect(); metodu ile sql server’a bir bağlantı açtık. Hemen alt satırında olası bağlantı problemlerini yakalayabilmek için bir if ile bağlantı durumunu kontrol ettik. Daha sonra da sqlsrv_close(); metodu ile sql server’a açmış olduğumuz bağlantımızı kapattık.

Aynı örnek üzerinden giderek INSERT,SELECT,UPDATE,DELETE işlemlerimizi yapalım.

Öncelikle tablomuzda eğer daha önceden oluşturulmuş kayıtlar var ise aşağıdaki T-SQL kodu ile tablomuzu boşaltıyoruz.

use [myMsSQL]

TRUNCATE TABLE myMsSQL.dbo.tbl_users

Şimdi sıra geldi veri tabanımızda oluşturduğumuz tablomuza yeni bir kayıt eklemeye. Hemen aşağıdaki örneği inceleyerek sql server’a gönderilmek üzere nasıl command oluşturulduğunu görebilirsiniz.

  1. “myMsSQL”,
  2.                                  “UID”=>”sa”,
  3.                                  “PWD”=>”10”);
  4. // SQL connection.
  5. $conn = sqlsrv_connect(Server,$connStr);
  6. !$conn ? exit(“Connection Error: “.print_r(sqlsrv_errors(),true)) : print(“Bağlantı Sağlandı!”);
  7. // Execute the sql command query.
  8. $sqlCommand = “INSERT INTO myMsSQL.dbo.tbl_users (username,passwd,testData)
  9.                                 VALUES (‘Hakan DAMAR’,’2a1b0e’,’PHP ile SQL Server 2008 Kullanıyoruz.’)”;
  10. $execQuery = sqlsrv_query($conn,$sqlCommand);
  11. !$execQuery ? print(“Hatalı Sorgu!”) : print(“Sorgu Başarıyla Çalıştırıldı.”);
  12. // Close the connection.
  13. sqlsrv_close($conn);
  14. ?>

Eğer herşey yolunda gitti ise bu kod ekrana;

insert_db

Yazdırması gerekmektedir.

Not: Eğer IE8 kullanıyorsanız ve SQLDriver4PHP extension’ı ile çalışırken 500 Internal Server Error alıyorsanız. Hatayı görmek için Firefox ile aynı sayfayı çalıştırabilirsiniz. :)

IE dahil tüm tarayıcılar içinde hata raporlamayı açabilirsiniz. Extension bunuda desteklemektedir. PHP.ini ‘den error_reporting ‘i de açmayı unutmayınız.

Şimdi çalıştırdığımız bu sorgunun gerçektende giderek sql server’daki ilgili table yeni bir kayıt ekleyip, eklemediğini aşağıdaki şekilde kontrol edelim.

select_db1

Bu görüntüdende anlaşılacağı üzere PHP ile SQL Server’a başarılı bir şekilde bağlantı sağlayarak, t-sql sorgumuzu çalıştırdık. Üstelik Türkçe karakter problemide olmadan. :)

Not: SQL Management Studio’da yazdığımız tüm kodları çalıştırmak için alt+x tuş kombinasyonunu kullanabiliriz. Sadece tek bir sorgu için ise ilgili sorguyu seçerek alt+x tuş kombinasyonunu kullanabiliriz.

Şimdi bu kaydı değiştirecek UPDATE sorgusunu yazalım ve çalıştıralım. Bir de her seferinde SQL Server’a gidip kod yazmak yerine tablodaki kayıtları sayfanın içine bastıralım.

Veri tabanından dataları alarak ekrana bastıran kodlarını bir önceki insert örneğine göre değiştirerek aşağıdaki şekilde veriyorum. Örnek kodları çalıştırarak inceleyebilirsiniz. Sayfayı her yenilediğinizde(F5) yeni bir kaydın ekrana basıldığını göreceksiniz.

  1. “myMsSQL”,
  2.                                  “UID”=>”sa”,
  3.                                  “PWD”=>”10”);
  4. // SQL connection.
  5. $conn = sqlsrv_connect(Server,$connStr);
  6. !$conn ? exit(“Connection Error: “.print_r(sqlsrv_errors(),true)) : null;
  7. // Execute the sql command query.
  8. $randPass = rand(1500,358415874);
  9. $newPasswd = sha1($randPass.”2a1b0e”);
  10. $sqlCommand = “INSERT INTO myMsSQL.dbo.tbl_users (username,passwd,testData)
  11.                                 VALUES (‘Hakan DAMAR’,'{$newPasswd}’,’PHP ile SQL Server 2008 Kullanıyoruz.’)”;
  12. $execQuery = sqlsrv_query($conn,$sqlCommand);
  13. !$execQuery ? print(“Hatalı Sorgu!”) : null;
  14. // Data Grid
  15. $sqlCommand2 = “SELECT TOP 25 * FROM myMsSQL.dbo.tbl_users”;
  16. $executeQuery = sqlsrv_query($conn,$sqlCommand2);
  17. !$executeQuery ? print(“SELECT Sorgusu Çalıştırılamadı!”) : null;
  18. while($dataRow=sqlsrv_fetch_array($executeQuery)){
  19.         print $dataRow[“UID”].” – “.$dataRow[“username”].” – “.$dataRow[“passwd”]. ” – “.$dataRow[“testData”].””;
  20. }
  21. // Free result
  22. sqlsrv_free_stmt($executeQuery);
  23. // Close the connection.
  24. sqlsrv_close($conn);
  25. ?>

Bu kodları çalıştırarak bir kaç kez abartmadan :) F5 ile sayfamızı yenileyelim. Ekran çıktısı aşağıdaki şekilde olacaktır.

select_db2

Sıra geldi UPDATE sorgusunu yazmaya. Bunun için öncelikle XHTML ile mini bir form hazırlamamız ve burada HTML kontrollerinin value’larına sql server’dan çektiğimiz bilgileri yazdırmalıyız. Daha sonra form post edildiğinde bu dataları alarak ilgili kaydı UPDATE etmeliyiz.

Merak etmeyin hiç zor bir şey değil. Biraz get biraz post ile halledicez. :)

İlk olarak HTML formumumuzu oluşturduk.

  1. <form id=”frm01″ method=”post”>
  2.   Username:
  3. <input name=”uname” type=”text” value=”<?=$username?>” />
  4.   Test Data:
  5. <input name=”tdata” size=”50″ type=”text” value=”<?=$testData?>” />
  6. <input type=”submit” value=”Güncelle” />
  7.  </form>

Ardından ekrana grid’mizi bastıran kodu düzenleyerek biraz eklenti yaptık.

Bilerek INSERT yapan kodu yorum satırına aldım. Her Düzenle’ye tıkladığınız da bir GET REQUEST(istek)’i olacağından sayfa yenilenecek ve INSERT tekrar, tekrar çalışacaktı. Bunu önlemek için kapattım. AJAX ile yapsaydık bu sorun olmazdı tabi. :) Bir de bu ilk örneğimizde OOP’in yanından bile geçmediğimizden tek sayfada işlerimizi hallediyoruz. Bu yüzden böyle problemler ile karşılaşabiliyoruz. Öncelikle kodun ekran çıktısını görelim. Arındanda kodları inceleyelim.

update_1

Güncelleme işlemi eklenmiş kodumuzun son hali;

  1. “myMsSQL”,
  2.                                  “UID”=>”sa”,
  3.                                  “PWD”=>”10”);
  4. // SQL connection.
  5. $conn = sqlsrv_connect(Server,$connStr);
  6. !$conn ? exit(“Connection Error: “.print_r(sqlsrv_errors(),true)) : null;
  7. /*
  8. // Execute the sql command query.
  9. $randPass = rand(1500,358415874);
  10. $newPasswd = sha1($randPass.”2a1b0e”);
  11. $sqlCommand = “INSERT INTO myMsSQL.dbo.tbl_users (username,passwd,testData)
  12.                                 VALUES (‘Hakan DAMAR’,'{$newPasswd}’,’PHP ile SQL Server Kullanıyoruz.’)”;
  13. $execQuery = sqlsrv_query($conn,$sqlCommand);
  14. !$execQuery ? print(“Hatalı Sorgu!”) : null;
  15. */
  16. // Data Grid
  17. $sqlCommand2 = “SELECT TOP 250 * FROM myMsSQL.dbo.tbl_users”;
  18. $executeQuery = sqlsrv_query($conn,$sqlCommand2);
  19. !$executeQuery ? print(“SELECT Sorgusu Çalıştırılamadı!”) : null;
  20. while($dataRow=sqlsrv_fetch_array($executeQuery)){
  21.         $userID = $dataRow[“UID”];
  22.         print “<a href=”?updateID=$userID”>[Düzenle]</a> “.$userID.” – “.$dataRow[“username”].” – “.$dataRow[“passwd”]. ” – “.$dataRow[“testData”].””;
  23. }
  24. // Free result for memory :)
  25. //sqlsrv_free_stmt($execQuery);
  26. sqlsrv_free_stmt($executeQuery);
  27. // Update Process
  28. if(isset($_POST[“uname”]) &amp;&amp; !empty($_POST[“uname”]) &amp;&amp;
  29.    isset($_POST[“tdata”]) &amp;&amp; !empty($_POST[“tdata”])){
  30.         $updateID = intval($_GET[“updateID”]);
  31.         $username = $_POST[“uname”];
  32.         $testData = $_POST[“tdata”];
  33.         /* Parametreleri sqlsrv_query() metodunda vermek istersek.
  34.         $updateCmd = “UPDATE myMsSQL.dbo.tbl_users
  35.                                         SET username = ?, testData = ?
  36.                                         WHERE UID = $updateID”;
  37.         $sqlParams = array($username,$testData);
  38.         $execQuery = sqlsrv_query($conn,$updateCmd,$sqlParams);
  39.         */
  40.         $updateCmd = “UPDATE tbl_users
  41.                         SET username = ‘$username’, testData = ‘$testData’
  42.                         WHERE UID = $updateID”;
  43.         $execQuery = sqlsrv_query($conn,$updateCmd);
  44.         !$execQuery ? print “UPDATE Sorgusunda Hata Var!” : sqlsrv_free_stmt($execQuery);
  45.         header(“Location:test.php”);
  46.         exit;
  47. }
  48. if(isset($_GET[“updateID”]) &amp;&amp; !empty($_GET[“updateID”])){
  49.         $updateID = intval($_GET[“updateID”]);
  50. $sqlCmd = “SELECT username,testData FROM myMsSQL.dbo.tbl_users as                  users   WHERE users.UID = $updateID”;
  51.         $execCmd = sqlsrv_query($conn,$sqlCmd);
  52.         !$execCmd ? print(“SELECT Sorgusunda Hata Var.”) : null;
  53.         while ($row=sqlsrv_fetch_array($execCmd)){
  54.                 $username = $row[“username”];
  55.                 $testData = $row[“testData”];
  56.         }
  57.         /*
  58.         $username = sqlsrv_get_field($execCmd,1); // mysql_result(); gibi.
  59.         $testData = sqlsrv_get_field($execCmd,3); // Sorgudaki tek bir alanı döndürür.
  60.     */
  61. ?>
  1. <form id=”frm01″ method=”post”>
  2.   Username:
  3. <input name=”uname” type=”text” value=”<?=$username?>” />
  4.   Test Data:
  5. <input name=”tdata” size=”50″ type=”text” value=”<?=$testData?>” />
  6. <input type=”submit” value=”Güncelle” />
  7.  </form>

Güncelleme işlemini de tamamladıktan sonra sıra geldi silme işlemimizi yapmaya. Silme işlemi için uygulamamızın bir yerinde değişiklik yapacağız ve silme işlemini yapmak için bir karar kontrol mekanizması ekleyeceğiz.

İlk olarak gridimizi ekrana bastıran kodları şöyle değiştirelim.

  1. [Düzenle] | <a href=”?deleteID=$userID”>[SİL]</a> “.$userID.” – “.$dataRow[“username”].” – “.$dataRow[“passwd”]. ” – “.$dataRow[“testData”].””;
  2. }
  3. ?>
  4. <=”” span=””>

Ardından silme işlemi için bir karar kontrol mekanizması ekleyelim.

Bu kodu güncelleme işlemi yapan kodun hemen üzerine ekleyeceğiz. Kodumuzun son hali ise şu şekilde olacaktır.

  1. “myMsSQL”,
  2.                                  “UID”=>”sa”,
  3.                                  “PWD”=>”10”);
  4. // SQL connection.
  5. $conn = sqlsrv_connect(Server,$connStr);
  6. !$conn ? exit(“Connection Error: “.print_r(sqlsrv_errors(),true)) : null;
  7. // Data Grid (SELECT)
  8. $sqlCommand2 = “SELECT TOP 250 * FROM myMsSQL.dbo.tbl_users”;
  9. $executeQuery = sqlsrv_query($conn,$sqlCommand2);
  10. !$executeQuery ? print(“SELECT Sorgusu Çalıştırılamadı!”) : null;
  11. // Print Grid
  12. while($dataRow=sqlsrv_fetch_array($executeQuery)){
  13.         $userID = $dataRow[“UID”];
  14.         print “<a href=”?updateID=$userID”>[Düzenle]</a> | <a href=”?deleteID=$userID”>[SİL]</a> “.$userID.” – “.$dataRow[“username”].” – “.$dataRow[“passwd”]. ” – “.$dataRow[“testData”].””;
  15. }
  16. // Free result for memory :)
  17. sqlsrv_free_stmt($executeQuery);
  18. // Update Process
  19. if(isset($_POST[“uname”]) &amp;&amp; !empty($_POST[“uname”]) &amp;&amp;
  20.    isset($_POST[“tdata”]) &amp;&amp; !empty($_POST[“tdata”])){
  21.         $updateID = intval($_GET[“updateID”]);
  22.         $username = $_POST[“uname”];
  23.         $testData = $_POST[“tdata”];
  24.         $updateCmd = “UPDATE tbl_users
  25.                                         SET username = ‘$username’, testData = ‘$testData’
  26.                                         WHERE UID = $updateID”;
  27.         $execQuery = sqlsrv_query($conn,$updateCmd);
  28.         !$execQuery ? print “UPDATE Sorgusunda Hata Var!” : sqlsrv_free_stmt($execQuery);
  29.         header(“Location:test.php”);
  30.         exit;
  31. }
  32. // For DELETE Record.
  33. if(isset($_REQUEST[“deleteID”]) &amp;&amp; !empty($_REQUEST[“deleteID”])){
  34.         $deleteID = intval($_REQUEST[“deleteID”]);
  35.         $sqlDeleteCmd = “DELETE FROM tbl_users WHERE tbl_users.UID = {$deleteID}”;
  36.         $execSqlCmd = sqlsrv_query($conn,$sqlDeleteCmd);
  37.         !$execSqlCmd ? print(“DELETE Sorgusunda Hata Var!”) : sqlsrv_free_stmt($execSqlCmd);
  38.         print(“Silme İşlemi Başarıyla Gerçekleşmiştir.”);
  39.         header(“Location:test.php”);
  40.         exit;
  41. }
  42. // SELECT record for UPDATE.
  43. if(isset($_GET[“updateID”]) &amp;&amp; !empty($_GET[“updateID”])){
  44.         $updateID = intval($_GET[“updateID”]);
  45.         $sqlCmd = “SELECT username,testData FROM myMsSQL.dbo.tbl_users as users WHERE users.UID = $updateID”;
  46.         $execCmd = sqlsrv_query($conn,$sqlCmd);
  47.         !$execCmd ? print(“SELECT Sorgusunda Hata Var.”) : null;
  48.         while ($row=sqlsrv_fetch_array($execCmd)){
  49.                 $username = $row[“username”];
  50.                 $testData = $row[“testData”];
  51.         }
  52. ?>
  53. <form id=”frm01″ method=”post”>
  54.   Username:
  55. <input name=”uname” type=”text” value=”<?=$username?>” />
  56.   Test Data:
  57. <input name=”tdata” size=”50″ type=”text” value=”<?=$testData?>” />
  58. <input type=”submit” value=”Güncelle” />
  59.  </form>

Bu kadar bilgiden sonra kendiniz bir form hazırlayarak SQL Server’a yeni bir kayıt eklemeyi deneyiniz. Kolaylık olsun diye INSERT yapan t-sql kodunuda veriyorum. PHP ile tek yapmanız gereken form’dan aldığınız datayı ilgili yerlere eklemek. Bunuda $_REQUEST veya form’un send method’una göre $_GET/$_POST ile yapabilirsiniz.

Veri tabanımıza yeni bir kayıt ekleyen t-sql kodu;

INSERT INTO tbl_users(username,passwd,testData) VALUES(‘$username’,’$passwd’,’$testData’)

Bu koda gelen $username,$passwd,$testData değişkenlerinin değerlerini daha öncede belirttiğim gibi FORM’dan almanız gerekiyor. Aslında kodları incelerseniz daha önce bir INSERT yaptığımızı göreceksiniz. Önceki kodlar size yardımcı olabilir. Tek fark biz VALUE’ları elle verdik, siz FORM’dan dinamik verdireceksiniz. Eğer yeni bir kayıt INSERT ettiremezseniz www.sanalkurs.net adresinden bana ulaşabilirsiniz. Daha fazla bilgi isterseniz, ücretsiz seminerlerimize katılabilirsiniz.

Şimdiye kadar geliştirdiğimiz test.php sayfamıza http://tinyurl.com/kkpotv adresinden ulaşabilirsiniz.

Evet, şimdi sıra OOP ile biraz nefes almaya geldi. Aynı işlemleri OOP’e uygun şekilde yazacağız. Bu makalemde OOP halinide anlatmak istiyordum fakat çok uzun süreceğinden sizleride sıkmak istemiyorum. Bir sonraki yazımda aynı projenin OOP(Object-oriented programming) standartlarına uygun bir şekilde anlatacağım. Ayrı bir makale konusu olacağından daha derinlemesine anlatabilirim.

Kategoriler:Dökümanlar, MsSQL Etiketler:, , , ,
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Yorum bırakın