Selamlar.
Cndr isimli arkadaş ASP ile yazmış ama bir bileşen yükleme mecburiyeti getirmiş. Bu büyük bir dezavantaj, basit bir form için ekstra bileşen kullanmaya gerek yoktur. İkinci olarak, cndr arkadaşımız mail gönderme formu oluşturmuş, oysa soruyu soran arkadaş "veri çağırma, düzenleme, kaydetme" gibi fonksiyonları olan bir form, yani veritabanı bazlı bir form istemiş, yani çok ilgisiz olmuş.
Ben de PHP ile kullanabileceğiniz bir form hazırladım. İki dil arasındaki farka bakarak tercihinizi yapabilirsiniz; ben ASP'yi kirli bir dil olarak nitelediğimden PHP kullanıyorum.
Verileri kaydetmek istiyorsan önce bir veri tabanın olmalı. Dosyalara da kayıt yapabilirsin ama sık kullanacaksan kesinlikle veritabanı kullanmalısın. (Veritabanını ve kullanıcıyı nasıl oluşturacağını bilmiyorsan internette arayarak çok ayrıntılı anlatımlar bulabilirsin.)
Veritabanın hazırsa şimdi aşağıya yazacağım kodları,
form.php veya kendi belirleyeceğin herhangi bir isimle kaydet.
<?php
/*************** AYARLAR **********************/
/***************BASLANGICI********************/
// vt = VeriTabani
$vt_sunucu = 'localhost' // Genellikle localhosttur.
$vt_kullanici = 'kendi_kullanici_adin'; // Kendi veritabani kullanici adin.
$vt_sifre = 'kendi_sifren'; // Kendi veritabani sifren.
$vt_adi = 'veritabani_adi'; // Kendi veritabani adin.
// Formda doldurulacak alanlari burada belirle. Yenilerini ekleyebilir, isimlerini degistirebilir veya cikarabilirsin.
$doldurulacak_alanlar = array(
'kayit_no' => 'Kayıt No',
'isim' => 'Adınız',
'soyisim' => 'Soyadınız',
'e-posta' => 'E-posta adresiniz',
'ulke' => 'Ülke',
'sehir' => 'Şehir',
);
/*************** AYARLAR **********************/
/*****************SONU************************/
//HTML kodlarini göster.
html_baslangic();
// Veritabanina baglan.
mysql_connect($vt_sunucu, $vt_kullanici, $vt_sifre) or die('Veritabanı bilgileri dosyaya yanlış girilmiş veya şu anda sunucu çalışmıyor. Ek bilgi:<br>' . mysql_error());
mysql_select_db($vt_adi) or die('Veritabanı adı yanlış girilmiş, muhtemelen böyle bir veritabanı yok veya bozuk. Ek bilgi:<br>' . mysql_error());
// Güvenlik acigi olmasin.
if (!empty($_POST) && !get_magic_quotes_gpc())
foreach ($_POST as $isim => $deger)
$_POST[$isim] = addslashes($deger);
// Form gönderilmemisse bos formu goster.
if (!isset($_POST) || empty($_POST))
bos_form_goster();
// Kaydet butonuna basilmis..
elseif (isset($_POST['gonderildi']) && $_POST['gonderildi'])
{
$bos_birakilanlar = array();
foreach ($doldurulacak_alanlar as $alan_adi => $alan_aciklamasi)
{
// Bosluklari adamdan saymiyoruz.
$alan_adi = trim($alan_adi);
if (!isset($_POST[$alan_adi]) || empty($_POST[$alan_adi]))
$bos_birakilanlar[] = $alan_aciklamasi;
}
// Formda bos yer birkamissa yeniden doldurma formunu göster.
if (!empty($bos_birakilanlar))
bos_form_goster('Bu alanları boş bıraktınız: ' . implode(', ', $bos_birakilanlar));
// Bos yer birakmamissa kaydet o zaman..
formu_isleme_koy();
}
// Düzenlemek istiyorsa düzenleme formu göster.
elseif (isset($_POST['duzenle']) && $_POST['duzenle'])
duzenleme_formu_goster();
// Kayit silmek istiyoruz..
if (isset($_POST['kayit_sil']) && $_POST['kayit_sil'])
kayit_sil();
// Tüm kayitlari altta göster
kayitlari_listele();
// HTML kapanis kodlari.
html_kapanis();
// Formu ekrana yazdirmak icin bir fonksiyon olusturalim.
function bos_form_goster($hata_mesaji = null, $duzenleme_bilgileri = array())
{
global $doldurulacak_alanlar;
echo '
<form action="', $_SERVER['PHP_SELF'], '" method="post">
<table border="0" cellspacing="2" cellpadding="1" width="500px">';
if (!empty($hata_mesaji))
echo '
<tr>
<td colspan="2" style="border: 1px dashed red; color: red;">', $hata_mesaji, '</td>
</tr>';
foreach ($doldurulacak_alanlar as $alan_adi => $alan_aciklama)
echo '
<tr>
<td>', $alan_aciklama, '</td>
<td><input type="text" name="', $alan_adi, '" value="', empty($duzenleme_bilgileri) ? @$_POST[$alan_adi] : $duzenleme_bilgileri[$alan_adi], '"></td>
</tr>';
echo '
<tr>
<td><input type="submit" value="Kaydet" name="gonderildi"></td>
<td><input type="submit" value="Veri çek" name="duzenle">
<input type="submit" value="Kayıt sil" name="kayit_sil" onclick="return confirm(\'Emin misin? Silme işleminin geri dönüşü yok!\');"></td>
</tr>
<tr>
<td colspan="2"><font color="red"><b>Nasıl kullanılır:</b></font>
Yeni bir kayıt girmek için tüm alanları doldurarak "Kaydet" tuşuna tıklarsın.
Var olan bir kaydı düzenlemek için, aşağıdaki kayıt listesinden bir kayıt numarasını
yazarsın ve değiştirmek istediğin alanları değiştirip "Kaydet" butonuna tıklarsın.
Eğer var olan bir kaydın bilgilerini görmek istersen, kayıt nosunu yazıp "Veri çek"
butonuna tıklayabilirsin. Kayıt silmek için sadece kayıt numarasını ilgili alana yazıp
"Kayıt sil" tuşuna tıklaman yeterli.<br><font color="red" face="arial">Elmacik sevgiler sunar.</font></td>
</tr>
</table>
</form>';
}
function duzenleme_formu_goster()
{
// Veritabanindan bilgileri oku.
$sorgu = mysql_query("SELECT * FROM form_bilgileri WHERE kayit_no = $_POST[kayit_no];");
$bilgi = mysql_fetch_assoc($sorgu);
$kayit_yok = (mysql_num_rows($sorgu) == 0) ? true : false;
mysql_free_result($sorgu);
// Girilen kayit numarasinda kimse yok..
if ($kayit_yok)
bos_form_goster('Girdiğiniz kayıt numarasına ait bir kayıt bulunamadı.');
else
// Veritabanindan gelen bilgileri formun icinde göster..
bos_form_goster(null, $bilgi);
}
function formu_isleme_koy()
{
global $doldurulacak_alanlar;
// Düzenliyor muyuz yeni kayit mi giriyoruz?
$sorgu = mysql_query("SELECT kayit_no FROM form_bilgileri WHERE kayit_no = $_POST[kayit_no];");
$kayit_var = (mysql_num_rows($sorgu) == 0) ? false : true;
list($kayit_no) = mysql_fetch_row($sorgu);
mysql_free_result($sorgu);
$kayit_alanlari = array_keys($doldurulacak_alanlar);
// Kayit varsa bilgileri yenileriyle güncelle
if ($kayit_var)
{
$kayit = 'UPDATE form_bilgileri SET';
foreach ($kayit_alanlari as $kayit_alani)
if ($kayit_alani = 'kayit_no')
continue;
else
$kayit .= " $kayit_alani = '$_POST[$kayit_alani]',";
$kayit = substr($kayit, 0, -1);
$kayit .= "WHERE kayit_no = $kayit_no;";
$kayit_basarili = mysql_query($kayit);
if ($kayit_basarili)
bos_form_goster('Güncelleme işlemi başarıyla gerçekleştirildi.', $_POST);
else
bos_form_goster('Güncelleme sırasında hata oluştu. Ayrıntılı bilgi:<br>' . mysql_error(), $_POST);
}
// Kayit yok, yenisini olusturacagiz.
else
{
$kayit = 'INSERT INTO form_bilgileri (`';
$kayit .= implode('`,`', $kayit_alanlari);
$kayit .= '`) VALUES(';
foreach ($kayit_alanlari as $kayit_alani)
$kayit .= "'$_POST[$kayit_alani]',";
$kayit = substr($kayit, 0, -1) . ');';
$kayit_basarili = mysql_query($kayit);
if ($kayit_basarili)
bos_form_goster('Yeni kayıt başarıyla girildi.', $_POST);
else
bos_form_goster('Yeni kayıt girerken hata oluştu. Ayrıntılı bilgi:<br>' . mysql_error(), $_POST);
}
}
function kayitlari_listele()
{
echo '
<table border="0" cellspacing="2" cellpadding="1">
<tr>
<th>Kayıt No</th><th>İsim</th><th>Soyisim</th><th>E-posta</th><th>Ülke</th><th>Şehir</th>
</tr>';
$bilgiler = array();
$sorgu = mysql_query("SELECT * FROM form_bilgileri");
while ($bilgi = mysql_fetch_assoc($sorgu))
$bilgiler[] = array(
'kayit_no' => $bilgi['kayit_no'],
'isim' => $bilgi['isim'],
'soyisim' => $bilgi['soyisim'],
'e-posta' => $bilgi['e-posta'],
'ulke' => $bilgi['ulke'],
'sehir' => $bilgi['sehir'],
);
mysql_free_result($sorgu);
foreach ($bilgiler as $bilgi)
echo '
<tr>
<td><b>', $bilgi['kayit_no'], '</b></td>
<td>', $bilgi['isim'], '</td>
<td>', $bilgi['soyisim'], '</td>
<td>', $bilgi['e-posta'], '</td>
<td>', $bilgi['ulke'], '</td>
<td>', $bilgi['sehir'], '</td>
<tr>';
echo '
</table>';
}
function kayit_sil()
{
// Güvenlik acigi olmasin.
$_POST['kayit_no'] = (int) $_POST['kayit_no'];
$sorgu = mysql_query("SELECT kayit_no FROM form_bilgileri WHERE kayit_no = $_POST[kayit_no];");
$kayit_yok = (mysql_num_rows($sorgu) == 0) ? true : false;
mysql_free_result($sorgu);
if ($kayit_yok)
{
bos_form_goster('Silmeye çalıştığın ' . $_POST['kayit_no'] . ' numaralı kayıt zaten yok..');
return false;
}
$sorgu = mysql_query("DELETE FROM form_bilgileri WHERE kayit_no = $_POST[kayit_no];");
if ($sorgu)
bos_form_goster("$_POST[kayit_no] numaralı kayıt başarıyla silindi.");
else
bos_form_goster('Silme sırasında hata oluştu. Bilgi:<br>' . mysql_error());
}
function html_baslangic()
{
echo '<html>
<head>
<title>Form sayfası</title>
<style type="text/css">
td, th { border: 1px solid blue; }
</style>
</head>
<body>';
}
function html_kapanis()
{
echo '
</body>
</html>';
}
?>
Bir kaç örnek kayıt içeren SQL sorgusunu da MySQL sunucusunda oluşturacağın bir veritabanında çalıştır. İşte veritabanını kodlara göre düzene sokacak olan SQL sorgusu:
CREATE TABLE IF NOT EXISTS `form_bilgileri` (
`kayit_no` int(4) unsigned NOT NULL auto_increment,
`isim` varchar(80) collate latin1_general_ci NOT NULL,
`soyisim` varchar(80) collate latin1_general_ci NOT NULL,
`e-posta` varchar(80) collate latin1_general_ci NOT NULL,
`ulke` varchar(80) collate latin1_general_ci NOT NULL,
`sehir` varchar(80) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`kayit_no`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
INSERT INTO `form_bilgileri` (`kayit_no`, `isim`, `soyisim`, `e-posta`, `ulke`, `sehir`) VALUES
(1, 'Test1', 'Test2', 'Test3@test4.com', 'Türkiye', 'Adana'),
(2, 'Test5', 'Test6', 'Test7@test8.com', 'Türkiye', 'Bilecik'),
(3, 'Test9', 'Test0', 'Test01@test02.com', 'Türkiye', 'Amasya');
Az önce senin sorunu cevaplamak için yazdığım bu küçük yazılım müsveddesi şu yeteneklere sahiptir:
1- Veritabanına yeni kayıtlar girebilir.
2- Daha önce girilmiş kayıtlara ait verileri veritabanından okuyabilir.
3- Daha önce girilmiş kayıtları güncelleyebilir.
4- Veritabanından kayıt silebilir. (Silmeden önce emin misin diye sorar. :) )
5- İşlemlerin sonucunu bildirir. İşlem başarısız olmuşsa bilgilendirici mesajlar verir.
6- Alanların doldurulup doldurulmadığını kontrol eder ve doldurulmamış alanlar için uyarı verir.
7- Veritabanındaki tüm kayıtları altta listeler.
Dosyadaki "ayarlar" kısmını kendine göre değiştirmeyi unutma. Doldurulacak alanları değiştirebilir, silebilir veya yeni alan ekleyebilirsin. Herşey otomatik olduğu için diğer kodları değiştirmene gerek yok, örneğin doldurulacak alanlara sadece "yaş => 'Yaşınız'" gibi bir ifade girsen, program yaş bilgisini de sorar ve veritabanına kaydeder. Ama bu durumda kayıtları gösterme fonksiyonunu ihtiyacına göre düzenlemen gerekir.
Ayrıca bu kodu sadece örnek olsun diye yazdım, tam fonksiyonel bir program değildir. Örneğin veritabanında çok fazla kayıt varsa tümünü birden listelemeye çalışacağı için sunucu donabilir; donmasa da upuzun bir sayfa ile karşılaşırsın.
Çalışmazsa veya sormak istediğin farklı bir şey olursa biz de hala yaşıyorsak ve cevabı biliyorsak soruna cevabı ölçütünde mukabele ederiz.
Bu arada Türkçe karakterler düzgün görünmezse <head> etiketinden sonra Türkçe karakter kodlaması olan ISO-8859-9 kodunu uygun bir <meta> etiketi içinde yazmalısın. Aslında ben kodlara koymuştum, ama neden etiket içeriği forumda yasaklı kelimeler.
Sevgiler.