PHP: Hypertext Preprocessor Bölüm 3 - Plazma

Giriş

Yazı dizimizin üçüncü bölümünde lafı hiç uzatmadan öğrendiklerimizi faydalı bir veritabanı uygulaması örneği hazırlamak için kullanacağız. Bu söz konusu örnek basit bir telefon rehberi. Dokümanın okunurluğunu artırmak için görselleri oldukça zayıf bir uygulama olarak tasarlandı. Sizler uygulamanın arayüzünü kendi HTML bilginizle geliştirebilirsiniz.

Not 1: Bu sayıda yer alan örnekler PHP 5 ile hazırlanmıştır.

Not 2: Örneklerde yer alan host ismi, kullanıcı adı, şifre gibi bilgileri (localhost, root, boş şifre) kendi çalışma ortamınıza göre düzenlemeniz gerekmektedir.

Şekil 1.

Bir Veritabanı Uygulaması Nasıl Hazırlanır?

Daha önce de bahsettiğimiz gibi, PHP'de uygulama geliştirebilmek için notepad ya da benzeri bir text editörü yeterlidir. Ancak işin içine veritabanı girdiği zaman, kullanacağımız veritabanını yöneteceğimiz araçlar ya da konsol komutları da projemizin bir parçası haline gelir. Ancak kullanacağımız veritabanları SQL altyapısına sahip olacağı için ve SQL de oldukça gelişmiş bir dil olduğundan, veritabanı araçları ya da konsol komutlarının yapacağı hemen her şeyi SQL komutlarıyla da yapılabilir. Her veritabanının bu konuda istisnaları bulunmaktadır. Ancak bizim ilk adımda yapmamız gereken şey bir veritabanı yaratmak ki her SQL tabanlı veritabanı bu iş için "CREATE" komutunu desteklemektedir.

Temel SQL Komutları

SQL dili ileri seviye olarak işlendiğinde çok fazla detaya sahip olan bir dildir. Ancak başlangıç aşamasında kullanılan standart komutları ele alacak olursak da bir o kadar kolaydır. Bunun en temel sebebi SQL dilinin İngilizce okunurluğunun çok yüksek oluşudur. SQL, insanların konuşma diline en yakın dillerden birisidir.

Şimdi temel SQL komutlarının en basite indirgenmiş tanımlarını ve kullanım örneklerini görelim.

Aşağıdaki 4 komut (SELECT, INSERT, UPDATE, DELETE), SQL dilinde tablolar ile çalışırken kullanacağınız 4 temel komuttur. Bunlar SQL dilinin olmazsa olmazları şeklinde ifade edilebilirler.

SELECT : Bir ya da birden fazla tablodan kayıt seçmeye yarar. SELECT * FROM tablo1 INSERT : Bir tabloya veri girişi yapmaya yarar.

İNSERT INTO tablo1 (alan1, alan2) VALUES ('deger 1', 'deger
2")

UPDATE : Mevcut bir ya da birden fazla kaydı güncellemeye yarar.

UPDATE tablo1 SET alan1 - 'yeni deger 1', alan2 - 'yeni deger
2' WHERE - 'deger 1'

DELETE : Mevcut bir ya da birden fazla kaydı silmeye yarar.

DELETE FROM tablo1 WHERE alan1

'değer 1'

İlk aşamada öğrenmemiz gereken diğer 2 komut ise veritabanı, tablo v.b. yaratmada / yok etmede kullanılan CREATE ve DROP komutlarıdır.

CREATE : Veritabanı ve tablo oluşturmakta kullanılır. CREATE DATABASE veritabani1 CREATE TABLE tablo1 DROP : Mevcut veritabanı ve tabloları yok etmekte kullanılır. DROP DATABASE veritabani1

DROP TABLE tablo1

Veritabanı Tasarımı

Veritabanı tasarımı tüm veritabanı uygulamalarının en kritik noktasıdır. Tasarımdaki bir hata uygulamanın performansını çok kötü etkileyebileceği gibi, projeyi sil baştan hazırlama ihtiyacı doğuracak noktalara kadar ilerleyebilir. Bu nedenle bu konunun çok detaylı işlenmesi gerekmektedir. Örnekler ilerledikçe bu noktaya da zaman zaman değineceğiz. Ancak asıl konumuzun PHP olması nedeniyle ve ilk örneğimizin tek tablodan oluşan, standart bir Excel sayfasından pek farkı bulunmayan türden bir yapısı olduğu için detaylara henüz değinmeyeceğiz.

Öncelikle düşünmemiz gereken noktalar şunlar.

Ortaya çıkarmak istediğimiz uygulama ne tür bilgiler içerecek? * Bu bilgilerin girişi nasıl sağlanacak?

* Veritabanındaki veriler ne boyutlara ulaşabilecek? Eğer büyük boyutlara ulaşması söz konusu ise hız arttırımı için ne tür optimizasyonlar gerekecek?

Veritabanı üzerinde ne tür sorgulamalar yapılacak, hangi raporlar üretilecek?

* Kullanıcıların yetki mekanizması nasıl işleyecek?

* Veritabanı güvenliği projemizde ne kadar ön planda olacak? Ne tür tedbirler almamız gerekecek?

Bu maddeler daha da uzatılabilir. Ancak ilk örneğimizde bu maddelerin birçoğunu atlamak için uygulamamızın şifresiz ve tek bir kullanıcı ile kullanılacağını varsayıyoruz. Veritabanındaki bilgiler de telefon rehberinden ibaret olacak ve şu an için bir güvenlik kaygımız yok.

Şimdi ilk soruların yanıtlarını bulalım.

Ortaya çıkarmak istediğimiz uygulama ne tür bilgiler içerecek? Bu bir telefon rehberi uygulaması olacağı için isim, soyad, şirket, telefon kriterleri ilk akla gelen kriterler. Buna bir de numaranın iş mi özel mi olmasıyla ilgili bir tip kriteri ekleyebiliriz. Ayrıca veritabanlarının genel bir kuralı olarak bir kayıda kolayca erişmemizi sağlayacak bir numara (id) vermemiz gerekir. Bu numara her kayıt için özel olmalıdır ki kayıda erişmek istediğimizde "ismi Ahmet, soyadı Kara, telefonu +90 212 222 33 44 olan iş tipindeki kayıt" demekle uğraşmayalım ve kısaca "3 numaralı kayıt" diyebilelim. Bu durumda rehber tablomuzu şu şekilde modelleyebiliriz.

rehber -> id -> isim -> soyad -> şirket -> telefon -> tip

Buradaki "id" alanının otomatik olarak artması için bu alanı birincil anahtar (PRIMARY KEY) olarak tanımlayabiliriz. Bu durumda biz id alanına bir değer vermesek bile o her kayıt için otomatik olarak artacaktır. Örneğin boş bir tabloya ilk kayıt girildiğinde id 1 olacakken, ikinci kayıt için 2, üçüncü kayıt için 3 değerini alacaktır. Bu kayıtlar silinseler bile id alanı son kaldığı değerden 4, 5, 6, ... şeklinde artmaya devam edecektir.

Veritabanını Yaratmak

Artık nasıl bir veritabanı yaratmak istediğimizi biliyoruz. Öncelikle anlaşılması gereken bir nokta var. Tasarlamış olduğumuz tablo veritabanının kendisi değildir. Veritabanı bu tablo ve daha birçok tablo, görünüm (view), yordam (prosedür) v.b. elementleri içeren bir kavramdır. Kısacası bizim öncelikle bir veritabanı yaratmamız ve daha sonra bu veritabanının altına rehber tablomuzu oluşturmamız gerekiyor. Öncelikle veritabanımıza bir isim bulalım. Plazma dergisine ait bir uygulama olacağı için veritabanımızı "plazma_rehber" olarak isimlendirmeyi uygun görüyorum. Tablo ismi içinse "rehber" oldukça uygun. MySQL kullanacağımızı düşünürsek en ideal yöntemlerden biri "phpMyAdmin" isimli MySQL yönetimi için hazırlanmış açık kaynak kodlu projeyi kullanmak olacaktır. Alternatif olarak MySQL'in yeni versiyonlarında gelen gelişmiş MySQL araçlarını da kullanmamız iyi bir alternatif seçenektir. Ancak bu araçlarla yaşayabileceğiniz sorunları göz önüne alarak ve de PHP bilgilerimizi daha da kuvvetlendirmek adına veritabanımızı sadece PHP dilini kullanarak oluşturacağız.

Veritabanını ve tablomuzu oluştururken izlememiz gereken en düzgün adımlar şunlardır.

1. MySQL'e bağlan.

2. Yaratmak istediğimiz veritabanı daha önceden yaratılmışsa yok et.

3. Veritabanını yarat.

4. Bu veritabanını seç. Bu seçimden sonra çalıştıracağımız komutlar artık bu veritabanı üzerinde çalışacaktır.

5. İstediğimiz tabloyu yarat.

Bu 5 adım bize tertemiz bir veritabanı sunacaktır. Unutmayın ki bu işlemi ilk kurulumda ya da baştan kurulumda yapmanız gerekmektedir. Özellikle 2. adım mevcut veritabanları açısından çok tehlikelidir. Bu adımda tüm veritabanı içerisindeki tüm kayıtlar da silinmektedir. Alternatif olarak 2. ve 3. adımlar atlanabilir ve yalnızca yeniden yaratılmak istenilen tablolar silindikten sonra bu tablolar yaratılarak veritabanının geri kalan yapısı korunmuş olur.

Şimdi bu 5 adımı uygulayan PHP programını görelim.

veritabani_olustur.php:

<?php
// Tanimlar
$mysglHost "localhost";
$mysglKullanicilsmi - "root";
$mysalSifre «
$veritabanilsmi - "plazma rehber";
$tablolsmi - "rehber";
// MySOL'e baglanti yap
mysgl connect ($mysglHost,
$mysglKullaniciIsmi,
$mysglSifre)
or die(mysal error());
echo "-> mysgl'e baglanti yapildi.<br>";
// Daha onceden yaratilmis ayni isimde
// bir veritabani var ise oncekini sil
$sgl - "DROP DATABASE IF EXISTS ".$veritabanilsmi;
mysgl guery($sgl) or die(mysal error());
echo "-> ".$veritabaniIsmi.
" veritabani yok edildi.<br>";
Plazma
// Veritabanini yarat )
$sgl - "CREATE DATABASE ".$veritabanilsmi;
mysal guery($sgl) or error()); $baglanti - new MySOLBaglantisi("localhost",
echo "-> ".$veritabaniIlsmi.
" veritabani yarat#ld#.<br>";
// Yaratilan veritabanina baglanti yap
mysgl select db($veritabanilIlsmi)
or die(mysgl error());
"-> ".$ŞveritabaniIsmi.
" veritabanina baglanildi.<br>";
echo
// Veritabani uzerinde rehber isimli
/4/ bir tablo olustur
$sgl "CREATE TABLE ".$tablolsmi." (
id INT NOT NULL AUTO INCREMENT,
isim VARCHAR (30) NOT NULL,
soyad VARCHAR (30) NOT NULL,
sirket VARCHAR(100) NOT NULL,
telefon VARCHAR(25) NOT NULL,
tip INT NOT NULL DEFAULT O,
PRIMARY KEY (id)
;
mysal guery($sgl) or diel(mysal error());
echo "-> ".$tabloIsmi.
" tablosu yaratildi.<br>";
?>

Veritabanı Bağlantısı

Bu konunun üzerinde geçen sayıda yeterince durmuştuk. Bu yüzden yeniden bir açıklama yapmayı gerekli görmüyorum. Geçen sayıdaki örneğin biraz geliştirilmiş hali aşağıda yer almaktadır. Bu dosya veritabanıyla işlem gerçekleştirecek her dosyanın başında içerik olarak yer alacaktır.

veritabani baglantisi.php:
<?php
class MySOLBaglantisi (|
private $sunucu;
private $kullaniciAdi;
private $sifre;
private $veritabaniAdi;
public function. sunucu,
$ kullaniciAdi,
$ sifre,
$ veritabaniAdi)
$this->sunucu $ sunucu;
$this->kullaniciAdi $ kullaniciAdi;
$this->sifre $ sifre;
$this->veritabaniAdi - $ veritabaniAdi;
)
public function Baglan()
// MySOL'e baglanti yap
mysgl connect ($this->sunucu,
$this->kullaniciAdi,
$this->sifre)
or error());
// Yaratilan veritabanina baglanti yap
mysgl select db($this->veritabaniAdi)
or die(mysal error());
// Turkce karakter seti ayarlari
mysgl guüuery("SET NAMES 'latin5'
COLLATE 'latin5 turkish ei"'");
mysgl guery("SET CHARACTER SET latin5");
mysgl guüuery("SET COLLATION CONNECTION —
turkish ci'");
"plazma rehber");
$baglanti->Baglan();

Arayüz ve Arkaplan Dosyaları

Bu görmüş olduğumuz iki dosya, bu programın arkaplanında doğrudan ekrana çıktı vermeyecek ya da çıktı verme amacıyla tasarlanmamış dosyalardır. Bu dosyalar programın veritabanını oluşturmak ve programın veritabanına bağlanmak gibi görevler üstlenirler. "veritabani_olustur.php" dosyasının tek başına ve bir kereye mahsus çalıştırılması gerekmektedir. Bu işlem, dosyayı web sunucusunun altında ulaşılabilir bir klasöre koyduktan sonra web tarayıcısından bu dosyanın adresi yazılıp, dosya çağırılarak yapılabileceği gibi, konsol ekranından PHP'nin exesine parametre olarak dosyanın sürücü adresi verilerek de yapılması mümkündür.

"veritabani_baglantisi.php" dosyasını ise bu şekilde kullanmayacağız. Bu dosyayı arayüz ve arkaplanda çalışan PHP dosyaları kullanacaklar. Burada arayüz ve arkaplan dosyaları diye bahsedilen dosyalar işletim sisteminde aynı seviyede çalışan dosyalardır. Buradaki arkaplan kelimesinin kullanımı; ekrana çıktı vermeyen, yalnızca işlem gerçekleştiren dosyalar anlamına gelmektedir.

PHP dosyaları dinamik bir yapıda çalışmazlar. Yani PHP dosyası bir kere yüklendikten sonra arayüzle etkileşimli bir biçimde (bir linke, bir düğmeye tıklamak v.b.) PHP komutları çalıştıramaz, veritabanına sorgu gönderemezler. Bu işlemleri gerçekleştirmek için başka bir PHP dosyası çağırmaları gerekmektedir. Duruma bağlı olarak farklı parametrelerle kendi dosyasını da çağırabilir. Örnek olarak bir kaydı silmek için "sil" linkine tıkladığımızda "sil.php" dosyası çağrılarak kayıt silinebilir. "sil.php" dosyası ekrana hiçbir çıktı vermeyebilir. Yani tek görevi belirlenen kayıt ya da kayıtları silmek olabilir. Dosya işlemini gerçekleştirdikten sonra ekrana bir mesaj yazabileceği gibi, bunu da yapmadan kendini çağıran PHP dosyasına ya da başka bir dosyaya yönlenebilir. Bunun en tipik örneği kayıtların listelendiği dosyanın kayıt silme dosyasını çağırması ve bu dosyanın işlemi gerçekleştirdikten sonra yeniden kayıt listeleme sayfasına dönmesidir.

Bizim yapmak istediğimiz işlemler şunlardır.

1. Kayıtları listelemek. 2. Yeni kayıt girmek. 3. Mevcut kayıtları düzenlemek. 4. Mevcut kayıtları silmek.

Kayıtları listelemek için bir dosyaya ihtiyacımız olacağı kesindir.

Bu dosya "listele.php" isimli ilk arayüzlü dosyamız olsun.

Yeni kayıt girmek ve kayıtları düzenlemek aynı form kullanılarak yapılabilecek işlemlerdir. Yeni bir kayıt olduğunda form boş gelirken, düzenleme durumunda form düzenlenecek kaydın bilgileriyle gelebilir. Bu bizi birbirine benzer iki ayrı form dosyasıyla uğraşmaktan kurtarır. Bu işlemlerin yapılabileceği formun yer alacağı dosyaya ise, ikinci arayüz dosyamız olan "form.php" ismini verelim.

Form onaylandığında yeni kayıt girişi ya da değişikliklerin kaydedilmesi işlemini yapacak bir arkaplan dosyasına ihtiyaç duyacağız. Bu dosya işlem bittikten sonra bizi "listele.php" sayfasına geri döndürecek. Bu dosyaya "kaydet.php" ismini verebiliriz.

Son olarak da kayıt silmemize yarayacak "sil.php" dosyasına ihtiyaç duyacağız. Bu dosya da "kaydet.php"ye benzer bir işleyişte çalışacak. İşlemini yerine getirip, bizi "listele.php"ye döndürecek.

Özetleyecek olursak ihtiyacımız olan tüm dosyaları şu şekilde listeleyebiliriz.

1. veritabani_olustur.php : Bir kereye mahsus kullanılacak ve veritabanını yaratacak.

2. veritabani_baglantisi.php : Tüm arayüz ve arkaplan dosyalarınca ortak olarak kullanılacak olan veritabanı bağlantısı sağlayan dosya.

3. listele.php : Veritabanındaki kayıtları listeleyecek. Ayrıca bu dosyada yeni kayıt girişi, kayıtların düzenlenmesi ve silinmesi için linkler yer alacak.

4. form.php : Yeni kayıt girişi ve mevcut kayıtların düzenlenmesi için gerekli formu içerecek ve form onaylandığında "kaydet.php"ye yönlendirme yapılacak.

5. kaydet.php : Eğer formdan gelen kayıt yeni bir kayıt ise veritabanına yeni kayıt girişi yapılacak. Eğer mevcut bir kayıt bilgileri gelmiş ise kayıt yeni değerlere göre güncellenecek. Her iki durumda da "listele.php"ye geri dönülecek.

6. sil.php : İstenilen kayıt silinecek ve "listele.php"ye geri dönülecek.

Kaynak Kodlar

listele.php:
<?php
// Veritabani baglantisini yap
reguire "veritabani baglantisi.php";
?>
<html>
<head>
<title>Plazma #6 - Rehber</title>
<meta http-eguiv-"Content-Type"
content-"text/html;
</head>
<body>
<a href-"form.php">Yeni Kay#t</a><br><br>
<table border-l1>
<tr>
<td>Isim</td>
<td>Soyad</td>
<td>Sirket</td>
<td>Telefon</td>
<td> </td>
</tr>
<?php
$tablo mysgl guery("SELECT *
FROM rehber
ORDER BY isim, soyad");
while($satir - mysgl fetch array($tablo))
(
?>
<tr>
€td><?php echo ?> </td>
<td><?php echo $satirl"soyad"|; ?> </td>
<td><?php echo $satirl"sirket"|; ?> </td>
<td><?php echo $satir("telefon"|; ?> </td>
<td><?php
"0")
echo
else
echo "Ozel";
<a href-"form.php?id-<?php echo Ş$Şsatirl"id"|; ?>">
Duzenle</a>
<a href-"sil.php?id-<?php echo $satirl"id"|; ?>"
onclick-"return confirm('Emin misiniz?')">
sil«</a>
<?php
)
?>
</table>
</body>
</html>
form.php:
<?php
// Veritabani baglantisini yap
reguire "veritabani baglantisi.php";
// URL'den gelen degiskenleri al
$Şid - $
// Eger id bos degilse degerleri oku
VW")
1
$tablo
mysgl guery("SELECT *
FROM rehber
WHERE id - ".$id);
$satir mysgl fetch array($tablo);
$isim - $satirl"isim"i;
$soyad - $satirl"soyad"|1;
$sirket —
$telefon -
$tip > Ssatirl"tip"I;
)
else
1
$isim — "";
—
$sirket —
$telefon -— "";
Stip — "O";
)
<html>
<head>
<title>Plazma #6 - Rehber</title>
<meta http-eguiv-"Content-Type"
content-"text/html;
charset-iso-8859-9">
Plazma
</head> $isim - $
<body> $soyad - $
<form name-"rehberform" $sirket - $
method-"post" $telefon — $ POST("telefon"|;
action-"kaydet.php"> $tip * $ PoST("tip"I;
<table border-l1l cellpadding-5>
Ktr> // Eger id bos ise yeni kayit gir
if($id -- "")
<input name-"isim" mysgl guüuery("INSERT INTO rehber
type-"text" (isim, soyad, sirket,
value-"<?php echo ?>"> telefon, tip)
VALUES
</tr> ('".Şisim."', '".$Ssoyad."',
<tı> YU
<td>Soyad</td>
<td> )
<input name-"soyad" else
type-"text" 1
value-"<?php echo $soyad; ?>"> mysgl guery ("UPDATE rehber
</td> SET isim - '".$Şisim."',
soyad - '".$soyad."',
<tr> sirket - '".$sirket."',
<td>Sirket</td> telefon - '".$telefon."',
<td> tip
<input name-"sirket" WHERE id - ".$id);
type-"text" j
value-"<?php echo Ş$sirket; ?>">
</td> // Listeleme sayfasina git
header("location:listele.php");
?>
<td>Telefon</td>
<td>
<input name-"telefon" sil.php:
type-"text"
value-"<?php echo $telefon; ?>">
</td> <?php
// Veritabani baglantisini yap
i isi
<td>Tip</td> reguire "veritabani baglantisi.php";
<td> " ş
<select name-"tip">
<option valu — '
<?php Si
echo "selected"; ?>> ik van
Is</option>
<option value-"1"
echo "selected"; ?>> ) '
Ozel</option>
</select> // Listeleme sayfasina git
</td> header("location:listele.php");
>>
<input name-"id"
type-"hidden" T
Programın Görünüm ve Kul-
</td>

<td> lanımı

<input name-"onayla"

type="submit" value="Onayla"> Tüm dosyaları hazırlayıp, web sunucusunun erişebileceği bir klasörde topladıktan sonra web tarayıcınızı açıp, adres çubuğuna "listele.php"nin yer aldığı adresi yazın. Örnek: </table> </form> http://localhost/plazma/sayi6/listele.php </body> </html> Karşınıza çıkacak ekran şu şekilde olmalıdır. kaydet.php: Yeni Kayıt <?php

// Veritabani baglantisini yap
reguire "veritabani baglantisi.php";

Şekil 2.

Eğer bu ekran yerine hata mesajı alırsanız veritabanı bağlantı parametrelerini ve veritabanının düzgün yaratılıp yaratılmadığını kontrol ediniz.

Bu ekranda henüz bir kayıt görememekteyiz. Yapabileceğimiz tek şey "Yeni Kayıt" linkini kullanarak bir kayıt girmek. Linki tıkladığımızda aşağıdaki gibi bir form ekrana gelecektir. Bu formu doldurup onaylayarak yeni kayıtlar girebiliriz.

Şekil 3.

Yukarıdaki örnekteki gibi birkaç kayıt girdikten sonra liste aşağıdakine benzer bir biçimde gözükecektir.

Şekil 4.

Artık görebileceğiniz gibi her bir kaydı düzenleme ve silme olanağına sahibiz. Örnek olarak en alttaki kaydın "Düzenle" linkine tıkladığımızda karşımıza bu kaydın bilgileriyle dolu bir form çıkacaktır.

Şekil 5.

İstediğimiz değişiklikleri yaptıktan sonra bu formu onaylayarak değişiklikleri uygulayabiliriz.

Son olarak ise liste sayfasında "Sil" linkine tıklayarak tıkladığımız satırdaki kaydı silebiliriz. Burada ufak bir JavaScript kontrolü bizim yanlışlıkla bu linke tıklayıp kaza eseri bir kaydı silmemizi engellemek için aşağıdaki gibi bir uyarı çıkaracaktır.

Şekil 6.

Tamam'ı tıklamamız durumunda kayıt silinecek, aksi takdirde işlem gerçekleşmeyecektir.

Bu Bölümün Değerlendirmesi

Şekil 7.

Sonunda, önceki bölümlerde öğrenmiş olduğumuz temel bilgileri kullanarak "işe yarar" bir uygulama yapmayı becerdik. Bu örnek elbette ki en basit veritabanı uygulamalarından biridir ve yapısal olarak da çok fazla geliştirilebilir, düzenlenebilir. Ancak yalın, anlaşılır bir kod yapısını korumak için bu şekilde bir başlangıç yaptık. Bu örneği iyice sindirmeniz, ileriki bölümlerde karşınıza çıkacak program yapılarını rahat anlayabilmeniz için çok faydalı olacaktır.

Ev Ödevleri

İlk ödevlerinizi verelim. Bu örnekte isim, soyad, şirket, telefon ve tip kriterlerini kullandık. Bu örneği iyice inceleyip anladıktan sonra;

1. Örneğe adres ve kriterlerini eklemeyi deneyin. 2. Form sayfasına gelindiğinde eğer yeni kayıt girişiyse sayfanın başına "Yeni Kayıt", eğer mevcut bir kayıt düzenleniyorsa başlık olarak "Kayıt Düzenleme" yazdırın.

3. Yeni kayıt girişinde şirket alanına McDonald's yazdığınızda kaydın niye girilmediğinin sebebini bulun ve çözüm arayın. (Hayır, program fast food'a gıcık değil :))

Gelecek sayıda bu soruların yanıtlarını bulabilirsiniz. Görüşmek üzere.

emir (at) akaydin (nokta) com