PyCharm, PhpStorm, and RubyMine kullanıcıları, jetbrains son güncellemelerden biriyle saydığım IDE'lere gelişmiş veritabanı desteği ekledi. Daha önce de vardı fakat hiç veritabanı bağlantısını PHPStorm'da kullanmamıştım fakat bu videodan sonra denemeye karar verdim ve oldukça efektif buldum.

Java bağlayıcılarını yükledikten sonra birçok veritabanı motorunu projenize bağlayabiliyorsunuz. Projenize veritabanı bağlantınızı kurduktan sonra veritabanı yapısını gözden geçirebilir, yapıyla oynayabilirsiniz. Teknik olarak phpmyadmin yerine bu kısımları kullanabilirsiniz. Bu kısmı ilgimi çok çekmedi, fakat spesifik olarak SQL geliştirirken veritabanı konsolunu kullanabilir ve kod yazım zekasını kullanabilirsiniz. Buraya kadar IDE'den bağımsız bir veritabanı yönetim aracı gibi geldi.

Asıl işe yarayan kısmı ise, kodunuzdaki SQL'leri doğrudan çalıştırabilir veya php kodunuzda SQL yazarken kod yazım zekasını kullanabiliyorsunuz. Videoda örnek kullanımda görebilirsiniz.


Kaynak:http://blog.jetbrains.com/webide/2012/11/sql-suppo......ase-tools/
16 Şubat Cumartesi ´08   —   3 Yorum
v0.7'de altyapıda neredeyse bütün işlerimi PEAR'a yaptırdım. Son günlerde pear'da mysql işlemleri ile ilgili sorular sorulmaya başlandı, ben de yazayım dedim, pear ile SQL işlemlerini MDB2'ye yaptırmaya yönelik 2 döküman yazdım. İkincisi diğerinin devamı gibi oldu ama ana konu sql injection'dan kaçmak. Yine de vermem gereken bilgileri verdim :-)

Pear'da MDB2 ile veritabanı işlemleri
PEAR ve MDB2 ile “Prepare & Execute” sayesinde SQL injection saldırılarına karşı koymak
16 Şubat Cumartesi ´08   —   7 Yorum

MDB2 nedir?

MDB2 pear'da eskiden DB adıyla geliştirilen ve bir süre önce gelişimi durdurulup projeyi mdb2 olarak devam ettirdikleri bir veritabanı yönetim kütüphanesidir. Aslında sırayla girdiğimiz mysql_connect, mysql_select_db, mysql_query ... gibi işlemleri biraz daha ortak yapıda kullanmamızı sağlayan, çeşitli yetenekleri olan güvenli bir kütüphane.

Normalde veritabanımıza (mysql, mssql veya pgsql farketmez) bağlanırken bağlantı kaynak değşkeni oluştururuz. Örneğin :
$db = mysql_connect(...);
sonra da bu değişkeni kullanarak fonksiyonlarımızı işletiriz. Bu noktadan sonra veritabanı seçeriz ve sorgular üretip sonuçlarını işleriz.

MDB2'de veritabanı bağlantı cümleleri vardır. Tek hamlede hem bağlantı değişkenimizi oluşturur hem de veritabanı seçeriz.
$db = MDB2::connect("bağlantı cümlesi");
connect yerine factory fonksiyonunu da kullanabilirsiniz, aynı işi görmektedir. Bağlantı cümlesi, pear dizininde MDB2'nin dizinindeki Drivers klasöründe yüklediğiniz veritabanı sürücülerine göre değişir.

Genellikle mysql için kullanacağınızdan örnek vermek gerekirse
mysql://kullanici:[email protected]/veritabanim
yeterince açık ama yine de üstünden geçeyim. Gördüğünüz gibi cümle bir protokol adresi gibi. Yani ftp'ye bağlanmaktan farksız :-) önce protokol türünü belirtiyoruz (mysql, pgsql, sqlite vs) arada "://" işaretlemesinden sonra kullanıcı, ":" ve şifreyi belirtiyoruz. @ işaretinden sonra sunucu adresi. Sonrasında da klasör ifade eder gibi veritabanı adını veriyoruz. SQLite için ise protokoldan sonra doğrudan dosya adresini veriyorsunuz. (Daha fazla bilgi içinhttp://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php )

Biliyorsunuz mysql mssql sqlite pgsql arasında çok fazla kural farkı yok. Yani aynı sorgularla veri ekleyebiliyor, güncelleyebiliyor, silebiliyor ve listeletebiliyoruz. Böylece aynı veritabanı yapısına sahip mysql ile çalışan bir projeyi mssql'e geçirmek çok da zor olmuyor :-)

Şimdi basitçe bir sorgu işletmeyi göstereyim. MySQL'de bir sorgu işletmek için :
$sorgu = mysql_query("select ...");
// veya
mysql_query("delete from ...") or die("silinemedi");
şeklinde kullanıyorduk. MDB2'de de çok farklı değil :
$sorgu = $db->query("select ...");
sorgu sonucunu işlerken
print 'Gösterilen kayıt sayısı : ' . mysql_num_rows($sorgu) . '<br>';

while($bilgi = mysql_fetch_assoc($sorgu)){
  print '<b>' . $bilgi[baslik] . '</b>';
  print '<br>';
}
şeklinde kullanırdık. İşte bu noktada MDB2 bize birçok kolaylık sağlıyor. MDB2'de sürü sepet sonuç işleme fonksiyonu var fakat biz 2 tanesini kullanacağız.
$sorgu = $db->query("select no, adi, eposta from uyeler where uye_no = 5");
$uye_bilgisi = $sorgu->fetchRow();
Bu kodda $uye_bilgisi değikeni dizi olarak indisleri normal numara olmak üzere
$uye_bilgisi[0]'da no,
$uye_bilgisi[1]'da adi,
$uye_bilgisi[2]'da eposta,
alanlarını tutar. fetchRow fonksiyonunun parametresiyle "İşleme Türü"nü ayarlarız. Eğer ayarlamazsak, veri az önceki gibi gelecektir.
$uye_bilgisi = $sorgu->fetchRow(MDB2_FETCHMODE_ASSOC);
olarak kullanırsak taboldaki indis adlarına göre doğrudan seçebiliriz verimizi ($uye_bilgisi[no], $uye_bilgisi[adi] $uye_bilgisi[epsta]). Bunu her seferinde yapmak yerine, veritabanı bağlantısı yaptıktan hemen sonra
$db->setFetchMode(MDB2_FETCHMODE_ASSOC);
ile "İşleme Türü"nü tüm betik için ayarlamış oluruz. Bundan sonra ilk verdiğim örnek koda göre işleminizi kolayca yapabilirsiniz.


Genellikle 2 tür veri çekeriz, tek satırlık sonuçlar veya listeler. Mesela yukarıdaki sql cümlesi bize tek kayıt döner yani 5 nolu üyenin bilgilerini. Bunun için doğrudan fetchRow() kullanarak bilgileri aldık. Çok satırlı bir sql sorgusu işletiyor olsaydık :
$sorgu = $db->query("select no, adi, eposta from uyeler");  // tum uyeler
while( $uye_bilgisi = $sorgu->fetchRow() ){
  print $uye_bilgisi[adi];
}
şeklinde fetchRow()'u while içinde değişkene atama olayı olarak tanımlayacaktık. Böylece kayıtlar bittiğinde atama gerçekleşmeyecek ve döngü duracaktı. Fakat bu noktada kolaylık olsun diye tüm kayıtları çok boyutlu diziye doğrudan almak için fetchAll() fonksiyonunu kullanıyoruz.
$sorgu = $db->query("select no, adi, eposta from uyeler");  // tum uyeler
$tum_uyeler = $sorgu->fetchAll(); // tüm üyeleri çok boyutlu dizi olarak aldık.

// istersek count($tum_uyeler) ile üye sayısını alabiliriz.

// dönmemiz gerekiyorsa
foreach( $tum_uyeler as $uye ){
  print $uye[adi];
}
Tabi $tum_uyeler dizisi bizim listeledigimiz sql sonucunu dizi olarak donuyor bize. Dizi boyutu da kayıt sayısı yani üye sayısını veriyor count($tum_uyeler) ile. Aynı işlemi $sorgu->numRows() ile de yapabilirdik. Zira while ile kullanıyorsak dizi boyutu diye birşey olmayacak ve numRows'u kullanacağız.

Bu iki yol da neredeyse aynı. while, foreach veya verinizin dizi olarak olup olmaması alışkanlıklarınız ve programlama anlayışınız ile ilgili birşey.

Daha da hızlı dizi olarak almak istiyorsanız
$uyeler = $db->queryAll("select * from uyeler");
size tüm üyleri çok boyutlu dizi olarak $uyeler değişkenine atayacaktır. query + fetchAll işleminin kısaltılmışıdır :-)

Ek olarak

$sorgu->numCols() ile sorgudan kaç tane kolon çıktığını öğrenebilirsiniz.
Aynı zamanda $sorgu->fethcCol() ile verinizi kolon kolon alabilirsiniz de (nerede kullanacağınızı bilmiyorum ama işe yarayabilir).

$sorgu->getColumnNames() ile işlenen kolonları dizi olarak alırsınız. İşleme sırasıyla yerleşecektir dizide. Sorgudan hangi kolonların döndüğünü bilmediğiniz sorgularda kolonları meta olarak basabilmek için kullanabilirsiniz bu fonksiyonu.

$sorgu->seek(5) ile sorguları dönerken 5 kayıt atlamanızı sağlar (ilginç).

$db->lastInsertID() ile son "insert into uyeler (...) values (...)" tipi, veri kayıt sql sorgunuzda eklenen kayıt için, auto_increment olan kolona atanan numarasını döner.

Hata yakalamak

Sorgunuzu çalıştırırken birçok nedenden dolayı çalışmayabilir.
$sorgu = $db->query("...");

if(PEAR::isError($sorgu)) {
  die('Sorgu çalıştırılamadı.<br>Hata mesajı : ' . $sorgu->getMessage());
}
kullanımı; PEAR:isError($sorgu) $sorgu degişkeni ile tanımlanan veritabanı sorgu nesnesinde hata varsa, aynı nesnedeki getMessage() fonksiyonu ile hata mesajını iletir.


http://pear.php.net/manual/en/package.database.mdb2.php adresinden mdb2 manual'ına ulaşabilirsiniz.


Hazırlayan : Mehmet Fatih YILDIZ

Method

MSSQL'e bağlanıp işlem yapabilmek için php'de kullanabileceğimiz 2 farklı teknik var. İlki mysql kütüphanesine çok benzeyen mssql kütüphanesi, diğeri ise ODBC kullanarak. mssql kütüphanesi ile mysql kütüphanesi arasında hiçbir fark yok, sadece mysql yerine mssql yazıp bütün işlerinizi yapıyorsunuz. Diğer teknik ise ODBC kullanarak bağlanmak.

Neden ODBC?

Çünkü odbc Microsoft'un kendi bağlantı protokoludür. Sunucu üzerinde kurulan küçük bir program ile mssql sunucunuza odbc üzerinden rahatlıkla erişebiliriz. PHP'de mssql'in kendi kütüphanesindense bu kütüphaneyi kullanmanızı öneririm. Bazı veritabanlarında Türkçe tablo adları, alan adları kullanılabiliyor. Bu tarz veritabanlarında php'deki mssql kütüphanesi sorun çıkarıyor malesef. ODBC kullanarak kolayca bu problemleri aşabiliriz.

Neler Gerek?

PHP'de Windows sunucuda odbc kütüphanesi için herhangi bir ekstra extension kurulu olması gerekmiyor, ancak *nix tabanlı (unix, linux, macos) sunucularda ise http://www.unixodbc.org/, http://www.minisoft.com/pages/middleware/ODBC_UNIX/odbc32_UNIX.html sayfalarına bakılması gerekebilir. Açıkcası linux sunucu üzerinde çalıştırmayı denemedim, tavsiye de etmem.

Nasıl Olacak Bu İş?

Şimdi mysql'deki bağlantı yapısına yakın bir yapı kullanacağız.
$baglanti = odbc_connect('DRIVER={SQL Server};SERVER=host;DATABASE=veritabani','kadi','sifre');
$baglanti değişkenine $baglanti = mysql_connect'de atadağımız gibi bir bağlantı kaynağı atıyoruz. Ancak bu fonksiyonda CONN String olarak tanımlanan cümlecik ile veritabanını doğrudan bildiriyoruz. Geriye SQL'leri işletmek kalıyor.
// sorguyu isletelim
$sorgu = odbc_exec($baglanti,"select * from tablo");

// verileri alip isleyelim
while( $bilgi = odbc_fetch_array($sorgu) ){
  print_r($bilgi);
}
İşte bu kadar kolay. Genel olarak fonksiyonlar aynı, başına mysql yerine odbc geliyor o kadar. Sorguarımızı ise odbc_exec($baglanti_degiskeni,"sorgu"); şeklinde veriyoruz. Geri kalan kısımları mysql'de bildiğiniz tekniklerle halledebiliyoruz. ODBC fonksiyonları bazı fonksiyonlarda aynı bazılarında da oldukça farklı.

http://php.net/odbc adresinden php'nin odbc fonksiyonları hakkında bilgi edinebilir.
Daha ayrıntılı bir döküman olarak şu adreslere bakabilirsiniz :
- http://phplens.com/phpeverywhere/node/view/9
- http://www.zend.com/zend/tut/odbc.php?article=odbc&kind=t&id=3416&open=1&anc=0&view=1
- http://www.phpdig.net/ref/rn63.html (güzel, örnekli bir referans)


Hazırlayan : Mehmet Fatih YILDIZ

Popüler Etiketler

linux session cookie web app php open source spam facebook connect api box mysql rss xml html meta opengraph optimization fql css3 browsers support portfolio doritos tytz css less compile compiler macosx windows app on-the-fly kurulum nasıl workspace link mail newsletter subscription startups music auth gimp howto twitter statistics istatistik insanlar örnek kod wordpress blog cms wanda proje kampanya apple jquery framework plugin pharma hack nedir search google generator sql optimizasyon analyse procedure mootools ingilizce ipad iphone mobile itunes social media sosyal xhtml javascript job digital konsol login iOS developer service share screen kitap object license language tool coding ios ie internet explorer html5 while ruffles imza signature oyun js development form input http firefox download svn subversion git version control deployment ubuntu sitemap bootstrap mfyz db database free editor pear mdb2 prepare execute mssql pgsql www subdomain redirect crossdomain cache htaccess apache url date tarih ajax ui ux icons terminal kontrol yapıları if switch logo injection ipucu medya query export textarea select xmlhttprequest icon ikon grafik banner calendar server regex tebrik wireless notebook laptop lisans ntfs fstab radio style app store store in-app purchase purchase verification integration storekit itunes connect internet network table applications seo ide phpstorm jetbrains osx player dokuman browser chart diff assets graph design button code route router mod_rewrite lifestream webkit parse zaman widget