RSS
 

Archive for the ‘Veri Tabanları’ Category

PHP & MySQL Tek Alanda Çoklu Veri Tutma – Tips&Tricks

06 Dec

Merhaba,

Başlıktanda anlayacağınız üzere bir data’nın birden çok özelliği olabilir ve bazı ID’ler ile eşizleştirilmeside gerekebilir. Nasıl yani?

Örneğin; Bir e-ticaret sistemi geliştirdiğinizi düşünün bir ürünün renk, boyut gibi özellikleri var ve bu özellikler her ürün için birden fazla olabilir. Örneğin;

* Product 1 -> Red,Blue,Green – XL,L,M,S (Tabii bu değerler sınırlı değil yarın bir gün Yellow ve XXL gibi yeni değerlerde gelebilir.)

Şimdi yukarıdaki Red,Blue,Green ve XL,L,M,S’i MySQL’deki tek bir row’da tutmak istersek bunları aralarına virgül koyup, REGEX gibi yollarla parçalayarak işlemek hataya açık şekilde tutmaktır. Her özellik için bir alan oluşturup bunlara 0 ve 1 gibi değerler ile tutmakta mantıklı değil. Çünkü yukarıda parantez içinde belirttiğim gibi yeni özellikler geldiğinde tabloyu düzenlemeniz gerekmektedir ve bir sınırıda yoktur. Yani 50 tane de olabilir bu özellikler.

Biz ise, PHP’de serialize edip bu şekilde tutacağız. Hatta bir adım ileri gidip sadece Key’leri değil bu Key’lere Value’lar verip ikisini birden işleyeceğiz.

Elimizdeki değerler;

* Product 1 Properties;

  • Red -> 20
  • Green -> 62
  • Blue -> 14
  • XL  -> 52
  • L -> 75
  • M -> 318
  • S -> 98
Şimdi bu özellikleri ve değerlerini; Özellik -> Adet şeklinde düşünelim. Hemen PHP tarafına geçiyoruz.
$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

Şimdi array haline getirdiğimiz değerlerimizi serialize edip bir de bu haldeki çıktılarına bakalım.

  // Yukarıdaki kodların altına ekliyoruz
print(serialize($productColorArr)); 
# a:3:{s:3:"Red";i:20;s:5:"Green";i:62;s:4:"Blue";i:14;}
print("\n\r");
print(serialize($productSizeArr)); 
# a:4:{s:2:"XL";i:52;s:1:"L";i:75;s:1:"M";i:318;s:1:"S";i:98;}

Bu kodun çıktıları yanlarına eklediğim gibi olması gerekiyor. Bu işlemden sonra DB’ye insert edebiliriz. SELECT ettiğimizde UNSERIALIZE etmemiz gerekmektedir. Nasıl?


$productColorArr = array(
 "Red" => 20,
 "Green" => 62,
 "Blue" => 14
 );

$productSizeArr = array(
 "XL" => 52,
 "L" => 75,
 "M" => 318,
 "S" => 98
 );

 $srz_ProductColorArr = serialize($productColorArr);
 $srz_ProductSizeArr = serialize($productSizeArr);

 print_r(unserialize($srz_ProductColorArr));
 print("\n\r");

print_r(unserialize($srz_ProductSizeArr));

Buraya kadar güzel, peki bunları veri tabanında ne şekilde tutucaz? Bu değerleri tutacağımız color ve size adında 2 tane alanımız olsun bunların veri türü TEXT olsun. Bunların INSERT ve SELECT ettirme kısmını zaten biliyorsunuz. Peki, içlerinden bazı değerleri çıkartma veya bir key’in value’nu nasıl değiştireceğiz? İçinden çıkartmak istedikleriniz varsa aşağıdaki şekilde filtreleyebilirsiniz.


/* unserialize ettiğimiz data bize Array döndüğünden bu noktadan sonra

Array'ler üzerinde execute edebildiğimiz tüm kodları çalıştırabiliriz.

*/
<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);

$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);
# Dizi içinde Red ve Blue olan key'leri filtreledik.
$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));

print_r($filteredColor); # Green yazması gerek sadece.
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Bir diğer senaryo; $productSizeArr ‘deki M key’nin değerini 18 eksiltmek istersek.

<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);

$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);

$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));

if(array_key_exists("M", $usrz_ProductSizeArr)){
	$usrz_ProductSizeArr["M"] -= 18;
	array_values($usrz_ProductSizeArr);
}

print_r($filteredColor);
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Kodumuzun son hali yukarıdaki şekildedir. Böylece, unserialize edilmiş data üzerinde nasıl işlem yapabileceğimizide gördük.

Son bir trick olarak array_merge() methoduna bakmanızı öneririm. İki array’i birleştirerek tek bir dizi haline getirmektedir. İşinize yarabilir.

print(“İyi Çalışmalar”);

:)

 
1 Comment

Posted in MySQL, PHP

 

IIS7 – Error establishing a database connection Error

10 Feb

MySQL Logo

Merhaba,

Bugün Bloguma girdiğimde HTTP 500 Internet Server Error mesajı ile karşılaştım. Loglardan baktığımda “Error establishing a database connection” hatası ile karşılaştım.

Eğer sizde IIS 7.x üzerinde WordPress kullanıyorsanız, ve yüksek hitiniz var ise aynı problemle karşılaşabilirsiniz. Çözümü basit. Blogunuza özel bir MySQL Login Account’ı açıp wp-confing.php dosyasına bu bilgileri yazarak, blogunuzun bu giriş bilgileri ile MySQL Server’a bağlanmasını sağlayabilirsiniz.

Tek bir hesap oluşturup bütün MySQL DB alt yapısını kullanan yapılarlada da karşılaşabilir. Mümkün mertebe her application için bir mysql login account’ı oluşturunuz.

İyi Çalışmalar.

 
No Comments

Posted in MySQL

 

MySQL Proxy İle Performans

08 Feb

MySQL Logo

Merhaba,

ORACLE, MySQL’i alınca bir takım endişelere kapılmıştım ama yapılan çalışmalar ve beklenen politika değişiklikleri yapılmadan devam edildiği  için ORACLE’ın MySQL’i alması iyi olmuş. Türkiye’de yaşadığımız için DBA‘ları değil biz yazılımcıları daha çok ilgilendiren bir konu oluyor bu MySQL’in yeni ürünü MySQL Proxy. İsmi üzerinde Proxy. :) Çalışma mantığının basit hali aşağıdaki şemada açıklanmış. 128 Thread(İş parçacığı , Process değil!) ile çalıştığında daha önce sadece MySQL üzerinde caching v.s. ile performans çalışmaları ile yaptığım halinden, MySQL+MySQL Proxy %50′den fazla performans artışı sağlıyor. Şuan 0.8.0 versiyonunda olmasına rağmen bence ileride çok yoğun şekilde kullanılacak ve tutulacak bir üründür. Üstelik Open Source bir ürün.

MySQL Proxy Architecture

(“Büyük halini görmek için üzerine tıklayabilirsiniz.”)

Eğer indirdiyseniz. Windows kullananlar ile şimdi kurulum işlemlerine geçelim.

İndirdiğiniz sıkıştırılmış dosyayı C:\ , F:\ gibi kolay erişebileceğiniz bir dizinin içine atınız. Daha sonra bu klasörün içindeki bin dosyasının path’ini Windows PATH tanımlamasına ekleyiniz. Ben “F:\mysql-proxy-0.8.0-win32-x86\bin” bu dizine kurduğumdan bu path’i ekledim. Artık command line’dan mysql-proxy yazarak erişebilirsiniz. Vista ve Windows 7 kullanıcılarına Firewall burada bir uyarı verebilir. Bu izni vermezseniz MySQL Proxy network’e erişemeyeceğinden düzgün çalışamayacaktır. Bu izni vermeniz gerekmektedir.

Konfirgürasyonu biraz karışık geldi ilk baktığımda ondan kolay kullanım için basit bir program yazmayı düşünüyorum. Her zaman olduğu gibi tabii ki sizinlede paylaşacağım. :) Yoksa sinir kat sayınızın çarpanları artabilir. :D En geç haftasonuna kadar zaman bulabilirsem, yazıp hemen alt tarafa ekleyeceğim.

Yinede kendim denemek istiyorum diyorsanız; “mysql-proxy –help-all” şeklinde tüm MySQL App. Shell komutlarına erişebilirsiniz.

NOT: MySQL Server 5.1.x sürümlerinde istikrarlı çalışmaktadır. Daha önceki sürümlerinde henüz test edilmemiş. Problem çıkartma ihtimali yüksek.

İyi Çalışmalar.

 
1 Comment

Posted in MySQL

 

PHP & Ms SQL Server 2008 Kullanımı

10 Aug

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.

"myMsSQL",
				 "UID"=>"sa",
				 "PWD"=>"10");

// SQL connection.
$conn = sqlsrv_connect(Server,$connStr);
!$conn ? exit("Connection Error: ".print_r(sqlsrv_errors(),true)) : print("Baglanti Saglandi!");

// Close the connection.
sqlsrv_close($conn);
?>

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.

"myMsSQL",
				 "UID"=>"sa",
				 "PWD"=>"10");

// SQL connection.
$conn = sqlsrv_connect(Server,$connStr);
!$conn ? exit("Connection Error: ".print_r(sqlsrv_errors(),true)) : print("Bağlantı Sağlandı!");

// Execute the sql command query.
$sqlCommand = "INSERT INTO myMsSQL.dbo.tbl_users (username,passwd,testData)
				VALUES ('Hakan DAMAR','2a1b0e','PHP ile SQL Server 2008 Kullanıyoruz.')";
$execQuery = sqlsrv_query($conn,$sqlCommand);
!$execQuery ? print("Hatalı Sorgu!") : print("Sorgu Başarıyla Çalıştırıldı.");

// Close the connection.
sqlsrv_close($conn);
?>

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.

"myMsSQL",
				 "UID"=>"sa",
				 "PWD"=>"10");

// SQL connection.
$conn = sqlsrv_connect(Server,$connStr);
!$conn ? exit("Connection Error: ".print_r(sqlsrv_errors(),true)) : null;

// Execute the sql command query.
$randPass = rand(1500,358415874);
$newPasswd = sha1($randPass."2a1b0e");
$sqlCommand = "INSERT INTO myMsSQL.dbo.tbl_users (username,passwd,testData)
				VALUES ('Hakan DAMAR','{$newPasswd}','PHP ile SQL Server 2008 Kullanıyoruz.')";
$execQuery = sqlsrv_query($conn,$sqlCommand);
!$execQuery ? print("Hatalı Sorgu!") : null;

// Data Grid
$sqlCommand2 = "SELECT TOP 25 * FROM myMsSQL.dbo.tbl_users";
$executeQuery = sqlsrv_query($conn,$sqlCommand2);
!$executeQuery ? print("SELECT Sorgusu Çalıştırılamadı!") : null;

while($dataRow=sqlsrv_fetch_array($executeQuery)){
	print $dataRow["UID"]." - ".$dataRow["username"]." - ".$dataRow["passwd"]. " - ".$dataRow["testData"]."";
}
// Free result
sqlsrv_free_stmt($executeQuery);

// Close the connection.
sqlsrv_close($conn);
?>

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.

Username: Test Data:

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;

"myMsSQL",
				 "UID"=>"sa",
				 "PWD"=>"10");

// SQL connection.
$conn = sqlsrv_connect(Server,$connStr);
!$conn ? exit("Connection Error: ".print_r(sqlsrv_errors(),true)) : null;
/*
// Execute the sql command query.
$randPass = rand(1500,358415874);
$newPasswd = sha1($randPass."2a1b0e");
$sqlCommand = "INSERT INTO myMsSQL.dbo.tbl_users (username,passwd,testData)
				VALUES ('Hakan DAMAR','{$newPasswd}','PHP ile SQL Server Kullanıyoruz.')";
$execQuery = sqlsrv_query($conn,$sqlCommand);
!$execQuery ? print("Hatalı Sorgu!") : null;
*/
// Data Grid
$sqlCommand2 = "SELECT TOP 250 * FROM myMsSQL.dbo.tbl_users";
$executeQuery = sqlsrv_query($conn,$sqlCommand2);
!$executeQuery ? print("SELECT Sorgusu Çalıştırılamadı!") : null;

while($dataRow=sqlsrv_fetch_array($executeQuery)){
	$userID = $dataRow["UID"];
	print "[Düzenle] ".$userID." - ".$dataRow["username"]." - ".$dataRow["passwd"]. " - ".$dataRow["testData"]."";
}

// Free result for memory :)
//sqlsrv_free_stmt($execQuery);
sqlsrv_free_stmt($executeQuery);

// Update Process
if(isset($_POST["uname"]) && !empty($_POST["uname"]) &&
   isset($_POST["tdata"]) && !empty($_POST["tdata"])){

	$updateID = intval($_GET["updateID"]);
	$username = $_POST["uname"];
	$testData = $_POST["tdata"];

   	/* Parametreleri sqlsrv_query() metodunda vermek istersek.
	$updateCmd = "UPDATE myMsSQL.dbo.tbl_users
   					SET username = ?, testData = ?
   					WHERE UID = $updateID";
   	$sqlParams = array($username,$testData);
   	$execQuery = sqlsrv_query($conn,$updateCmd,$sqlParams);
   	*/

	$updateCmd = "UPDATE tbl_users
			SET username = '$username', testData = '$testData'
			WHERE UID = $updateID";
   	$execQuery = sqlsrv_query($conn,$updateCmd);
   	!$execQuery ? print "UPDATE Sorgusunda Hata Var!" : sqlsrv_free_stmt($execQuery);
   	header("Location:test.php");
   	exit;
}

if(isset($_GET["updateID"]) && !empty($_GET["updateID"])){
	$updateID = intval($_GET["updateID"]);
$sqlCmd = "SELECT username,testData FROM myMsSQL.dbo.tbl_users as                  users   WHERE users.UID = $updateID";
	$execCmd = sqlsrv_query($conn,$sqlCmd);
	!$execCmd ? print("SELECT Sorgusunda Hata Var.") : null;
	while ($row=sqlsrv_fetch_array($execCmd)){
		$username = $row["username"];
		$testData = $row["testData"];
	}
	/*
	$username = sqlsrv_get_field($execCmd,1); // mysql_result(); gibi.
	$testData = sqlsrv_get_field($execCmd,3); // Sorgudaki tek bir alanı döndürür.
    */

?>
Username: Test Data:

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.

[Düzenle] | [SİL] ".$userID." - ".$dataRow["username"]." - ".$dataRow["passwd"]. " - ".$dataRow["testData"]."";
}
?>

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.

"myMsSQL",
				 "UID"=>"sa",
				 "PWD"=>"10");

// SQL connection.
$conn = sqlsrv_connect(Server,$connStr);
!$conn ? exit("Connection Error: ".print_r(sqlsrv_errors(),true)) : null;

// Data Grid (SELECT)
$sqlCommand2 = "SELECT TOP 250 * FROM myMsSQL.dbo.tbl_users";
$executeQuery = sqlsrv_query($conn,$sqlCommand2);
!$executeQuery ? print("SELECT Sorgusu Çalıştırılamadı!") : null;

// Print Grid
while($dataRow=sqlsrv_fetch_array($executeQuery)){
	$userID = $dataRow["UID"];
	print "[Düzenle] | [SİL] ".$userID." - ".$dataRow["username"]." - ".$dataRow["passwd"]. " - ".$dataRow["testData"]."";
}

// Free result for memory :)
sqlsrv_free_stmt($executeQuery);

// Update Process
if(isset($_POST["uname"]) && !empty($_POST["uname"]) &&
   isset($_POST["tdata"]) && !empty($_POST["tdata"])){

	$updateID = intval($_GET["updateID"]);
	$username = $_POST["uname"];
	$testData = $_POST["tdata"];

	$updateCmd = "UPDATE tbl_users
					SET username = '$username', testData = '$testData'
					WHERE UID = $updateID";
   	$execQuery = sqlsrv_query($conn,$updateCmd);
   	!$execQuery ? print "UPDATE Sorgusunda Hata Var!" : sqlsrv_free_stmt($execQuery);
   	header("Location:test.php");
   	exit;
}

// For DELETE Record.
if(isset($_REQUEST["deleteID"]) && !empty($_REQUEST["deleteID"])){
	$deleteID = intval($_REQUEST["deleteID"]);

	$sqlDeleteCmd = "DELETE FROM tbl_users WHERE tbl_users.UID = {$deleteID}";
	$execSqlCmd = sqlsrv_query($conn,$sqlDeleteCmd);

	!$execSqlCmd ? print("DELETE Sorgusunda Hata Var!") : sqlsrv_free_stmt($execSqlCmd);
	print("Silme İşlemi Başarıyla Gerçekleşmiştir.");
	header("Location:test.php");
	exit;
}

// SELECT record for UPDATE.
if(isset($_GET["updateID"]) && !empty($_GET["updateID"])){
	$updateID = intval($_GET["updateID"]);
	$sqlCmd = "SELECT username,testData FROM myMsSQL.dbo.tbl_users as users WHERE users.UID = $updateID";
	$execCmd = sqlsrv_query($conn,$sqlCmd);
	!$execCmd ? print("SELECT Sorgusunda Hata Var.") : null;
	while ($row=sqlsrv_fetch_array($execCmd)){
		$username = $row["username"];
		$testData = $row["testData"];
	}
?>
Username: Test Data:

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.

Hepinize çalışmalarınızda başarılar diliyorum.

Saygılarımla,

-    Hakan DAMAR

 
4 Comments

Posted in MsSQL, PHP

 

SQL Server Driver For PHP Connection Error

10 Jul

SQL Server Driver FOR PHP 5

Merhaba,

Bildiğiniz üzere Microsoft PHP için bir SQL Server Driver’ı çıkarttı. Bu extension’ı PHP’nin üzerine kurduğunuzda SQL Server 05 ve 08 ile sorunsuz ve hızlı bir şekilde işlemler yapabiliyorsunuz.  e-mail’me gelen soru yağmurları arasından seçtiğim bir sorunun cevabını buradan vermek istiyorum. Çünkü SQL Driver henüz yeni bir extension ve Türkçe kaynak hiç yok. Orjinal dökümantasyonu ise pek iç açıcı değil. :)

Hata: (SQL Server 08 üzerinde çalışıyorsanız.)

Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -1 [/code]

=> -1 [2] => Invalid option xÁò was passed to sqlsrv_connect. [message] => Invalid option xÁò was passed to sqlsrv_connect. ) )

Çözüm:

SQL Connection string'inizi daha doğrusu array'nizi hazırlarken eğer string türünden hariç bir şifreniz varsa ve string'e convert etmemişseniz bu hatayı olabilirsiniz. Bunun için connection string'inizdeki ilgili alanı ya string'e convert edin yada çift tırnak ( " ) içine alarak otomatik string olarak gösteriniz.

Örnekler;

- Hatalı Örnek:

$connectionStr= array( "Database"=>"fooDb","UID"=>"sa2","PWD"=>15461068071951080841);

- Doğru Örnek:

$connectionStr = array( "Database"=>"fooDb","UID"=>"sa2","PWD"=>(string)15461068071951080841);

veya (Aşağıdaki tavsiyem aynı zamanda. )

$connectionStr = array( "Database"=>"fooDb","UID"=>"sa2","PWD"=>"15461068071951080841");

Böyle basit bir işlemden dolayı sinir katsayınızı arttırabilir. :) Henüz yeni ve ilk versiyonları bunlar. Umarım 2. versiyonunda bunların hepsini halletmiş olurlar.

iyi çalışmalar.

 
No Comments

Posted in MsSQL, PHP

 

Google 23 Nisan’da MEB’in Sitesini Hackledi :)

23 Apr

childrensday_tr09

Merhaba,
Tam Google’ın 23 Nisan logosuna sevinecekken, bir bakıyım dedim resme tıklayınca ilk hangi site çıkıyor , tahmin ettiğim gibi MEB çıktı. Peki, MEB’in sitesine baktığımda ne çıktı? Service Unavailable yazısı. :D

Demek ki MEB’in alt yapısı henüz 1/2 milyon hit’i kaldırabilecek bir seviyede değil. Biz buna halk arasında IMECE DDOS Diyoruz. :) El birliği ile Google’ın da yardımlarıyla MEB’in sitesini servis dışı bıraktık. Hacked By TÜRKİYE :D

ORACLE’a her ay ödeyecek bütçe buluyorlar da bir 2Gbps Hat ile 4 server almayı bilmiyorlar. :)

Burası Türkiye.

İyi Çalışmalar.

 

Kill All Process for MySQL ~ Kritik Hata Yönetimi

14 Dec

Merhaba,

Kısa bir süre önce karşılaştığım bir MySQL Query Process problemi sonrası yazdığım bir kod blogunu sizinle paylaşıyorum.

Aşağıdaki kodlar ile 200ms’nin üzerinde işlem kuyruğunda bekleyen işlemleri sonlandırabilirsiniz. Lütfen, kodlarını çalıştırmadan önce sisteminizdeki loglama ve kurtarma modülleri varsa çalıştıklarını check ediniz.

<?php
/**
 * Danger: KILL ALL MySQL SERVER PROCESS
 * UYARI: Tüm veri tabanı işlemlerini sonlandıran kod blogu
 * @author: Hakan DAMAR
 */
$dbhost  = "10.70.1.9";
$dbname  = "MySQLEnt";
$dbuser  = "rootkit";
$dbpass  = "**********";

@mysql_connect($dbhost,$dbuser,$dbpass) || die("Error:" .mysql_error());
mysql_select_db($dbname);

$T_Begin = mysql_query("BEGIN"); Require DB Engine Type = INNODB  for transaction
$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) {
$process_id=$row["Id"];
for ($h=0;$row["Time"] &gt; 200;$sql=mysql_query("KILL $process_id")) {
        if(!$sql){ $T_ROLLBACK = mysql_query("ROLLBACK"); }
                else {
                        $T_COMMIT = mysql_query("COMMIT");
                        print $process_id."&lt;br&gt;";
          }
    }
}
?>

Yukarıdaki kodlarda sadece processleri kill eden tarafa yoğunlaşınız. Çalışır bir örnek sunabilmek adına bazı tarafları express kodlanmıştır. Siz kendi yazılımınıza göre entegre kullanabilirsiniz.

İyi Çalışmalar,

Hakan DAMAR

 
No Comments

Posted in MySQL, PHP

 

For Messenger Application Database

27 Oct

Merhaba,

Bu hafta içinde bir messenger uygulaması için MsSQL ile hazırladığım bir veri tabanın ilk versiyonunu sizlerle paylaşacağım. Son versiyonunu neden paylaşmadığımı sormazsınız heralde :)

USE [N2Soft]
GO
/****** Object:  Table [dbo].[UsersInfo]    Script Date: 10/27/2008 00:10:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UsersInfo](
[UserID] [int] NOT NULL,
[FirstName] [nvarchar](150) NOT NULL,
[LastName] [nvarchar](90) NOT NULL,
[Picture] [varchar](250) NULL,
[Status] [nchar](10) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Users]    Script Date: 10/27/2008 00:10:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Users](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[Email] [varchar](150) NOT NULL,
[Password] [varchar](32) NOT NULL,
[Nickname] [nvarchar](30) NOT NULL,
[RegDate] [date] NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[BodyList]    Script Date: 10/27/2008 00:10:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[BodyList](
[UserID] [int] NOT NULL,
[SecondUID] [int] NOT NULL,
[AddDate] [date] NOT NULL,
[Permission] [bit] NOT NULL
) ON [PRIMARY]
GO
/****** Object:  View [dbo].[Banned]    Script Date: 10/27/2008 00:10:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create view [dbo].[Banned]
as
select UserID,SecondUID,Permission
from dbo.BodyList
where Permission = 0;
GO
/****** Object:  View [dbo].[Accept]    Script Date: 10/27/2008 00:10:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create view [dbo].[Accept]
as
select UserID,SecondUID,Permission
from dbo.BodyList
where Permission = 1;
GO
/****** Object:  Default [DF_Users_Nickname]    Script Date: 10/27/2008 00:10:01 ******/
ALTER TABLE [dbo].[Users] ADD  CONSTRAINT [DF_Users_Nickname]  DEFAULT (N’Üşengeç’) FOR [Nickname]
GO
/****** Object:  Default [DF_UsersInfo_Status]    Script Date: 10/27/2008 00:10:01 ******/
ALTER TABLE [dbo].[UsersInfo] ADD  CONSTRAINT [DF_UsersInfo_Status]  DEFAULT (N’Offline’) FOR [Status]
GO

Table mantığı ile ilgili sanırım bir çıkmazasa düşmezsiniz. Zaten yapı basit. SP veya ileri seviye farklı bir transaction mekanizması bu versiyonunda olmadığından alıp istediğiniz gibi kullanabilirsiniz. Msn messenger veya Yahoo Messenger’da bu mantıkla tablolama yapmaktadır.

Yinede takıldığınız bir yer olursa biliyorsunuz bana nasıl ulaşacağınızı.

Saygılar,

Hakan DAMAR

 

Veri Tabanı Programlama [T-SQL]

21 Aug

Merhaba Sevgili Okurlar,

Bu eğitim kuşanda sizlere veri tabanı programlama,T-SQL,MsSQL ve MySQL’i göstereceğim. Hepsinin temeli T-SQL’den geçtiğinden sizlere T-SQL’i önce anlatacağım. Daha sonra zaten zorlanmadan MsSQL’i, hello world gibide MySQL’i öğreneceksiniz.

İlk olarak öğreneceğiniz şey hakkında açıklama yapayım.

Veri Tabanı Nedir? Neden Gerek Duyulur?

Aslına bakarsanız biraz ileri seviye olan arkadaşlar anlayacaktır bu sözümü, “Neden farklı programlama dillerine gerek var :D daha mantıklı kalıyor bu söz karşısında”. Çünkü; şuan programcı diye piyasada çalışan %95 kişi’nin yaptığı aslında veri tabanı programlamaktır. Veri tabanı olmayan kaç tane uygulama kullandınız şimdiye kadar? Aslında hepimizin yaptığı iş aynıdır. Veri Tabanı Programlamak. Veri tabanı dediğimiz şeyi en basitten baktığımızda bilgisayarlarımızda kullandığımız text dosyalarıdır. Evet, yanlış okumadınız bildiğimiz yazı dosyaları. MsnList.txt gibi mesela :)

Tabi bu text dosyaları verileri farklı veri türlerinde tutup saklamak,toplu sorgulara yanıt verebilmek ve bazı kriterlere göre bize işlem bütünlüğü sağlamak gibi özellikleri yoktur. Normal klavyeden yazar gibi yazar ve satır, satır bizim gibi okur. Olduda bir hata oldu ve 1 satır yukarıya kaydı 1 satır. Bütün işlemleriniz artık yanlış çalışacaktır. Bu bir de üyelik sistemi ise tüm login’ler artık failed! :) Bu ve şimdi 1-2 sayfa sürebilecek daha bir çok sebebten dolayı Veri Tabanı Yönetim Sistemleri çıkmıştır ortaya. Bunların en gelişmişlerinin başında MsSQL , ORACLE , MySQL ve PostgreSQL gelmektedir. Bunların işlerimizi kolaylaştıracak o kadar çok yönü vardırki şimdi satır arasında sayamayacağım kadar çok. Her biri için yazılmış cilt,cilt kitaplar olduğunuda düşünürsek bunların açıklamasını ileriye saklamak mantıklı olacaktır. İleride hangi projede hangi veri tabanını seçeceğimizide göreceğiz. Gerçi %80 işlerimizde MsSQL bize yetecektir ama yinede alternatiflerinin ağır bastığı noktalarada değineceğiz.

Şimdi son olarak veri tabanı için şunu diyebiliriz. Ona gönderdiğimiz verilerimizi bizim için süresiz saklayan ve istediğimizde bize gösteren her türlü  yapıya veri tabanı denmektedir. Buna RAM dahil değildir. Çünkü onun süresi restart atılana kadar veya RAM boşaltılmak zorunda kaldığı zaman kadardır. Böyle olduğundan tanımımızdaki süresiz kelimesine uymamaktadır. Bazı veri tabanı yönetim sistemlerininde MEMORY seçeneği vardır ve çokta hızlı çalışmaktadırlar fakat kritik noktalarda asla tercih edilmemelidir. Ama ara işlem logları v.s. gibi bazı yerlerde işimize yarayan tablo yapılarıdır. Hepsini ileride göreceğiz.

Bu açıklamaların üzerine “Neden gerek duyulur?” sorusu sanırım tek cümle ile geçilebilir. Verilerimizi düzenli bir şekilde uzun süre saklamak ve hızlı erişebilemiz gerektiğinden veri tabanlarını kullanarak verilerimizi depolarız. Bu yüzdende Veri Tabanlarına yani Database’lere ihtiyacımız vardır.

Veri tabanı sistemlerine girmeden T-SQL’i görerek işlemlerimizi nasıl yaptığımızı öğrenmeliyiz. T-SQL’e bir sonraki derste giriş yaparak ardından  belirttiğim konuları anlatacağım.

Saygılar,

Hakan DAMAR

 

MySQL İle Basit Bir Veri Tabanı Oluşturma

14 Aug

Merhaba Sevgili Okurlar,

MySQL’e yeni başlayan arkadaşlardan gelen istek üzerine bir adet basit MySQL Veri Tabanı Hazırlıyorum.

create table e_uzman(

UzmanID int(5) not null auto_increment,

UzmanAdi varchar(45) not null,

UzmanSAdi varchar(50),

UzmanPara decimal(10,2),

Primary Key(UzmanID)

);

Yukarıdaki veri tabanında bir kişinin adi,soyadi,hesabındaki para’yı tutabilirsiniz. Sorgular şu şekilde olacaktır.

SELECT * FROM e_uzman

Eğer Şartlı sorgulama yapacaksanız:

SELECT * FROM e_uzman WHERE UzmanID > 5

şeklinde olacaktır.

İleride T-SQL derslerinde bunların hepsine ayrıntılı gireceğimizden şimdilik sadece istediğiniz olsun diye yazdım. Ayrıntılı olarak gireceğim. Veri tabanı çok önemli bir konudur. Hatta programladan bile bazı noktalarda önemlidir. Neyse şimdilik girmiyorum. İleride değineceğiz.

Saygılar,

Hakan DAMAR

 
No Comments

Posted in MySQL