EğitimPHP

PHP Dersleri – Ders 6: MySQL Veritabanı İşlemleri

Php ile siteler yapmaya başladığınızda sitenizin şah damarı olan veritabanı ile iletişiminizi nasıl yapmanız gerektiğini bu dersimizde göreceğiz. Mysql dersi başka bir makalede verilecektir.

İlk olarak, dersimizde anlatacağımız bağlantı şekli güvenli bağlantı tarzındadır. Dersimizin sonunda nasıl yapmamanız gerektiğini de göstereceğiz. Ne yazık ki bu konuda yazılmış olan Türkçe kaynaklarımızın çoğu yanlış şekilde öğretmektedir ve bu yapacağınız sitelerin hacklenmesi ihtimalini garantilemektedir.

Göstereceğimiz bağlantı tipi prepared dir. Bunun ne anlama geldiğini aşağıda göstereceğim kod ile anlatmaya çalışacağım.

İlk olarak aşağıdaki kodu inceleyelim,

<?php

 $bulunacakid = 1;
$baglanti =  new mysqli("localhost", "mysql kullanıcısı", "şifre", "veritabanı");


$sorgu = $baglanti->prepare("SELECT id FROM tablo WHERE id=?");
$sorgu->bind_param("i", $bulunacakid);

$sorgu->execute();
$sorgu->bind_result($id);

while($sorgu->fetch()){
    
    echo $id;
}

?>

Gördüğünüz gibi direkt olarak komut içine $bulunacakid verisini girmedik. Onun yerine bir “?” koyup, sonradan bu “?”‘ni değişken ile bağdaştırdık.
Benzer bir şekilde bind_result ile seçilen ilk veriyi, yani id sütununu, $id adlı değişkene bağladık. DİKKAT: sütun adı id diye değişken adının $id olması gibi bir zorunluluk YOKTUR.
Birden fazla veri seçiyor olsaydık, bind_result($veri1, $veri2, $veri3) gibi yapacaktık.

Peki bu “i” ne anlama gelmekte?

bind_result fonksyonu, değişken türlerini içeren ilk parametreden sonra bu değişkenlerin verilmesi ile çalışır. $sorgu->bind_param(“i”, $bulunacakid); demek, $bulunacakid verisinin bağlandığı yerin bir “int” olduğu anlamına geliyor.

Peki ya birden fazla değişken olsaydı?

Diyelim ki kullanıcı girişi için bir fonksyon yazıyorsunuz ve bunu veritabanından çekeceğiniz kullanıcı adı ve şifrelerin eşleşmesini kullanarak yapmak istiyorsunuz.
O zaman da sonuç şunun gibi olacaktı:

<?php

function login($user, $pass){
    $baglanti =  new mysqli("localhost", "mysql kullanıcısı", "şifre", "veritabanı");
    $oku = $baglanti->prepare("SELECT id FROM kullanicilar WHERE kull=? AND pass=?");
    $oku->bind_param("ss", $user, $pass);
    $oku->execute();
    if($oku->fetch()){
        return true;
    }
    return false;
    
    
}

if(login("ahmet", "1234")){
    
    echo "Giriş başarılı.";
}else{
    echo "Giriş başarısız."
    
}

?>

Burada ne yaptık?

Gördüğünüz gibi sadece bind_param kullandık, bind_result kullanmadık. Sebebi ise eğer veritabanında o kullanıcı adı ve şifre var ise, fetch fonksyonunun çalışacağıdır.
Yani eğer var ise, if içi çalışacak, yok ise if’in içi çalışmayacak ve fonksyon false döndürecektir. Sebebi ise fetch, eğer işlem olumlu sonuçlanmamışsa false döndürmektedir.
Bunun dışında “i” değil “s” kullandık, sebebi ise kullanıcı ve şifrenin bir string olduğunu varsaymamızdır. Datetime gibi verilerde de bunu kullanabilirsiniz. Blob için ise “b” veya “s” kullanabilirsiniz. Detayları için mysql’in resmi sitesini ziyaret edebilirsiniz.

Mysql bağlantısı nasıl YAPILMAZ?

Diyelim ki burada anlatılanı anlayamadınız ve başka bir siteden baktınız. Eğer kod içerisinde “mysql_query” geçiyor ise, kesinlikle o siteyi terk ediniz.
Mysql_query güvenli olmayan bir yoldur. Mesela size şunun gibi kodlar sunabilirler:

<?php

	
	mysql_connect($hostname,$username, $password) or die ("html>script language='JavaScript'>alert('Unable to connect to database! Please try again later.'),history.go(-1)/script>/html>");
	mysql_select_db($dbname);
	
	# Check If Record Exists
	
	$query = "SELECT * FROM $usertable WHERE user=$loginname";
	
	$result = mysql_query($query);
	
	if($result){
		while($row = mysql_fetch_array($result)){
			$name = $row["$yourfield"];
			echo "Name: ".$name."br/>";
		}
	}

Buradaki sorun şu, gördüğünüz gibi user=$loginname denilmiş. Eğer ki kullanıcı, kullanıcı adı yerine bir SQL komutu yazarsa, yazdığı kod direkt olarak mysql veritabanında işlenecektir. Bu sayede bütün verileri çalabilir, silebilir veya değiştirebilir. Yani bunun şifrenizi yayınlamanızdan hiçbir farkı yok.
Bu tür bir yazılım sizi kesinlikle ama kesinlikle hüsrana uğratacaktır. Ayrıca eğer buna bağlı olarak büyük bir site geliştirirseniz, yayına soktuğunuz anda hack yersiniz ve yazdığınız onca satır kodu tekrar baştan planlamak zorunda kalırsınız.


Destek için bana ulaşabilirsiniz!
İYİ ÇALIŞMALAR DİLERİM!

Önceki dersler için: https://www.nixdestek.org/category/egitim/php/

Etiketler

Ahmet Emin Koçal

Uzun yıllar bilgisayar teknolojileri ile ilgilenmiş, PHP alanında iyi miktarda bilgiye sahip bir destekçi arkadaşınız/hocanız.

Alakadar Makaleler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ayrıca bak

Close
Close

Adblock tespit edildi

Lütfen Adblock'unuzu devre dışı bırakıp bizlere destek olun ki sizlere yardımcı olmaya devam edebilelim