29 MAYIS 2017
SALI
03.12
PHP ile Test Örneği

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;

Buraya tıklayarak dökümanları indirebilirsiniz.

YORUMLAR 3
0
web tasarım
10 MAYIS 2020 - 20.35
çok teşekkürler bir müşterim okulun testleri ile ilgili web sitesine test bölümü eklettirecekti. Bu kodlar işime çok yarayacaktır. En azından geliştirmek için fikir edinirim.
CEVAPLA
0
Mert Topuz
12 MAYIS 2020 - 03.39
Çok teşekkürler, işinize yaramasına sevindim :)
0
Mert Topuz
05 HAZİRAN 2017 - 22.53
@Yunus Emre Geldegül, umarım yakın zamanda o alanlarda da yayınlar vermeye başlarım :)
CEVAPLA
0
Yunus Emre Geldegül
05 HAZİRAN 2017 - 17.39
JQuery ve bootstrap üzerine derslerini de bekliyorum Mert :) Ellerine sağlık.
CEVAPLA
YORUM BIRAK
Şuanda bu yoruma cevap yazıyorsunuz:
İptal Et