WMAracı üzerinden gelen bir soru üzerine bu anlatımın daha çok kişiye faydalı olabileceğine inandığımdan bir kaynak hazırlamak istedim. PHP ile veritabanı bağlantısı yaparak basit bir test yapısı kuracağız.
1. Veritabanı
Bu basit yapımızda 1 veritabanı oluşturacağız ve içerisinde 2 tane tablomuz olacak.
- Veritabanımız: test
- Tablolarımız: cevaplar ve kullanicitestleri
Tablolarımızın yapılarına göz atalım;
1.1 Tablolar
1.1.1 cevaplar Tablosu
1.1.2 kullanicitestleri Tablosu
1.2 Tablo İlişkileri
Her iki tabloda da yer alan cevaplar arasında bir karşılaştırma yapacağız. Bu veritabanımızda tek bir test yer alacağı için ilişki kurma gereği duymuyoruz. Eğer birden fazla test barındıracaksak cevaplar tablosunda yer alan anket_id ile kullanicitestleri tablosunda yer alan id sütunları arasında bir ilişki oluşturabiliriz.
2. Kodlar
2.1 Test Sayfası
Kodlama kısmı için 2 bölümümüz olacaktır. Bu bölümlerimizi ayrı ayrı işleyeceğiz. Öncelikle kullanıcının test cevaplarını girdiği alanı hazırlayacağız. Ben kod yapısında rastgele şıkları çektim. Kullanıcı elbette değiştirebilir. Öncelikle görünüme göz atalım;
Kullanıcıdan bu tarz bir sayfada cevapları alacağız. Öncelikle CSS kodlarını şöyle bırakıyorum;
input {
width: 30px;
height: 24px;
float: right;
text-align: center;
outline: 0;
border: 1px solid #000;
}
.soru {
width: 60px;
float: left;
background: #000;
color: #fff;
margin: 5px;
padding-left: 5px;
line-height: 24px;
}
input.kullaniciId {
float: left;
width: 100%;
}
button {
display: block;
width: 100%;
height: 36px;
border: 0;
outline: 0;
cursor: pointer;
background: #000;
color: #fff;
}
Form bölümümüz;
<form method="post">
Kullanıcı ID:
<input type="text" name="kullaniciID" value="15" class="kullaniciId">
<?php
$siklar = array("A","B","C","D");
for ($j=0; $j < 55; $j++) {
$soru_sayisi = $j+1;
echo '<div class="soru">'.$soru_sayisi.'<input type="text" name="cevap'.$j.'" value="'.$siklar[array_rand($siklar)].'"></div>';
}
?>
<button name="kaydet">Kaydet</button>
</form>
PHP Kontrollerimiz;
<?php
try {
$db = new PDO("mysql:host=localhost;dbname=anket", "root", "");
} catch ( PDOException $e ){
print $e->getMessage();
}
if(isset($_POST["kaydet"])) {
$testler_kullanici = $db->prepare("SELECT * FROM kullanicitestleri");
$testler_kullanici->execute();
$testler_kullanici = $testler_kullanici->fetchAll(PDO::FETCH_ASSOC);
$kullaniciId = $_POST['kullaniciID'];
$alinanCevaplar = $_POST['cevap0'];
for ($k=1; $k < 55; $k++) {
$alinanCevaplar = $alinanCevaplar."@".$_POST['cevap'.$k];
}
$ekle = $db->prepare("INSERT INTO kullanicitestleri SET
kullaniciId = ?,
cevaplar = ?");
$insert = $ekle->execute(array(
$kullaniciId, $alinanCevaplar
));
if ( $insert ){
$last_id = $db->lastInsertId();
echo "Cevaplarınız kaydedildi. Teşekkürler";
}
}
?>
Bu yapımızı kurduktan sonra artık veritabanımıza kullanıcının girdiği değerleri kaydediyoruz. Peki nasıl?
Farkettiyseniz kullanıcının yazdığı tüm cevapları aralarına @ işareti koyarak bir değişkene atadık. Bu değişkenimizi veritabanına yolladık. Yani veritabanımızdaki bir örneğimizi incelersek;
Aynı şekilde CEVAPLAR tablomuzda da testimizin cevaplarını şu şekilde kayıt altına aldığımızı varsayıyorum;
O halde artık ikinci sayfamız olan kontrol sayfamıza geçebiliriz.
2.2 Kontrol Sayfası
Kullanıcılardan gelen cevaplar ile veritabanımızdaki doğru cevaplar arasındaki karşılaştırmayı yapmak için şöyle bir ekran hazırlıyoruz;
Sayfamızın FORM alanı için;
<form method="get">
<select name="sTestID">
<?php
for ($m=0; $m < $sayKullanici; $m++) {
echo '<option value="'.$kullanici[$m]["id"].'">ID: '.$kullanici[$m]["id"].'</option>';
}
?>
</select>
<button name="testiKontrolEt">Testi Kontrol Et</button>
</form>
ve PHP kontrollerimiz;
<?php
try {
$db = new PDO("mysql:host=localhost;dbname=anket", "root", "");
} catch ( PDOException $e ){
print $e->getMessage();
}
if(isset($_GET["testiKontrolEt"])) {
$sTestID = $_GET["sTestID"]-1;
$anket = $db->prepare("SELECT * FROM cevaplar");
$anket->execute();
$anket = $anket->fetchAll(PDO::FETCH_ASSOC);
$kullanici = $db->prepare("SELECT * FROM kullanicitestleri");
$kullanici->execute();
$kullanici = $kullanici->fetchAll(PDO::FETCH_ASSOC);
$dogruCevaplar = explode("@", $anket[0]["cevaplar"]);
$kullanicininCevaplari = explode("@", $kullanici[$sTestID]["cevaplar"]);
for ($i=0; $i < 55; $i++) {
if($dogruCevaplar[$i] == $kullanicininCevaplari[$i]) {
$cevap = 1;
} else {
$cevap = 0;
}
$kontrol[$i] = $cevap;
}
$sonuclar = array_count_values($kontrol);
echo '<b>Doğru Sayısı</b> : '. $sonuclar[1].'<br/>';
echo '<b>Yanlış Sayısı</b> : '. $sonuclar[0];
}
?>
3. Sonuç
Sonuç olarak tek bir test için birden fazla kullanıcının gönderdiği sonuçları alıp veritabanına kaydettik, akabinde kontrol sayfamız ile doğru cevaplar ile kullanıcılarımızın gönderdiği cevapları karşılaştırdık.
Tek bir dosya olarak sql ve php dosyasını aşağıdaki linkten indirebilirsiniz;