RSS
 

Archive for the ‘Yazılım’ Category

Mobile Code Creator

07 Oct

Merhaba,

Bu aralar hep web servislerinden gidiyorum. İşte hazır Google’da barkod’un icadını kutlarken, mobile code oluşturabileceğiniz bir servis.

http://webservices.oxijen.org/Services/MobileCode/

İsteğe göre Link ekleme ve vCard oluşturma özelliklerinide ekleyebilirim.

Şimdilik GET metodu ile 2 tane parametre alıyor.

@param msg (String) – Oluşturmak istediğiniz kodu string olarak vermeniz gerekiyor. (HTML kodu yorumlamaz. Sadece yalın text göndermelisiniz.)

@param msgName (String) – Oluşturduğunuz mobile code’a vermek istediğiniz bir ad. İsteğe bağlıdır. Bu alana genellikle cep telefonu numarası girilir.

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

Free XMLocation Web Service

29 Sep

Merhaba,

Geliştirdiğimiz web uygulamalarında bazen kullanıcının bir takım bilgilerini almak isteyebiliriz. Böyle bir durumda giren kullanıcının IP‘sine göre Ülke/Bölge/ISP/Bayrak gibi bilgileri bize sağlayan web servislerinden yararlanırız. Bu web servisleride genelde ücretli olur. :) İnternette farklı bir konu üzerinde araştırma yaparken dikkatimi çeken ücretsiz bir web servisi için basit bir kod yazdım. Aşağıdaki kod ile bu ihtiyacınızı ücretsiz sağlayabilirsiniz.

Demo: http://webservices.oxijen.org/Services/XMLocation/

  1.  
  2. <?php
  3. header("content-type: text/html; charset=utf-8");
  4. $clientIP = $_SERVER["REMOTE_ADDR"];
  5. $request = "http://services.gabbara.com/xmllocation/?IP=".$clientIP;
  6. $readRequest = file_get_contents($request);
  7.  
  8. $xml = new SimpleXMLElement($readRequest);
  9. $flagIMG = "<img src=’".$xml->FlagPath."’ />";
  10. $shortCN = $xml->ShortName;
  11. $longCN = $xml->LongName;
  12. $region = $xml->Region;
  13. $ipCity = $xml->IpCity;
  14. $isp = $xml->ISP;
  15. $ispDomain = $xml->IPDomain;
  16. ?>
  17. <html>
  18. <head>
  19. <title>XMLocation Free Web Services</title>
  20. </head>
  21. <body>
  22. <p>
  23.         <b>Country:</b> <? print($shortCN)?>/<?=$longCN?><br/>
  24.         <b>Flag:</b> <?=$flagIMG?><br/>
  25.         <b>Region:</b> <?=$region?><br/>
  26.         <b>City:</b> <?=$ipCity?><br/>
  27.         <b>ISP:</b> <a href=‘http://<?=$ispDomain?>’ target=‘_blank’><?=$isp?></a>
  28. </p>
  29. </body>
  30. </html>
  31. <?php
  32. ?>
  33.  

Bu güzel ama benim işimi görmez ben kendi database’im üzerinden bu işlemleri yapmam gerekiyor diyorsanız. O zaman buradan 180MB civarındaki SQL’i indirip kullanabilirsiniz. :)

iyi çalışmalar.

 
No Comments

Posted in PHP

 

PHP Performans Testi

27 Sep

Merhaba,

İnternette dolaşan astronomik değerlerden sıkıldığımdan dolayı kendim güncel bir test yaptım. Yaptığım testlere göre sonuçlar aşağıdaki şekilde çıktı.

Testleri gerçekleştirdiğim makinenin konfigürasyonuna http://tinyurl.com/y8lkg5p buradan bakabilirsiniz.

Diğer Değerler;

  • Web Server: IIS 7.5
  • PHP Version: 5.2.10
  • Setup Mode: CGI/FastCGI
  • Browser: Firefox 3.5.2
  • OS: Windows 7 (x64)

Küçük boyutlu test sonucu;

8 Milyonluk bir döngü sonucunu: 0.98745512962341 saniyede getirdi.

Orta boyutlu test sonucu;

350 Milyonluk bir döngü sonucunu: 43.498991012573 saniyede getirdi.

Büyük boyutlu test sonucu;

1 Milyarlık bir döngü sonucunu: 123.0937769413 saniyede getirdi. (Ortalama 2 dk.)

Buda demek oluyor ki araya yazılımsal ve donanımsal caching + diğer performans yöntemleri ile büyük boyutlu bir sitemiz bile olsa hala rahatlıkla PHP’yi kullanabiliriz. :)

Genel Sonuç: print(“Yaşasın Open Source :D ”);

İyi Çalışmalar.

 
2 Comments

Posted in PHP

 

1.0 PHP ile Nesne Yönelimli Programlamaya Giriş

23 Sep

Merhaba,

Bu makalede PHP ile Object-oriented Programming(Nesne Yönelimli Programlama) giriş yapacağız. Makale giriş seviyesi fakat NYP(Nesne Yönelimli Programlama) ileri seviye bir konu olduğundan, PHP ile yeni web uygulamaları geliştirmeye başlayan kişilere tavsiye etmiyorum. Öncelikle PHP’de bir seviye uzmanlaşmakta fayda var. Yoksa bu makaleler zor ve öğrenmesi güç gelecektir.

Bilindiği üzere Class(Sınıf)’lar metodların birleşmesinden oluşur. PHP ile hazır gelen ve kendi oluşturabileceğimiz metodlar vardır. Bunlardan ilk iki tanesi __construct ve __destruct metodlarıdır.

__Construct Metodu; Object(Nesne) ilk yüklediği anda çalıştırılacak kodların bulunduğu bölümdür.  Daha önce ASP.NET ile web programlama yapmış arkadaşlar bunu Page_Load() methoduna benzetebilirler. PHP 4’te bu Class’ın adı ile aynı bir method oluşturarak mümkündü fakat PHP 5 ve sonrasında bunun yerine __construct() methodu getirildi.

void __construct ([ mixed $args [, $... ]] )

__Destruct Metodu; Bu metod ise nesne ile işimiz bittiğinde otomatik çağırılan metottur. İstersek manuel de çağırabiliriz.

void __destruct ( void )

Şimdi bu metodları bir örnek üzerinde inceleyelim.

Gördüğünüz gibi ilk önce __construct() metodu çalıştı ardından sayfa içerisindeki kodlar sonuna kadar çalıştırıldı ve en son olarak __destruct() metodu çağırıldı. Construction’da class içerisinde bolca kullanacağımız parametreler verilebilir. Destruction’da ise açık veri tabanı bağlantıları, session yok etme, hafızayı temizleme, arabelleği boşaltma v.b. gibi işlemler yapılabilir. Bunları ilerleyen makalelerde bolca kullanacağız. Bir class’ı new komutu ile oluşturacaksanız public olarak __construct metodunu kullanmalısınız. Fakat PHP’de __construct() ve __destruct() metodları olmadanda bir class oluşturmanız mümkündür.

__AutoLoad() metodu,  daha önce projelerimizde kullandığımız require_once() ve include_once() metodlarına benzemektedir. Fakat bunu class içerisinde otomatik yaparak bizi, acaba şu class’ı veya interface’i include(dahil etmek) ettim mi? Sorusundan kurtarır.  Bu metodu daha verimli kullanmak için class’larımızı ve interface(Arayüz)’lerimizi hiyerarşik yapıdaki bir klasörde tutmamızda fayda var. Anlatmak istediğimi bir örnek üzerinde inceleyerek pekiştirelim.

Klasör yapımız aşağıdaki şekilde olsun;

+ Proje

++ library

+++ testClass.php

+++ denemeClass.php

index.php

Metodumuzu aşağıdaki şekilde yazarsak Class’larımızı otomatik yükletebiliriz.

  1. __autoload("test");
  2.  
  3. ?>

Bu Class’ımız içerisinden çağırmak için kullanabileceğimiz bir yöntem. Fakat uygulamamız içerisinde, daha önceden hiç bir nesne oluşturmadan __autoload() adında bir fonksiyon yazarakta yapabiliriz. Gördüğünüz üzere yukarıdaki __autoload() metodunu çağırmak için new komutu ile önceden test() adında bir nesne oluşturuyoruz. Bunun yerine aşağıdaki şekilde bir fonksiyon ile de çözebiliriz.

Yukarıdaki fonksiyonu direkt olarak uygulamamızın içerisinde istediğimiz bir yerde, yeni bir nesne oluşturmadan __autoload(string <param>); şeklinde kullanabiliriz.

Not: __autoload() bloğu içerisinde oluşan hatalar catch bloğu ile yakalanamaz!

Erişim Hakları; Nesne içerisindeki bir değişkenin veya metodun nerelerden erişilebileceğini belirlememizde bize yardımcı olan komutlardır. Public, Private, Protected olarak 3 türü mevcuttur.

Public; Bu şekilde tanımlarsak heryerden erişilebilir olduğunu bildiririz. Eğer bir metodun başına hiç bir şey belirtmeden direkt tanımlarsak PHP bunu varsayılan olarak public(paylaşılan) olarak kabul eder. PHP 4’te public yerine kullandığımız var anahtar’ı geriye uyumluluk adına desteklenmektedir fakat PHP’nin 5.1.3 sürümünden önceki bir sürüm üzerinde uygulama geliştiriyorsanız bu E_STRICT uyarısına sebeb olur.

Private; Sadece tanımlanan Class(Sınıf) içerisinden erişilebilir.

Protected; Bu tür tanımlanan metod veya değişkenler sadece ilgili Class içerisinden veya türetilen Class içerisinden erişilebilir. Public gibi dışarıdan erişimi mümkün değildir.

Zend Studio gibi gelişmiş bir PHP IDE’si kullanıyorsanız zaten yeni bir nesne oluşturduğunuzda size Private ve Protected olarak tanımlanmış metod ve değişkenleri göstermeyecektir. Şimdi bunları bir örnek ile inceleyelim.

Zend Studio 7

Gördüğünüz gibi Zend Sutdio’da nesnemizi oluşturduğumuzda bize sadece public metod ve değişkenleri göstermektedir. Aksi taktirde uygulamamız Fatal Error(Ölümcül Hata) ile sonlanır.  Burada _getInfo() ismi ile tanımladığımız bilgi veren metodumuz biraz kafanızı karıştırabilir. Hani private ve protected metodlara dışarıdan erişilemezdi? gibi bir soru ortaya çıkabilir. Biz nesnemizdeki _getInfo() metodunu public olarak oluşturduk ve çağırdık. _getInfo() metoduda class içerisinde olduğundan yine class içerisindeki private,protected ve public değişkenlere erişme hakkı var. Yani biz metodu call(çağırmak) ediyoruz. O metod kendisi erişebildiği değişkenlerin değerlerini bize gösteriyor.

Protected erişim türünü daha iyi inceleyebilmek için, şimdi childClass() isminde yeni bir class oluşturarak bunu parentClass()’mızdan türetelim.

$degisken3 isimli değişkenin değerini burada override(ezmek) ederek değiştiriyoruz. Böylece artık $değişken3 türeyen class’ımızda atadığımız değere göre işlenecektir. Bu nedenle $foo2 nesnemizin _getInfo() metodunu çağırdığımızda ”Ben hem class içerisinden hemde türetilen class’lardan erişilebilirim.” değeri yerine “Değerini değiştirdik.”  yazısını göreceğiz. Hepimizin bildiği gibi başındaki br tag(etiket)’i HTML’e özel bir tag olduğundan tarayıcımız bunu yorumlayarak göstermemektedir. Bu nedenle çıktıda gözükmemektedir.

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

PHP & Bing API 2.0 ile Search

22 Sep

Merhaba,

Bu makalemde sizlere Microsoft’un yeni arama motoru(seçim motoru desek daha doğru olur.)’nun bize sağlamış olduğu Search API(Application Interface) ile kendimize özel bir arama motoru oluşturacağız. Öncelikle http://www.bing2.net adresinden register olarak giriş yapmamız gerekiyor. Eğer Live Messenger kullanıyorsanız bu hesabınız ile de oturum açabilirsiniz. Daha sonra http://www.bing.com/developers/createapp.aspx adresinden yeni bir AppID alarak işlemlerimizi tamamlıyoruz.

Öncelikle her şeyimizi UTF-8 kullanacağımızdan sayfa yapımızı da Zend Studio’nun Project>Properties>Text File Encoding menüsünden UTF-8 olarak ayarlamalıyız. Eğer yeni bir project oluşturmadıysanız sayfanıza sağ tıklayarak properties menüsünden file encoding’i değiştirebilirsiniz.

Arama sorgularımızı göndereceğimiz bir XHTML form hazırlamamız gerekmektedir.

  1.  
  2. <html>
  3. <head>
  4. <title>Bing Search API 2.0 – Test Sayfası</title>
  5. </head>
  6. <body>
  7. <form action="result.php" method="get" id="searchForm01">
  8.  Ara: <input type="text" name="q" id="q" />
  9. <input type="submit" value="Bul" />
  10. </form>
  11. </body>
  12. </html>
  13.  

Yukarıdaki gibi basit şekilde arama formumuzu da tamamladıktan sonra şimdi sıra geldi bu form’dan gelen değere göre Bing API 2.0′ı kullanarak sonuçları almaya.
Bing API XML olarakta size sonuç dönebilme özelliğine sahip fakat JSON daha hızlı olduğundan ben JSON kullanacağım. Hemen yukarıdaki formun altından kodlarımızı yazmaya devam ediyoruz.

  1.  
  2. <?php
  3. if(isset($_GET["q"]) && !empty($_GET["q"])){
  4. $request = ‘http://api.search.live.net/json.aspx?Appid=[AppID]&sources=web&Web.Count=50&market=’ . $lang . ‘&query=’ . urlencode ( $_GET ["q"] );
  5. $response = file_get_contents($request);
  6. $jsonobj = json_decode($response);
  7. foreach($SearchResponse->Web->Results as $value){
  8.      print($value->Url. " – " .$value->;Title. " – ". htmlentities($value->Description, ENT_QUOTES, "UTF-8") . " – ". $value->DisplayUrl . " – ". $value->CacheUrl . "<br>";
  9.  }
  10. }
  11. ?>

Yukarıdaki şekildeki gibi bir çok bilgiye erişmeniz mümkün. Yukarıda sadece web aramaları verildi fakat resim gibi bir çok arama türüne göre sonuçları almanız yine mümkündür. Bunun yanında sonuçlarda reklamda gösterebilirsiniz. Bunun için Microsoft ile bir anlaşma yapmanız gerekmektedir. Yoksa API yetki kısıtlaması nedeni ile reklamları gösteremezsiniz. Ben yinede onunda kodunu vereyim. Belki ileride işinize yarar. Bunun içinde aşağıdaki şekilde bir HTTP Request (HTTP İsteği) göndermeliyiz.

  1.  
  2. <?php
  3. $request = "http://api.search.live.net/json.aspx?Appid=[AppID]&sources=Ad&";
  4. $request .= "market=en-us&query=pc&version=2.0&Ad.AdUnitId=10&Ad.PropertyId=2&Ad.PageNumber=0";
  5. $response = file_get_contents($request);
  6. $jsonobj = json_decode($response);
  7. foreach ($jsonobj->SearchResponse->Ad->Results as $v){
  8.         print($v->AdLinkUrl."-".$v->Title."-".$v->DisplayUrl."-".$v->Description."-".$v->Position."<br>");
  9. }
  10. ?>
  11.  

Bing bize hizmetlerini kişiselleştirerek kullanmamız için 2.0 versiyonu ile gelişmiş bir API sunmaktadır. Tüm özelliklerini ve bu özelliklerin aldığı değerleri açıklamaya kalksam sanırım çok uzun bir makale olacaktır. Eğer bu konu ile ilgilenenler varsa yorum olarak sorularını konun altına eklerse en kısa sürede cevap vererek. Makaleyi düzenlerim.

Bir Öneri: Bilmiyorum, belkide kötü bir öneride bulunuyorum ama yazmak istiyorum. :D İlk denediğim şey search result’u kendi oluşturduğum database’e kaydederek aynı keyword için bir search request geldiğinde kendi database’imden döndürmek oldu. Eğer geniş bir keyword list’e sahipseniz veya sitenizden çok arama oluyorsa bu şekilde aranılan keyword’lerin Bing’in index server’larından alarak kendi index database’nizi oluşturabilirsiniz. Tabii bunu yapmak için geçerli bir sebebiniz de olması gerekiyor. Yoksa bu şekilde TB’larca büyüklüğünde SQL oluştursanız bile, bu datayı yönetmek ve her yerden erişimini sağlamak çok zor. Yüksek seviyeli internet çıkışlarına ve farklı lokasyonlara hizmet verecek bir sürü server’larınız olması gerekmektedir. Belki farklı ihtiyaçlarınız için veya yapacağınız testler için alabilirsiniz.

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

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.

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

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

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

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.  
  2.  
  3.  
  4.  
  5.  
  6. <form id="frm01" method="post">
  7.   Username:
  8. <input name="uname" type="text" value="<?=$username?>" />
  9.   Test Data:
  10. <input name="tdata" size="50" type="text" value="<?=$testData?>" />
  11. <input type="submit" value="Güncelle" />
  12.  </form>
  13.  
  14.  

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

  1.  
  2.  

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

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.  

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

  1.  
  2.  

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

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

 
No 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

 

PHP Type Güvenliği Fonksiyonu

13 Jun

Merhaba,

Bildiğiniz üzere PHP , C# gibi type güvenliği olan dillerden değildir. Değişkenler tipi belirtilmeden yaratılır ve ona göre kullanılır.  Peki tip güvenliği dedimiz olay nedir?

Tip güvenli bir değişken oluşturalım.

[C#]

int sayi = 1535;

float fSayi = 15.4;

string yazi = “Microsoft Windows 7″;

Tip güvenliği olmadan oluşturalım.

[PHP]

$sayi = 1535;

$fSayi = 14.45;

$yazi = “I lost control. :) ”;

Şimdi bu iki tanımlama arasındaki fark sizinde tahmin ettiğiniz gibi birisinde oluşturulan değişkenin tipi baştan belirtilerek oluşturuluyor böylece ileride kullandığımızda programımız her birini tipine uygun çalıştırıyor veya hata veriyor. Diğerinde ise tip belirtmeden bunu dilin kendisinin anlamasını tercih ediyoruz. Gerçi PHP 5.2.x sürümünden sonra bu ayrımı çok daha iyi yapıyor fakat büyük programlarda tür dönüşümleri ve değer tip değişikliklerinden çok büyük problemler çıkabilmektedir.

Peki PHP bunun için ne yapıyor? Tabii ki bir çözümümüz var. Yukarıdaki aynı tanımlamayı şu şekilde de yapabiliriz.

[PHP]

$sayi = (int)1535;

$fsayi = (double)14.45;

$yazi = (string)”I lost control”;

Böylece hem değişken tanımlamış hem de aynı zamanda bir convert işlemi ile değişkenlerin türlerini istediğimiz türe çevirdik. PHP ile değişken tanımlama seviyesinde yapabileceğimiz maximum budur diye tahmin ediyorum. Peki biz önemli projelerimizde bu tipleri nasıl kontrol edeceğiz. Büyük bir program geliştirdiğimizde, değişkenin nerelerden geçtiğini ve son değişken değerinin, bizim istediğimiz tipten olup olmadığını anlamak güçtür. Ayrietten bunu run time’da denetlemek daha da zordur. Çünkü, gelen veriler kullanıcılardan veya farklı 3. bir web servisinden olabilir. Bu nedenle bizim bunu program içinde denetlememiz gerekmektedir. Böylece runtime’da gelen datalar kontrol fonksiyonu tarafından denetlenerek olası problemler öngörülecektir.

İlgili fonksiyonu aşağıda veriyorum. Kendi class’larınıza ekleyebilirsiniz.

  1.  
  2. class foo {
  3.         protected $type;
  4.         /**
  5.          * Type Controller
  6.          *  @var any type
  7.          */
  8.         public function typeControl($type) {
  9.                 $this->type = $type;
  10.                 is_string($type) ? $type = "String" : null;
  11.                 is_int($type) ? $type = "Int" : null;
  12.                 is_double($type) ? $type = "Double" : null;
  13.                 is_bool($type) ? $type = "Bool" : null;
  14.                 is_array($type) ? $type = "Array" : null;
  15.                 is_float($type) ? $type = "Float" : null;
  16.                 is_object($type) ? $type = "Object" : null;
  17.                 $type = "Bu değişken ".$type." türündendir.<br>";
  18.                 return print $type;
  19.         }
  20. }
  21. // Variables
  22. $control = new foo();
  23. $int = 3;
  24. $str = "test";
  25. $double = 7.9;
  26. $bool = false;
  27. $arr = array("Hakan",9,"Arda",7,"Atilla",3);
  28. $object = new foo();
  29.  
  30. // Type Controller
  31. $control->typeControl($bool);
  32. $control->typeControl($double);
  33. $control->typeControl($str);
  34. $control->typeControl($int);
  35. $control->typeControl($arr);
  36. $control->typeControl($object);
  37. ?>
  38.  

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

C#.NET ve TypeOf Operatörü

07 May

Merhaba ,

Garip şekilde bu konuda 3-4 kişisen istek geldi. :) Basit bir konu ama yinede anlatayım. Gerçi neyini anlatıcam tam bilemiyorumda ama kısaca TypeOf Nedir? dersek.

TypeOf; Run Time’da her hangi bir türe ilişkin Type Class’ı türünden bir object üretir. Daha iyi anlamanız açısından küçük bir örnek yazıyım.

  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5.  
  6. namespace TypeOf
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Tipler tip = new Tipler();
  13.             tip.myMain();
  14.  
  15.             string s = "\n Programı sonlandırmak için enter’a basınız….";
  16.             Console.WriteLine(s);
  17.             Console.ReadLine();
  18.            
  19.         }
  20.     }
  21.  
  22.     class Tipler
  23.     {
  24.         public void myMain()
  25.         {
  26.             Type tip = typeof(Tipler);
  27.             Tipler yeniTip = new Tipler();
  28.             Type tipTuru = yeniTip.GetType();
  29.  
  30.             Console.WriteLine(yeniTip.ToString());
  31.             Console.WriteLine(tip.ToString());
  32.         }
  33.     }
  34. }
  35.  
  36.  

Sanırım yeteri kadar açık oldu. Daha başka nasıl anlatabilirim bilmiyorum. :) Bildiğiniz gibi yinede takıldığınız bir yer olursa yorum olarak yazabilirsiniz. Ozan’cım bu senin içinde geçerli :D

İyi Çalışmalar.

 
No Comments

Posted in C#

 

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.