Venus Programlama

Winsock Uygulaması

Visual Basic Yorum yapılmamış »

* Makalede anlatılanlar Visual Basic 6.0 Service Pack 6′da denenmiştir.

Visual Basic kullananlar bilir ki toolbox (soldaki araç kutusu) üzerinde sağ tuşla tıklayarak “Components…” menüsüne tıklayarak araçlarımıza yeni bileşenler ekleyebiliriz. Bunlar DLL, OCX dosyaları olup içlerinde hazırladığımız programda kullanacağımız çeşitli araçlar içerir (Progress Bar, Form 2.0, Inet vs.). İşte burada listelenen “Microsoft Winsock Control 6.0″ ı araçlarımız arasına alıp formda yer verirsek bir TCP/IP ya da TCP/UDP protokollü geçişe sahip bir ağ geçişi sağlamış oluruz. Araç kutusundan Winsock’u seçip formumuza ekleyelim.

Özellikler “Properties” bölümünde yer alan RemoteHost ve RemotePort, başka bir bilgisayara bu protokol üzerinden bağlanmamız için gerekli iki önemli özellik. RemoteHost bir sunucu adı ya da ip adresi olabilir, port ise karşı tarafa verileri ileteceğimiz 0-65536 arasında olabilecek port numarasıdır. Bu bilgileri girdikten sonra kodlarımız arasına şunu yazarak bağlantıyı sağlarız:

Winsock1.Connect

Burada geçen Winsock1, Winsock için bir isim olup Özellikler menüsünden bu isim değiştirilebilir. Peki ya bağlanamazsa? Eğer bağlantı sağlanamazsa bunu anlamanın yolu uygulama ile birlikte gelen nesne_Error fonksiyonudur.

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, _
ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, _
ByVal HelpContext As Long, CancelDisplay As Boolean)

Dim msg as Integer
msg = MsgBox("Bağlantı sağlanamıyor..", vbOkOnly, "Hatalı")

End Sub

Hata istemci tabanlı olabileceği gibi sunucu tabanlı da olabilir. Winsock uygulaması portlar arası bağlantı felsefesine dayanır. Bu durumda sunucu açık olsa bile, yerleştirebileceği bir port yoksa da hata almanız kaçınılmaz.

Bağlantıyı sağladıktan sonra veri göndermek için SendData() fonksiyonundan yararlanırız. Bu yine Winsock için belirlediğimiz ismin sonuna ilgili ek gelerek yapılır.

Winsock1.SendData( "Selam, nasıl gidiyor?" )

Peki veri geldiğinde yapacaklarımızı nerden ayarlarız. Bunun için nesne_DataArrival fonksiyonunu kullanırız. Fonksiyon sadece bir veri alımı gerçekleştiğinde çalışacaktır. Bu durumda gelen veriyi GetData() ile alırız.

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
DIM Mesaj as String
Call Winsock1.GetData(Mesaj)
End Sub

Sağlanan bir bağlantıyı kapatmak içinse yine nesne adına Close eklemesi yapıyoruz. Böylece bağlantı kesilmiş olacaktır. Bağlantıyı sunucu taraflı kesmek için de aynı komut geçerlidir.

Winsock1.Close

Şimdiye kadar anlattıklarımız İstemci (Client) ile Sunucu (Server) için ortak olması gerekenlerdi. Eğer sunucu isek öncelikle Winsock ile açtığımız portları Listen fonksiyonu ile dinlemeye almak, sonrasında gelen bağlantıyı kabul etmemize yarayan nesne.Accept( reqID ) komutu kullanılmalıdır. Yoksa bağlantı gerçekleşmez.

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Call Winsock1.Close
Call Winsock1.Accept(requestID)
End Sub

Burada öncelikle Close kullanmamızın nedeni, asılı kalan bağlantıyı kapatmak. Böylece bağlantı sorunsuzca sağlanacaktır. Bir bağlantı durumunu nesne.State ile almaktayız. Bu bir sayısal değere işaret edip 2 ise boş, 7 ise bağlı, 8 ise bağlantısı kesilmiş uygulamalar demektir.

Sunucu, kendisine bağlanacak client kadar porta sahip olmalıdır. Örneğin en fazla 4 kullanıcı bağlanacak bir ağ için 5000-5001-5002-5003 portları seçilebilir. İşimizi kolaylaştırması açısından Winsock uygulamamızın Index değerini 0 yaparak bir dize değeri haline getirebiliriz. Böylece 4 kullanıcıya birden mesaj atmak oldukça kolaylaşacaktır.

DIM i as Integer
For i = 0 to max_client
If Winsock1(i).State = 7 Then Winsock1(i).SendData( "Sunucu Mesajı: Hoşgeldiniz..." );
Next i

Aynı zamanda bir sunucu için localport özelliğini ayarlamayı unutmayın. Bu değer sizin clientler için açtığınız port değerine eşittir.

Yazdıklarımızı özetleyecek olursak bir sunucu açıyorsak:

sunucu.LocalPort = 2593
sunucu.Listen

Bir istemci açıyorsak:

istemci.RemoteHost = "localhost"
istemci.RemotePort = 2593
istemci.Connect

İyi kodlamalar..


MySQL’de Inner Join Kullanımı

MySQL Yorum yapılmamış »

Bazı durumlarda bir MySQL veritabanındaki tablolarımızı bir arada kullanmamız gerekir. Sadece yazı ve kategori numaralarının bulunduğu bir tabloda, kategori numarasına karşılık gelen kategorinin adını almak için başlıkta bahsettiğimiz INNER JOIN … ON() kodunu kullanarak istediğimiz bilgileri tek bir sorguyla alırız. Bu komut yapısı şu şekildedir:

SELECT (alacağımız veriler) FROM tablo1 INNER JOIN tablo2 ON (kurallar);

Alacağımız veriler bölümünde gerekli olan sütun adlarına aralarına virgül koyarak yer veririz. Kurallar bölümünde ise klasik bir WHERE … sonu gibi hangi kurallar dahilinde işlemin yapılacağını belirleriz.

SELECT etiket_id, baslik FROM etiketler_yazi INNER JOIN etiketler ON etiket_id=etiketler.id;

Yukarıdaki örnekte etiketler_yazi tablosundan etiket_id değeri, etiketler tablosundan ise baslik değerini aldık. En son kurallar kısmında “etiketler.id” kullanımı dikkatinizi çekmiş olabilir. Burada her iki tablo da id değerine sahip olduğunu düşünerek hangi tablonun id değerini alacağını bildirdik. tabloadi.sutunadi şeklinde bu kullanım sayesinde MySQL’e hangi sütundan bahsettiğimizi anlatmış olduk.

Bunun gibi aynı sütun adına sahip değerlerde “tabloadı as takmaad” şeklinde özel olarak isimlendirme şansına da sahipsiniz. Eğer bu şekilde verileri alacak olsaydık:

SELECT t1.etiket_id, t2.baslik FROM etiketler_yazi as t1 INNER JOIN etiketler as t2 ON t1.etiket_id=t2.id;

Yukarıdaki kod ile bu kod aynı işlevi görüyor. Tek farkı burada özel isimlendirilmelere gidilerek MySQL ile kesin olarak bir anlaşma sağladık. Benzer sütun adları için de “t1.id as id2″ şeklinde isimlendirmelere gidilebilir. Bir sorgu sırasında sonuçlarımızdaki sütun adı burada belirttiğimiz id2 değerini alacaktır.

Kolay gelsin…

AJAX Kullanarak Veri Almak

AJAX, MySQL, PHP Yorum yapılmamış »

Bu makalemizde HTML, PHP, AJAX ve MySQL ortak çalışması sonucu anlık yanıt veren bir sayfa tasarlamayı öğrenelim. Bunun için verdiğimiz harf ya da kelime ile başlayan veritabanında kayıtlı isimleri bize listeleyen bir öneri kutusu yapmaya ne dersiniz? Böylelikle Ajax’ı yakından inceleme fırsatı bulacağız.

Öncelikle verilerimizi alacağımız bir veritabanı ve çeşitli kayıtlar oluşturuyoruz:

CREATE TABLE `ajax_veri` (
`id` int(5) unsigned NOT NULL auto_increment,
`isim` varchar(45) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `ajax_veri` VALUES(“1″, “Ali”);
INSERT INTO `ajax_veri` VALUES(“2″, “Veli”);
INSERT INTO `ajax_veri` VALUES(“3″, “Cavit”);
INSERT INTO `ajax_veri` VALUES(“4″, “Cavidan”);
INSERT INTO `ajax_veri` VALUES(“5″, “Alara”);

ajax_veri adını taşıyan bu tabloya ilk etapta 5 isim yükledik. Şimdi verilerimizi almamıza yarayacak bir PHP dosyası yazmalıyız. Bunu yaparken verilerin GET metoduyla alınmasını sağlamalıyız. Bu dosyamızın ismini ornek.php yapalım. İçerisinde ise ornek.php?kelime=A şeklinde eklendiğinde o harfle ilgili verileri bize listelemesini sağlayalım:

<?php
if ( isset( $_GET['kelime'] ) && strlen( $_GET['kelime'] ) > 0 ) {
$kelime = strtolower( str_replace( "'", "\'", $_GET['kelime'] ) );
mysql_connect('localhost', 'user', 'pass');
mysql_select_db('ajax_veri');
$sorgu = mysql_query( "SELECT * FROM ajax_veri WHERE isim LIKE '" . $kelime . "%';" );
if ( !$sorgu || mysql_num_rows( $sorgu ) == 0 )
echo '---';
else
{
while( $kayit = mysql_fetch_array( $sorgu ) )
echo $kayit['isim'] . ',';
}
mysql_close();
}
else
echo '---';
?>

Buradaki veritabanı bağlantı için gerekli host, kullanıcı ve şifreyi değiştirmeyi unutmayın. Kullandığımız strlen() en az 1 karakter için sorgu yapılmasını sağlamak için. strtolower() ise gelen veriyi tamamen küçük harfe çevirip sorgulamamızı sağlar. str_replace ile üst ayraçlara güvenlik önlemi olarak taksim ekledik. Diğer kısımlar daha önceki yazımda MySQL bağlantısı kısmında anlatılanlardan farklı değil.

PHP dosyamızı yarattıktan sonra sıra HTML dosyamızı ve JavaScript’imizi oluşturmaya geliyor.

<html><head>
<title>Ajax Ornek</title>
<script type="text/javascript" src="ornek.js"></script>
</head>
<body>

<form><input type=”text” id=”txt1″ onkeyup=”ipucuGoster(this.value)”></form>
<p>Oneriler: <span id=”ipucu”></span></p> </body>

</html>

Bu şekil hazırladığımız HTML belgemizde txt1 ismini taşıyan kutucuğumuzda herhangi bir karakter yazıldığında ipucuGoster() fonksiyonunun çalışmasını sağlarız. Üst tarafta ornek.js ye link verdik. Böylelikle son işlem olarak javascript dosyamızı hazırlamaya geldik. “ornek.js” olarak adlandıracağımız bu dosyaya şunlar yazılmalı: 1. Bölüm XMLHTTP objemizi seçmek.

function GetXmlHttpObject()
{
var xmlHttp=null;
try { xmlHttp=new XMLHttpRequest(); }
catch (e) {
try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
}
return xmlHttp;
}

Bu fonksiyon bize tarayıcının uyumluluğunu denetleme şansı verir. Dönen değer null ise Ajax desteği yok demektir. 2. Kısım ise İşlevselliği sağlayacaktır:

var xmlHttp
function ipucuGoster( str )
{
if ( str.length == 0 )
{
document.getElementById("ipucu").innerHTML="";
return;
}
xmlHttp = GetXmlHttpObject();
if ( xmlHttp == null )
{
alert ("Tarayiciniz AJAX destekli degil!");
return;
}

var url=”ornek.php”;
url = url + “?kelime=” + str;
url = url + “&sid=” + Math.random();

xmlHttp.onreadystatechange=stateChanged;
xmlHttp.open(“GET”, url, true);
xmlHttp.send( null );
}
function stateChanged()
{
if ( xmlHttp.readyState == 4 )
document.getElementById(“ipucu”).innerHTML=xmlHttp.responseText;
}

Burada “xmlHttp” bir değişken olup 1. kısımdaki fonksiyonun bize verdiği cevaptır. Cevap olumluysa belirtilen url açılarak (belirtilen kriterlerle) veri alınır ve “id” özelliği “ipucu” olan yere yazılır. Bu işlem her kelime eklendiğinde yazılır. “readyState == 4″ bize işlem tamamlandıktan sonra yapılacakları bildirir. Dikkatinizi çektiyse ornek.php’nin sonuna bir SID= eklemesi yaptık. Bunun nedeni bize hep aynı bilgiyi göndermemesini sağlamak yani sürekli güncel olarak veriyi almak. Bunu header() de dosyanın sürekli eski tarihli olmasını sağlayarak da yapabiliriz.

Farklı örnekleri yine yorumlamak dileklerimizle…

MySQL Komutları

MySQL Yorum yapılmamış »

Açık kaynak veritabanı sistemi MySQL ile anlaşabilmek için çeşitli komutlar kullanmaktayız. Bunlar bir veritabanı yaratmaya, silmeye, tablo oluşturmaya, seçmeye, düzenlemeye ve silmeye yaramaktadır. Şimdi bunlardan en çok kullanılanları ve en önemlileri burada sizlerle paylaşalım.

Öncelikle bir veritabanı (database) yaratmak için kullandığımız CREATE komutu. Bu komut, eğer yetkiliyseniz belirtilen isimde veritabanı yaratmanızı sağlar. Veritabanı, tabloları kapsayan en büyük depolama birimidir.

CREATE DATABASE veritabani;

Bir veritabanı, içindeki tabloları ve tüm bilgilerini silmek içinse DROP DATABASE’yi kullanmaktayız. Yarattığımız “veritabani” isimli veritabanını silmek istersek:

DROP DATABASE veritabani;

Komutu ile bu işlemi gerçekleştiririz. Veritabanının küçük depolama birimleri olan tabloları da CREATE ve DROP ile oluşturur, fakat bu kez DATABASE yerine TABLE deyimi kullanırız.

CREATE TABLE tabloadi (
'id' INTEGER(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`kategori` INTEGER(4) UNSIGNED NOT NULL,
`isim` VARCHAR(45) NOT NULL,
`detaylar` TEXT NOT NULL,
PRIMARY KEY(`id`)
)
TYPE = MYISAM;

Burada parantez içerisinde tablomuzu oluşturan sütunlar ile ilgili bilgileri gireriz. Tek tırnak içindekiler sütun adlarıdır. Sonraki kullanılanlar ise o sütunun özellikleri. INTEGER(Boyut) sayısal bir değer, VARCHAR(boyut) ya da TEXT ise alfasayısal bir değeri ifade eder. DOUBLE ise ondalıklar ve negatifleri de kullanabildiğimiz sayısal ifadelerdir. NOT NULL, sütunun asla tanımsız olamayacağını, AUTO_INCREMENT her yeni kayıtla değerin artacağını (bu işlem otomatik yapılır), PRIMARY KEY hangi anahtarın öndeğer olduğunu (öncelikli) belirtir. En sonda kullanılan MyISAM (ya da InnoDB) ise tablo türünü belirtmemize yarar. Tabloyu silmek içinse DROP kullanılır:

DROP TABLE tabloadi;

Ve şimdi nasıl kayıt ekleyip, düzenlediğimizden ve sildiğimizden bahsedelim. Kayıt eklemek için INSERT INTO deyimini kullanırız.

INSERT INTO tabloadi (sutun1, sutun2) VALUES('deger1', 'deger2');

Burada ilk parantezde sütun adları, VALUES() içerisinde ise o sütuna karşılık gelecekleri yazdık. Eğer tüm sütunları içeren bir komut kullanıyorsanız sütunların sırasına göre yazabilirsiniz.

INSERT INTO tabloadi VALUES('deger1', 'deger2');

Bir kayıttaki değeri UPDATE komutu ile değiştiririz:

UPDATE tabloadi SET sutun1='deger1', sutun2='deger2' WHERE kosul1='kosul2';

Buradaki koşul belirtilirken klasik IF – ELSE deyimlerinde olduğu gibi eşleştirmelere gidilir. Mesela id anahtarı 4 olan veride güncelleme yapacaksak koşulumuz id=’4′ olacaktır. Birden fazla koşul belirtiyorsak ve için AND, veya için OR kelimelerini aralarına getiririz, örneğin id=’4′ AND kategori=’2′ gibi.

Bir kaydı silmek için koşul belirterek aşağıdaki komutu kullanırız:

DELETE FROM tabloadi WHERE sutun1='kosul';

Eğer tüm kayıtları sileceksek WHERE ve sonrasını yazmayarak bu işlemi yaparız. Böylece o tablodaki tüm kayıtlar silinecektir.

Kayıtları seçmek, listelemek içinse SELECT komutu kullanırız. Bu kodun kullanımı aşağıdaki gibidir:

SELECT sutun1, sutun2 FROM tabloadi WHERE sutun1='kosul' ORDER BY sira LIMIT 0, 10;

Belirtilen komuttaki SELECT sutun1, sutun2 hangi sütunların seçime dahil edileceğini belirler. WHERE ile hangi koşula bağlı kayıtları listeleyeceğimizi anlatırız. ORDER BY sira, kayıtların neye göre sıralanacağını. Buraya bir sütun adı gelir. Eğer sayısal ise küçükten büyüğe, ORDER BY sutun1 DESC dersek büyükten küçüğe. Alfasayısal ise A’dan Z’ye, DESC varsa sonunda Z’den A’ya sıralar. LIMIT 0, 10 olarak belirttiğimiz ise kaç kayıt listeleneceği ve nerden başlanacağı. Burada ilk kayıttan başlanıp 10 kayıt listelenir. LIMIT 10, 20 dersek. 10. kayıttan başlar ve 20 tane sıralar.

Sevgilerimizle…
Venus Programlama

str_replace() Kullanımı

PHP Yorum yapılmamış »

Bu komut PHP dilinde, bir değişken ya da yazılan bir metindeki istediğimiz değişiklikleri yapmamızı sağlar. Nasıl kullanıldığı hakkında bir fikir vermesi açısından değişkenleri ile birlikte bu php komutunu tanıyalım.

$degisken = str_replace( 'degisecek', 'yerine konulacak', 'metin' );

Buradaki değişken, metnin tüm değişiklikler yapılmış halini içerecektir. Metin bir değişkenden oluşabilir. Daha iyi anlamak için aşağıdaki örneği inceleyin:

$degisken = 'Bu site html dili ile yazıldı.'
$degismis = str_replace( 'html dili', '<b>html dili</b>', $degisken );

Böylece metindeki “html dili” yazan yeri kalın olarak gösterdik. Değişecek ve yerine konulacak bölümlerinde dize değeri kullanabilirsiniz. Bunu şu şekilde örnekleyelim:

$metin = 'Bu site html ile yazıldı, php ve asp ile yazılmadı.';
$bul = array('html', 'php', 'asp');
$degistir = array('html dili', 'php dili', 'asp dili');
$degistirilmis = str_replace( $bul, $degistir, $metin );

‘degistirilmis’ adlı değişkeni ekrana yazdırdığımızda metnin “Bu site html dili ile yazıldı, php dili ve asp dili ile yazılmadı.” olarak değiştirildiğini göreceğiz. Unutmadan söyleyelim burada yapılan değişiklikler büyük-küçük harf fark etmektedir. Buna strtolower() ya da strtoupper() ile engel olabilirsiniz..


Wordpress'in katkılarıyla hazırlandı ve ndesign teması kullanıldı.
Venus © 2008
Konular RSS Yorumlar RSS Giriş