Sol Reklam

Web Programlama - Php [Öğretici] - Ep. 6 (MySQL, Mysqli, includes ve trycatch)

Pikod

Bir Kömür Göründü Kaptanım!

Discord:

Pikod#5894

Katılım
28 Kasım 2019
Mesajlar
118
Elmaslar
64
Puanlar
2.245
Minecraft
Pikod
Twitter
hzpikod
Arkadaşlar bu derse kadar öğrenmeniz gereken çoğu şeyi öğrettim. Bu derste MySQL komutlarını lazım olduğu kadarıyla öğretmeye çalışacağım.
İlk olarak php de kullanılan MySQLi ve MySQL arasında ne fark var ? Biz neden mysqli kullanıyoruz.
Şimdi MySQL php nin 5. sürümünden eski sürümlerde kullanılan bir fonksiyondur.
MySQLi ise php 5 üstünde kullanılan fonksiyondur.

Veri tabanlarında vs. herhangi bir fark bulunmuyor. Sadece "php" fonksiyonları içerisinde bazı değişiklikler, kullanım farklılıkları mevcut.
Mysql bağlantısı ve komutlarını kullanabilmek için PHP 7 kullanacağız. Sizinde php 7 kullanmanızı tavsiye ederim.

PHP Versiyonu nasıl öğrenilir?
Eğer xampp kullanıyorsanız muhtemelen zaten php 7 olacaktır.
Ama yok ben host aldım denemek için hostta geliştiriyorum veya appserv vs. kullanıyorum diyorsanız:
Ana dizinde yeni bir dosya oluşturun. (İsmi phpinfo.php olabilir mesela)
phpinfo.php dosyamız içerisine phpinfo(); fonksiyonunu yazıp php taglarımızı kapatalım.
<?php phpinfo(); ?> şeklinde olmalı.
Sonrasında localhost/phpinfo.php sayfasına baktığınızda sayfanın başlığında PHP 7.3 veya 5.1 tarzı bir şey yazar. O sizin php sürümünüzdür.

Gelelim MySQL'e
MySQL ilk olarak nedir bilmeyenler için:
Verilerimizi depolamamızı sağlayan sunuculara, programlara veri tabanı deriz.
MySQL bir veri tabanıdır.
mysql sayesinde kullanıcı bilgilerini depolayabilir, kütüphanede alınan kitapları kaydedebilir ve daha bir çoğunu yapabiliriz.

Şimdi şöyle düşünüyor olabilirsiniz: Verilerimizi depolayan program sunucular vs. veri tabanıymış. E o zaman bir tane veri tabanı yok?!?!? Diğerleri neler??
Eğer öyle düşündüyseniz çok yerinde bir soru. Diğer veritabanları Sqlite, Sql, quick.db... şeklinde sıralanabilir. İsmi aklıma gelmeyen sürüce veri tabanı tipi vardır.
Biz php de mysql kullanırız çünkü genellikle mysql kullanılıyor. Çok kullanışlı ayrıca "phpmyadmin" adı verilen bir skript desteği mevcut.

Nedir phpmyadmin?
PHPMyAdmin adından anlaşılacağı üzere Adminlerle alakalı bir şey.
Yöneticilerin, adminlerin php aracılığıyla mysqli kontrol etmesini sağlıyor.
Böyle söyleyince bunu bir kütüphane vs. olarak algılayabilirsiniz ama bu kütüphane falan değil.
Localhost/phpmyadmin adresine gittiğinizde xampp ın sizin için kurduğu myadmin scriptiyle karşılaşırsınız.
Size kullanıcı adı şifre soruyor olacaktır.
1576395073960.png

Ben keyubudan aldığım serverin veritabanını size örnek olarak şöyle göstereyim.
Temel olarak böyle bir görüntüsü var.

Şimdi diyeceksiniz ki benim giriş bilgilerim ne?
Nasıl değiştiririm?

Xampp kullananların default (varsayılan) bilgileri şöyledir:
Kullanıcı adı: ROOT
Şifre: boş bırakınız

Bu bilgiler ile PhpMyAdmine giriş yapabilirsiniz. Aslında siz phpmyadmine giriş yaptığınızda skript sadece sizden MySQL in kullanıcı adı ve şifresini alıyor.
Sonrasında tabloları vs. alarak size gösteriyor. Yani phpmyadmini mysql ile aynı şey olarak algılamalısınız. phpmyadmin php ile yapılmış bir skripttir sadece.

Girdiğinizde sol tarafta size veritabanlarınız listelenecektir.
Konuya devam etmeden önce 10 dakika orayı incelemenizi istiyorum.
Orada yeni bir veritabanı oluşturun.
Veri tabanını genişletin ve yeni tablolar oluşturun.
örneğin:
site1veritabani
kullanicilar
duyurular
bloglar
forum_mesajlar

bu tarzda tablolar oluşturmanızı istiyorum sizden.

Eğer bunu yapabilirseniz okumaya devam edin.

-------------------------------------------------------------------------------
Evet şimdi gelelim MySQL php bağlantısına

İlk olarak php taglarınızı açın.
Bağlantı için bir fonksiyonumuz var.
mysqli_connect(); fonksiyonuyla mysqle bağlanıyoruz.
Tabiki php ye şifre, kullanıcı adı, host (sunucu adresi), veritabanı
tarzında bilgileri vermemiz illaki gerekiyor.
Bu bilgileri sırasıyla
mysqli_connect(host, kullanıcı adı, şifre, veritabanı);
şeklinde yazmalısınız.
Bu akıl karıştırıcı olacağından bilgilerinizi şu şekilde değişkenlere aktarabilirsiniz:
$host = "127.0.0.1"; //127.0.0.1 lokalinizin ipidir
$usrName = "root";
$pwd = ""; //yoksa boş bırakınız
$veritabani = "test_veritabani";

Sonrasında bu şekilde bilgilerinizi aktardıktan sonra şu şekilde de mysqle bağlantınızı yapabilirsiniz:
PHP:
mysqli_connect($host, $usrName, $pwd, $veritabani);
Bunu yaptık diyelim. Ne oluyor?
Bunu yaptığınızda hiçbir şey olmuyor. Hiçbir şey!
MySQL bağlantınızı kullanabilmek için ilk olarak mysqlinizi bir değişkene aktarmalısınız.
Php de bazı dillerde olmayan bir değişken tipi vardır.
OBJECT yani Fonksiyonlardan return olan değerleri değişkenlere aktarabilirsiniz.
Örneğin $mysql = mysqli_connect($host, $usrName, $pwd, $veriTabani);
Burada mysql değişkenine fonksiyondan return yani dönen değeri gönderiyoruz.
Yani bundan sonraki mysql güncelleme, çekme, yükleme vs. fonksiyonlarımızda bu değişkenimizi kullanacağız.

Şimdi başlıkta bulunan includes öğretme vakti geldi.
Bildiğiniz üzere bu değişkeni her seferinde belirlemek bize zor gelecektir.
Bunun için php include diye bir fonksiyon yapmış.
include("include edilecek php dosyası");
şeklinde string değer alan include fonksiyonumuz sayesinde istediğimiz php dosyasını include fonksiyonunu kullandığımız yere alabiliyoruz.

Bu fonksiyon genellikle her projede kullanılır.
Şimdi örneğin mc-tr sitesinde header kısmı var. Yani forumlar , kullanıcı paneli vs.
Tüm sayfalarda yukarısı var. Yukarıyı tüm sayfalara ekleyen fonksiyon include'dur.
Genellikle başa header include edilir.
Header.php dosyasına da options.php
veritabani.php şeklinde bazı dosyalar include edilir.
Örneğin urlnin ne olduğunu çekebilmek için options.php dosyasına $url koyarsanız diğer sayfalardan ona hızlı bir şekilde ulaşabilirsiniz.
Ve buda siz istediğinizde url yi daha hızlı değiştirmenize yarayacaktır. Tek tıkla url değiştirebilirsiniz.
Şimdi url değiştirme falan dedim de takmayın sadece değişken değerini değiştirirsiniz. Yoksa domain falan alamazsınız değişkenle sdjfksdjkf

Arkadaşlar konumuza dönelim
include fonksiyonunu header.php veya mysql ı kullanacayınız dosyaya include edin.
Sonrasında include ettiğiniz sayfanın içinde mysql değişkenini yazın.
Böylece artık header.php de include ettiğiniz yerden itibaren $mysql değişkenini çağırabilirsiniz.

Bazı hatalı engelleme
Arkadaşlar hemen diğer konuya geçmeden önce mysql bağlandı mı bağlanmadı mı nasıl kontrol edilir? Fonksiyonların çalışıp çalışmadığı nasıl kontrol edilir bunu göstereceğim.

Try Catch bloğu ile bu dediğim şeyi yapabiliriz.
Try Catch bloğu sayesinde bir fonksiyonunun çalışıp çalışmadığını kontrol eder ve catch kısmında çalışmadıysa ne olacağını yazarız.

PHP:
try{
    Doğru giden bir kod
    Hatalı Kod
    echo "asd";
}catch($err){
 echo "hatalı bir kod var!!!!";
 die();
}

Evet örnek kodumuzu baştan anlatmaya başlıyalım.
1. Satır: try bloğunu açıyoruz.
2. Satır: Doğru giden bir kodumuz mevcut sorun yok.
3. Satır: Hatalı çalışan bir kod var.
4. Satır: Çalışmadı çünkü bir satır üstündeki kod çalışmayı durdurdu.
5. Satır: catch bloğunu açtık ve içerisine $err yazdık neden? $err errorun kısaltması olarak düşünün. Hatanın ne olduğunu yazmanızı sağlar $err değişkeni içine hatayı string biçiminde aktarır.
6. Satır: Eğer catch bloğu çalışırsa hatalı bir kod var yazdırmasını sağlar.
7. Satır: kodun geri kalanının çalışmamasını sağlar.

Biz bunu MySQL için kullanırsak mysql in bağlanıp bağlanamadığını veya hata verip vermediğini anlayabiliriz.
echo $err yazarsanız hatayı try catch bloğu koymadığınızda nasıl yazdırıyorsa aynı şekilde yazdıracaktır.

Bazı durumlarda mysql try catch a girmez. Ve hata oluşturur. Bu durumlarda bağlantı değişkenimizi yani $mysql değişkenimizi kullanarak hatayı bulabilirz.
Şu fonksiyonu kullanarak:
echo mysqli_error($mysql);
örnekte gördüğünüz gibi echo fonksiyonuyla otomatik olarak fonksiyonlardan return olan değerleri yazdırabiliyoruz.

Şimdi gelelim query fonksiyonlarına
Arkadaşlar query sorgu demek. Veri tabanları genellikle sorgularla çalışırlar.
Siz sorguyu gönderirsiniz onlar size bir şeyler döndürür.
Şimdi mysqli_query(); fonksiyonumuzun kullanımını göreceksiniz:
PHP:
mysqli_query($mysql, "SORGUNUZ", MYSQLI_STORE_RESULT); //Sonuncu değer ne anlama geliyor?
//MYSQLI_USE_RESULT (Use this to retrieve large amount of data)
//MYSQLI_STORE_RESULT (This is default)
//W3SCHOOL sonuncu değer için bu şekilde bir açıklama yapmış arkadaşlar.
//Yani birisi normal değer almanızı birisi daha büyük değerlerde data almanızı sağlıyormuş
//Ben de tam olarak bilmiyorum ancak eksiksiz bilgi vermek istiyorum.
//Normalde ben fonksiyonu şu şekilde kullanıyorum:
mysqli_query($mysql, "SORGUNUZ");
//Bu şekilde normalce çalışıyor. Eğer bir gün ihtiyacınız olursa yukarıdaki gibi bir kullanımıda var.
//SORGUNUZ kısmına yazacığımız şey en zor kısmı arkadaşlar.

Şimdi sorgumuz ney ?
:D
MySql sorguları tamamiyle apayrı bir dil oluyor arkadaşlar..
Bunun için mysql eğitimlerine bakabilir veya işinize yarayacak temel 4 komudu öğrenebilirsiniz.
4 temel şu şekildedir:
https://www.w3schools.com/php/php_mysql_update.asp //GÜNCELLEME
https://www.w3schools.com/php/php_mysql_insert.asp //YENI DEĞER OLUŞTURMA
https://www.w3schools.com/php/php_mysql_delete.asp //DEĞER SİLME
https://www.w3schools.com/php/php_mysql_select.asp //DEĞERİ ÇEKME

Bu dökümanların size fayda sağlayacağından eminim arkadaşlar.
Her seferinde copy paste yaparak mysql dilini öğrenmeniz mümkündür.
Aşırı kolay olduğundan görmeniz aklınızda kalmanıza yeterli olacaktır.

Arkadaşlar dersi bitirmeden önce query ne döndürür. Döndürdükleri nasıl kullanılır? vs. onları anlatacağım.
Query eğer silmeyse true false döndürür
Yüklemeyse true false döndürür.
Update ise true false döndürür.
Çekme ise first elementi array biçiminde döndürür.
Bu ne demek? Bulduğu ilk elementi tablo adlarıyla çekebileceğiniz bir array şeklinde döndürür örneğin:

$donendeger = mysqli_query($mysql, "SELECT * FROM users WHERE userid='123' ");

$donendeger['username'];

Kullanıcının adını bu şekilde çekmiş olabiliyoruz arkadaşlar.
Şimdi diyeceksiniz ki 2. elementi nasıl çekicez ? veya üyeleri nasıl listeleyeceğiz?

Bunun içinde MYSQLI_FETCH_ARRAY
fonksiyonumuz var.
mysqli_fetch_array($query, MYSQLI_BOTH); yazdığınızda sıra sıra döndürmeye başlayacaktır.
bunuda while döngüsüyle kullandığınızda değerler sona erdiğinde döngü duracak yani tüm değerleri yazdırmış olacaksınız örnek:
Kod:
$mysql = mysqli_connect($host, $usr, $pwd, $db);
$komut = "SELECT * FROM users";
$query = mysqli_query($mysql, $komut);
while($row = mysqli_fetch_array($query, MYSQLI_BOTH)){
    echo $row["username"]."<br>";
}

Böyle bir kod ile veri tabanındaki tüm kullanıcı adlarını yazdırabilirsiniz.
Html ile tabloya almak içinde şöyle yapabilirsiniz:
PHP:
<?php
mysqli_connect($host, $usr, $pwd, $db);

$komut = "SELECT * FROM users";

$query = mysqli_query($mysql, $komut);
?>
<table border="1">
<?php
while($row = mysqli_fetch_array($query, MYSQLI_BOTH)){
    echo "<tr>"; //SATIR OLUŞTURUR
    echo "<td>".$row["username"]."</td>"; //HÜCRE OLUŞTURUR
    echo "</tr>"; //SATIRI SONA ERDİRİR
}
?>
</table>

Bu dersten bu kadar olsun. Kendinize iyi bakın. Dersleri takip edip destek verenler için söylüyorum: SİZİ ÇOK SEVİYORUM <3
 

patrick2dev

ölü.
Katılım
11 Aralık 2017
Mesajlar
815
Elmaslar
733
Puanlar
8.305
mysqli'de açıklar bulunuyor, pdo tavsiye ederim.
 

webkit

Koydum Çalışma Masasını
Katılım
27 Kasım 2018
Mesajlar
65
Elmaslar
44
Puanlar
2.060
mysqli'de açıklar bulunuyor, pdo tavsiye ederim.
açık demiyelimde, mysqli fonksiyonları özgür bir fonksiyondur. algoritmada araya sıkıştırılan daha detaylı bir akış için tasarlanmıştır. alınması gereken önlemleri vardır. mysqli_ fonksiyonlarıyla hiç detaylı bir algoritma yazmamış birisi "sql injection" kavramını duymuştur fakat detaylı olarak tam mantığını bilmiyordur.
 
Son düzenleme:

Pikod

Bir Kömür Göründü Kaptanım!

Discord:

Pikod#5894

Katılım
28 Kasım 2019
Mesajlar
118
Elmaslar
64
Puanlar
2.245
Minecraft
Pikod
Twitter
hzpikod
açık demiyelimde, mysqli fonksiyonları özgür bir fonksiyondur. algoritmada araya sıkıştırılan daha detaylı bir akış için tasarlanmıştır. alınması gereken önlemleri vardır. mysqli_ fonksiyonlarıyla hiç detaylı bir algoritma yazmamış birisi "sql injection" kavramını duymuştur fakat detaylı olarak tam mantığını bilmiyordur.
SQL INJECTION buglarının önüne geçmeyi öğrenmeliler bence. Bu yüzden PDO dan bahsetmedim.
PDO tavsiye etmiyorum. Kullamıyorumda
 
S

Silinen üye 79251

Ziyaretçi

Üst kısımda olan arkadaşın dediği gibi MYSQL açıkları var fakat biraz uğraş ile birçok açığı kapatmanız mümkün olacaktır :))
 

patrick2dev

ölü.
Katılım
11 Aralık 2017
Mesajlar
815
Elmaslar
733
Puanlar
8.305
SQL INJECTION buglarının önüne geçmeyi öğrenmeliler bence. Bu yüzden PDO dan bahsetmedim.
PDO tavsiye etmiyorum. Kullamıyorumda
niye pdo'yu tavsiye etmiyorsun? daha kolay diye mi?
 

Pikod

Bir Kömür Göründü Kaptanım!

Discord:

Pikod#5894

Katılım
28 Kasım 2019
Mesajlar
118
Elmaslar
64
Puanlar
2.245
Minecraft
Pikod
Twitter
hzpikod
niye pdo'yu tavsiye etmiyorsun? daha kolay diye mi?
zor :'D çok zor
ben başladığımda araştırdım. Diğer dillerde mySql komutlarını kullanıyordum.
Dedim ki baştan neden pdo denilen bir sistem öğreneyim.
İlk bakışta zor gelmişti belki de öyle değildir.
Ama sonuç olarak diğer dillerde PDO yok ve mySql buglarının karşısına pdo ile geçmek diğer dillerde geçmek için alıştırma yapmayı engeller.
Tabi diğer diller de sunucu yapısı kullanıldığından ne kadar lazım olur bu alıştırma bilinmez xD
 

SkyKios

selam
Katılım
29 Kasım 2019
Mesajlar
88
Elmaslar
29
Puanlar
0
Yaş
24
PHP veya kodlardan hiç anlamam en iyisi wordpress kod olmadan rahat bir hayat :D
 

patrick2dev

ölü.
Katılım
11 Aralık 2017
Mesajlar
815
Elmaslar
733
Puanlar
8.305
Neden altınlarını Discord sunucumuzda kazmıyorsun? TIKLA VE KATIL!
Yukarı