PHP ile MySQL veri tabanına bağlanıp, mysqli ile veri ekleme, silme, düzenleme ve listeleme işlemleri

makale.baslik

PHP ile MySQL veri tabanına bağlanıp ekleme, listeleme, silme ve düzenleme yapacağız. Veri tabanı bağlantısını ve tüm işlemleri kullanmak için Mysqli sınıfını kullanacağımız bir uygulama olacaktır. 

Bu uygulamayı temel alıp düz PHP kullanarak başlangıç seviyesinde CRUD (create, read, update, delete - oluşturma, okuma, güncelleme, silme ) işlemleri yapan web sayfaları yapabilirsiniz. Bu örnek uygulamada 4 sayfamız olacak. Bunlar

ekle.php: verileri eklemek ve listelemek için kullanacağız.

duzenle.php: Veri düzenlemek için kullanacağız.

sil.php: Veri silmek için kullanacağız

vt.php: Veri tabanına bağlanmak için gerekli kodları koyacağız

Önce mesudblog adında MySQL local sunucumuzda veri tabanımızı oluşturalım. Kullanmak için makale adında tablo oluşturalım. İçinde id, baslik ve icerik alanlarını oluşturalım. Gerekli veri tabanını oluşturacak dosyayı makalenin sonunda ekledim.

 

Daha sonra vt.php ile MySQL sunucudaki veri tabanına bağlanalım. Açıklamalar kodların aralarındadır. 

<?php

@$baglanti = new mysqli('localhost', 'root', '', 'mesutdblog'); // Veritabanı bağlantımızı yapıyoruz.
    if(mysqli_connect_error()) //Eğer hata varsa yazdırıyoruz 
    {
        echo mysqli_connect_error();
        exit; //eğer bağlantıda hata varsa PHP çalışmasını sonlandırıyoruz.
    }

$baglanti->set_charset("utf8"); // Türkçe karakter sorunu olmaması için utf8'e çeviriyoruz.

?>

Şimdi ekle.php sayfası ile veri listeleme ve ekleme işlemleri yapacağız.

php mysql ekleme ve listeleme

 

 <?php 
include("vt.php"); // veritabanı bağlantımızı sayfamıza ekliyoruz. 
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Veritabanı İşlemleri</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="col-md-6">
<form action="" method="post">
    
    <table class="table">
        
        <tr>
            <td>Başlık</td>
            <td><input type="text" name="baslik" class="form-control" ></td>
        </tr>

        <tr>
            <td>İçerik</td>
            <td><textarea name="icerik" class="form-control" ></textarea></td>
        </tr>

        <tr>
            <td></td>
            <td><input class="btn btn-primary"  type="submit" value="Ekle"></td>
        </tr>

    </table>

</form>

<!-- Öncelikle HTML düzenimizi oluşturuyoruz. Daha sonra girdiğimiz verileri veritabanına eklemesi için PHP kodlarına geçiyoruz. -->

<?php 

if ($_POST) { // Sayfada post olup olmadığını kontrol ediyoruz.

    // Sayfa yenilendikten sonra post edilen değerleri değişkenlere atıyoruz
    $baslik = $_POST['baslik']; 
    $icerik = $_POST['icerik'];

    if ($baslik<>"" && $icerik<>"") { 
    // Veri alanlarının boş olmadığını kontrol ettiriyoruz. Başka kontrollerde yapabilirsiniz.
        
         // Veri ekleme sorgumuzu yazıyoruz.
        if ($baglanti->query("INSERT INTO makale (baslik, icerik) VALUES ('$baslik','$icerik')")) 
        {
            echo "Veri Eklendi"; // Eğer veri eklendiyse eklendi yazmasını sağlıyoruz.
        }
        else
        {
            echo "Hata oluştu";
        }

    }

}

?>
</div>
<!-- ############################################################## -->

<!-- Veritabanına eklenmiş verileri sıralamak için önce üst kısmı hazırlayalım. -->
<div class="col-md-7">
<table class="table">
    
    <tr>
        <th>No</th>
        <th>Başlık</th>
        <th>İçerik</th>
        <th></th>
        <th></th>
    </tr>

<!-- Şimdi ise verileri sıralayarak çekmek için PHP kodlamamıza geçiyoruz. -->

<?php 

$sorgu = $baglanti->query("SELECT * FROM makale"); // Makale tablosundaki tüm verileri çekiyoruz.

while ($sonuc = $sorgu->fetch_assoc()) { 

$id = $sonuc['id']; // Veritabanından çektiğimiz id satırını $id olarak tanımlıyoruz.
$baslik = $sonuc['baslik'];
$icerik = $sonuc['icerik'];

// While döngüsü ile verileri sıralayacağız. Burada PHP tagını kapatarak tırnaklarla uğraşmadan tekrarlatabiliriz. 
?>
    
    <tr>
        <td><?php echo $id; // Yukarıda tanıttığımız gibi alanları dolduruyoruz. ?></td>
        <td><?php echo $baslik; ?></td>
        <td><?php echo $icerik; ?></td>
        <td><a href="duzenle.php?id=<?php echo $id; ?>" class="btn btn-primary">Düzenle</a></td>
        <td><a href="sil.php?id=<?php echo $id; ?>" class="btn btn-danger">Sil</a></td>
    </tr>

<?php 
} 
// Tekrarlanacak kısım bittikten sonra PHP tagının içinde while döngüsünü süslü parantezi kapatarak sonlandırıyoruz. 
?>

</table>
</div>
</div>
</body>
</html>

Şimdi duzenle.php sayfası ile  verileri düzenleyeceğiz. Hangi veriyi düzenleyeceğimizi get metottu ile id değerini alarak gerçekleştireceğiz.

duzenle

 <?php 
include("vt.php"); // veritabanı bağlantımızı sayfamıza ekliyoruz. 
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Veritabanı İşlemleri</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

</head>
<body>

<?php 

$sorgu = $baglanti->query("SELECT * FROM makale WHERE id =".(int)$_GET['id']); 
//id değeri ile düzenlenecek verileri veritabanından alacak sorgu

$sonuc = $sorgu->fetch_assoc(); //sorgu çalıştırılıp veriler alınıyor

?>

<div class="container">
<div class="col-md-6">

<form action="" method="post">
    
    <table class="table">
        
        <tr>
            <td>Başlık</td>
            <td><input type="text" name="baslik" class="form-control" value="<?php echo $sonuc['baslik']; 
                 // Veritabanından verileri çekip inputların içine yazdırıyoruz. ?>">
            </td>
        </tr>

        <tr>
            <td>İçerik</td>
            <td><textarea name="icerik" class="form-control"><?php echo $sonuc['icerik']; ?></textarea></td>
        </tr>

        <tr>
            <td></td>
            <td><input type="submit" class="btn btn-primary" value="Kaydet"></td>
        </tr>

    </table>

</form>
</div>
<div>
<?php 

if ($_POST) { // Post olup olmadığını kontrol ediyoruz.
    
    $baslik = $_POST['baslik']; // Post edilen değerleri değişkenlere aktarıyoruz
    $icerik = $_POST['icerik'];

    if ($baslik<>"" && $icerik<>"") { // Veri alanlarının boş olmadığını kontrol ettiriyoruz.
        
        // Veri güncelleme sorgumuzu yazıyoruz.
        if ($baglanti->query("UPDATE makale SET baslik = '$baslik', icerik = '$icerik' WHERE id =".$_GET['id'])) 
        {
            header("location:ekle.php"); 
            // Eğer güncelleme sorgusu çalıştıysa ekle.php sayfasına yönlendiriyoruz.
        }
        else
        {
            echo "Hata oluştu"; // id bulunamadıysa veya sorguda hata varsa hata yazdırıyoruz.
        }
    }
}
?>
</body>
</html>

sil.php sayfası ile id değeri get ile gönderilen satırı veri tabanından siliyoruz.

 <?php 

if ($_GET) 
{

include("vt.php"); // veritabanı bağlantımızı sayfamıza ekliyoruz.

// id'si seçilen veriyi silme sorgumuzu yazıyoruz.
if ($baglanti->query("DELETE FROM makale WHERE id =".(int)$_GET['id'])) 
{
    header("location:ekle.php"); // Eğer sorgu çalışırsa ekle.php sayfasına gönderiyoruz.
}
}

?>

Bu çalışmayı html, css ile destekleyip daha iyi sayfalar yapabilirsiniz. Temel olarak mysqli kullanarak veriler ile bu şekilde işlemler yapabilirsiniz.

Dosyaları indirmek için: blog.rar

Paylaş:

Yorumlar

  1. merhaba hocam sayenizde ekleme silme düzenleme yapabiliyorum . 1 hafta önce aldım ama teşekkür etmeyi unutmuştum :)

  2. hocam merhaba çok teşekkür ederim. bir noktada takıldım ben sil butonuna bastığımda veriyi siliyor fakat ekle.php ekranına geri dönmüyor neden acaba ?

    1. Merhaba eğer verdiğim kodları direk çalıştırırsan sorunsuz çalışacaktır. Eğer kodlarda değişiklik yaptıysan 

      header("location:ekle.php"); 

      kodunu doğru kullanıp kullanmadığına bakman lazım.

       

  3. hocam aynen uyguladim ama Access denied for user 'root'@'localhost' (using password: NO) hatasi veriyor galiba sifre islemini girmediniz onu nasil ekliyecegiz tesekkurler

    1. @$baglanti = new mysqli('localhost', 'root', 'parola', 'mesutdblog'); // Veritabanı bağlantımızı yapıyoruz.

      Benim bağlandığım lokaldeki Mysql sunucunun parolası yok. Eğer sizin kullandığınızda varsa 3. Parametreye parola gelecek. 

  4. ENs

    Warning: Cannot modify header information - headers already sent by (output started at /home/public_html/duzenle.php:3) in /home/public_html/duzenle.php on line 64 Düzenle Sayfasında böyle saçma bir hata alıyorum birtürlü çözemedim. Teşekkürler

    1. Merhaba, MySQL server ile ilgili bağlantı sorunun var, verdiğim dosyalardan veri tabanını doğru yüklediğinden emin ol ve veri tabanı bağlantısında kullanıcı adı, parola ve veri tabanı adını doğru tanımladığına dikkat et. Bunları vt.php sayfasında tanımlayacaksın.

  5. Call to a member function fetch_assoc() on boolean in (Dosyanin Konumu) hatasi aliyorum. Çözumunu bulamadim. Yardimci olursaniz sevinirim.

    1. Benim verdiğim örnekte böyle bir hata alamazsın ama kendiniz kodları değiştirip kullanıyorsanız, yazdığınız sorguda hata var demektir.

      $sorgu = $baglanti->query("SELECT * FROM makale"); 

      kodundaki sorgunun doğru olduğuna emin olun, veya Mysql  sorgunuzu yazın bakayım.

  6. sil ve düzenle işleminden sonra ekle.php sayfasına yönlendirmemekte. birde başlığa göre aratma nasıl yaparız sizden ricam yardımcı olursanız çok makbule geçecek

  7. Allah senden rağzı olsun. Çoooook yardımı oldu. Teşekkürler.

  8. üstat çok iyi paylaşım yararlı oldu. Teşekkürler

  9. mesut hocam ; ömer beyin dediği gibi bende attım sunucuya gayet de güzel çalıştı lakin location çalışmıyor. ne yaptımsa olmadı.

    1. header("location:sayfa_adi.php"); kodunu doğru yazdığınıza dikkat edin. Bunun dışında veritabanı bağlantı ve tablo isimlerini doğru yazdığınıza emin olun.

  10. yani işin doğrusu bütün sorgular çalışıyor. ekle çıkarma yapıyor. listeliyor. mysql phpmyadmin de sorun yok. sadece location çalışmadı.

    1. Merhaba location derken tam olarak neyi kastediyorsunuz?

  11. Merhaba hocam çok faydalı bir paylaşım oldu. Elinize sağlık

  12. Musa

    Merhabalar, Buna benzer bir şekilde admin kontrol paneli örneği yapabilir misiniz? Teşekkürler.

  13. Onur

    Hocam çok teşekkürler gayet güzel ve açıklayıcı olarak anlatmışsınnız haftalardır arıyorum ama bulamıyorum veritabanından verileri tek tek ayrı urllerde çekebilirmiyiz wp deki gibi bunu da yanıtlarsan bizi aydınlatırsan ben ve benim gibi kodlarla uğraşmayı sevenlere çok yardımcı olmuş olacaksınız şimdiden teşekkürler

    1. Sorunuzu tam anlayamadım tek tek derken ne kast ediyorsunuz?

  14. postları çekme kısmındaki kodu aynen aldım ve veritabanını da oluşturdum ama kullanıcı girdilerini kaydetmiyor. Sondaki else'e girip "Hata oluştu" mesajını yazdırıyor. Yardımcı olursanız sevinirim.

    1. Veritabanı bağlantı bilgilerini doğru güncellediğinize emin misiniz?

      Önce benim örneği dokunmadan çalıştırın daha sonra güncellemeler yaparak adım adım gidiniz.

  15. İyi çalışmalar , css dosyalarını paylaşabilir misiniz.

    1. Merhaba, Makalenin altında uygulamanın dosyaları mevcut. Oradan indirebilirsiniz.

  16. merhaba harika bir paylaşım ama şöyle bir sıkıntı var ben veriyi siliyorum sıkıntı yok ama ben bir veriyi sildimmi tüm veriler siliniyo neden böyle...

    1. Silme kodlarında değişiklik yaptıysanız, id ile sınırlama kısmını kaldırmayın.

  17. Paylaşım için teşekkürler.

  18. Çok faydalı bir paylaşım emeğinize sağlık! Benim bir sorum olacak. Ben bir üye giriş ve buradaki gibi not ekleme sistemi yaptım. Ben de login olan herkes için tüm notlar geliyor. Kişi Login olunca sadece o kişiye ait notların listelenmesini istiyorum. Yardımcı olabilir misiniz?

    1. Merhaba Seher hanım,

      Notları çektiğiniz tabloda bir alan oluşturacaksınız (foreign key), o alanı da kullanıcılar tablosuna bağlayacaksınız, bu sayede login olan kişiler sadece kendi notlarını görebilir. Ürün kategori mantığında olduğu gibi bunu da aynı mantıkla yapabilirsiniz.

  19. Hocam Emeğinize Sağlık Çok Teşekkür Ederim Sayfayı Yenileyince Sen VeriTabanına Eklenen son veriyi yeniden ekiliyor Çözümü Nedir Acaba.? KOLAY GELSİN

    1. Ekleme yaptıktan sonra sayfayı tekrar çağıabilirsiniz, güvenlik kodu ekleyebilirsiniz.

  20. ustam harikasın fakat benim sitemde veritabanı bilgilerinin çekildigi sayfaya bir form ile giriliyor o formada kullanıcı adı şifre yazılıyor sil php ile sildirttigimde tekrar o bilgilerin çekildigi sayfaya atınca sayfa açılmıyor formdan girilmedigi için bunu nasıl çözerim.

    1. header fonksiyonu ile istediğin sayfaya yönlendirme yapabilirsin.

  21. aynı sayfada kalmasını istiyorum header ile aynı sayfaya attırırsam kullanıcı adı ve şifre girmedigi için açılmıyor sayfa isset ile denedim ama nedense sile tıkladıgımda ana sayfaya atıyor

    1. Ajax ile daha rahat yapabilirsin. 

  22. merhaba hocam 2 sorum olucaktı 1. sil deyince tüm veriler siliniyor(id değeri atanmıyor sanırım ondan) çözümü nedir? 2. yazı içinde id 1 in sadece başlık kısmını nasıl çağırabilirim ?

    1. Örnek projeyi iyi incelerseniz cevapları bulacaksınız.

  23. Merhaba hocam programı kendi veri tabanımıza uyguladık fakat sadece bir tane veri ekliyor.Düzeltme ve silme çalışıyor fakat ikinci bir veri eklemiyor .İlk eklediğimiz veriyi silip yerine tekrar ekleyebiliyoruz ama asla ikinci eklenmiyor Sorun nerede olabilir acaba.

    1. Siz ekleme yerine düzenleme yapıyorsunuz. Sql sorgunuzu kontrol edin.

  24. ali

    güzel açıklamalar

  25. dostum teşekkürler,sizin kodlarınızı örnek alarak daha fazla alanlı bir uygulama yaptım, herşey düzgün çalışıyor, ancak düzenle kısmında anlayamadığım bir gariplik var, öncelikle düzenleden kayıt ettiğimde kaydı yapıyor ama ekle php dosyasına yönlenmiyor, sil php ile aynı yöntem aslında sil de oluyor ama düzenlede olmuyor, olmadığı gibi düzenleme sayfasını refresh ediyor ve inputların içine eski veriyi yazıyor, halbuki vt nında değişiklik tamam, çözemedim bi türlü yardımını rica ediyorum, sevgiler...

    1. duzenle.php de kendinize göre düzenleme yapınca ister istemez html boşluk veriyor bu boşluğu header("location:ekle.php"); kod çalışmasını engeller

      Çözümü aşağıdaki kod ile değiştirin

      echo "<script>window.location.href='ekle.php';</script>";
  26. mysql a bağlanıp veri gönderirken türkçe karakter hatası oluyor çözümü nasıl olabilir ?

  27. Teşekkürler ustam çok işime yaradı.... Admin paneliyle eleştirdim giriş yapınca ekleme yapıyor. Süper oldu valla.

  28. Emeğine sağlık kardeşim. Faydalı oldu. Başarılar

  29. Hocam bunu uye yaparsa nasil olur yani uye id si ile bu sayfalari nasil ayarlariz?

    1. Merhaba kullanıcılara rol ataman gerekiyor. Ona göre kontrollerini yapıp rollere göre işlem yapmalısın.

  30. <?php include("database_connection.php"); $sorgu = $baglanti->query("SELECT * FROM makale WHERE id =".(int)$_GET['id']); //id değeri ile düzenlenecek verileri veritabanından alacak sorgu $sonuc = $sorgu->fetch_assoc(); //sorgu çalıştırılıp veriler alınıyor ?> burada surekli Notice: Undefined index: proje_ismi in C:\xampp\htdocs\sunsetplanlama\planlama_action.php on line 6 seklınde hatalar alıyorum sebebı ne olaki?

    1. Veri tabanını doğru yüklediğine emin ol bağlantıyı da kontrol etmelisin.

  31. arama sayfası nasıl yapabiliriz?

    1. ilerde bununla ilgili bir makale ekleriz.

  32. Ege

    Hosting değişikliği sonrası sitemi taşıdım. mysql tablosunda 4 hücre var ise, Insert aşamasında hepsine veri göndermem gerekiyor. Bu şekilde olursa kayıt ediyor. Örneğin: test tablosunda ID ISIM YAS SEHIR hücreleri var. INSERT INTO test SET ISIM='$ISIM', YAS ='$YAS', SEHIR ='$SEHIR' olursa kayıt işlemini yapıyor. INSERT INTO test SET SEHIR ='$SEHIR' olursa kayıt işlemini yapmıyor. Diğer hostingde böyle bir sorun yok iken, bu hostingde böyle bir sorun oluştu. Sorun nerden kaynaklıyor olabilir.

    1. Bu bilgiler ile yardımcı olmam zor, veri tabanı bağlantınızı test edin.

  33. Emekleriniz için çok teşekkürler. Allah razı olsun.