
PHP ile MySQL Veritabanı
MySQL, PHP ile birlikte kullanılan en yaygın veritabanı sistemlerinden biridir. Birçok dinamik web sitesi ve web uygulaması, kullanıcıları, gönderileri, ürünleri, siparişleri, yorumları, ayarları ve diğer uygulama verilerini depolamak için bir veritabanına ihtiyaç duyar.
PHP, MySQL'ya bağlanabilir ve veritabanları oluşturma, tablolar oluşturma, veri ekleme, kayıtları seçme, sonuçları filtreleme, satırları güncelleme, verileri silme ve döndürülen kayıtları sınırlama gibi veritabanı işlemlerini gerçekleştirebilir.
Bu makalede öğrenme yolunda gösterilen ana MySQL konuları açıklanmaktadır: MySQL veritabanı, MySQL bağlantısı, veritabanı oluşturma, tablo oluşturma, veri ekleme, son eklenen kimliği alma, birden fazla kayıt ekleme, prepared statements, verileri seçme, nereye, sıralamaya göre, verileri silme, verileri güncelleme ve verileri sınırlama.
MySQL Veritabanı
Veritabanı, verileri depolamak için yapılandırılmış bir yerdir. Web geliştirmede veritabanları, sayfa kapatıldıktan veya sunucu isteği sona erdikten sonra bile kullanılabilir kalması gereken bilgileri tutmak için kullanılır.
Örneğin bir blog web sitesi makaleleri, kategorileri, etiketleri, kullanıcıları ve yorumları bir MySQL veritabanında saklayabilir. Bir e-ticaret web sitesi ürünleri, müşterileri, sepetleri, siparişleri, faturaları ve ödemeleri saklayabilir.
MySQL verileri tabloların içinde saklar. Bir tabloda satırlar ve sütunlar bulunur. Her satır bir kaydı, her sütun ise belirli bir alanı temsil eder.
Örneğin, birkullanıcılartablo aşağıdaki gibi sütunlar içerebilir:
kimlik:kullanıcının benzersiz tanımlayıcısı.
isim:kullanıcının adı.
e-posta:kullanıcının e-posta adresi.
şifre:kullanıcının karma şifresi.
created_at:kaydın oluşturulma tarihi.
PHP, aşağıdaki gibi uzantıları kullanarak MySQL ile iletişim kurabilirMySQL iveyaPDO. PDO, birden fazla veritabanı sistemini desteklemesi ve prepared statements için temiz bir arayüz sağlaması nedeniyle modern PHP’de sıklıkla tercih edilir.
MySQL Bağlantısı
PHP’nin MySQL veritabanıyla çalışabilmesi için önce bir bağlantı oluşturması gerekir. Bir bağlantı, PHP'ya hangi veritabanı sunucusunun kullanılacağını ve hangi kullanıcı adının, parolanın ve veritabanı adının kullanılması gerektiğini bildirir.
Aşağıdaki örnekte PHP’yi MySQL'ya bağlamak için PDO kullanılmaktadır.
<?php
$host = "localhost";
$dbname = "php_learning";
$username = "root";
$password = "";
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully.";
} catch (PDOException $exception) {
echo "Connection failed: " . $exception->getMessage();
}
?>denemekveyakalamakBloklar bağlantı hatalarını işlemek için kullanılır. Bağlantı başarısız olursa PHP istisnayı yakalar ve bir hata mesajı görüntüler.
karakter kümesi=utf8mb4Bu bölüm önemlidir çünkü veritabanının Arapça, Türkçe, İngilizce ve emojiler de dahil olmak üzere birçok karakteri desteklemesine yardımcı olur.
Gerçek uygulamalarda, veritabanı kimlik bilgilerinin doğrudan her PHP sayfasında değil, genellikle bir yapılandırma dosyasında veya ortam dosyasında saklanması gerekir.
MySQL Veritabanı Oluştur
Veritabanı oluşturmak, tabloların ve kayıtların saklanacağı ana kabı oluşturmak anlamına gelir. Bu genellikle proje kurulumu sırasında bir kez yapılır.
Aşağıdaki örnek, PDO kullanarak bir veritabanı oluşturur.
<?php
$host = "localhost";
$username = "root";
$password = "";
try {
$pdo = new PDO("mysql:host=$host;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE php_learning CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
$pdo->exec($sql);
echo "Database created successfully.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>Bu örnekteki veritabanı adı:php_learning. Karakter seti ve harmanlama, çok dilli metni doğru şekilde destekleyecek şekilde ayarlanmıştır.
Profesyonel projelerde veritabanları genellikle bir veritabanı aracı, barındırma paneli, komut satırı veya Laravel gibi bir çerçevedeki geçişler aracılığıyla manuel olarak oluşturulur.
MySQL Tablo Oluştur
Veritabanı oluşturduktan sonraki adım tablo oluşturmaktır. Tablo, saklanacak verilerin yapısını tanımlar.
Aşağıdaki örnek basit bir oluştururkullanıcılarmasa.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
";
$pdo->exec($sql);
echo "Table created successfully.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>kimliksütunu otomatik olarak artan bir birincil anahtardır. Bu, MySQL'nun eklenen her satır için otomatik olarak yeni bir benzersiz kimlik oluşturduğu anlamına gelir.
isimvee-postasütunlar metni saklar.NOT NULLkural, alanın boş olamayacağı anlamına gelir.UNIQUEkural aynı e-postanın tekrarlanamayacağı anlamına gelir.
created_atsütun, satırın oluşturulduğu tarih ve saati saklar.
MySQL Veri Ekle
Veri eklemek, bir tabloya yeni kayıtlar eklemek anlamına gelir. Örneğin, bir kullanıcı kaydolduğunda PHP kullanıcının adını ve e-posta adresini kullanıcılar tablosuna ekler.
Aşağıdaki örnek bir kullanıcı kaydı ekler.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO users (name, email) VALUES ('Adnan', 'adnan@example.com')";
$pdo->exec($sql);
echo "New user inserted successfully.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>Bu örnek işe yarar ancak değerlerin kullanıcılardan gelmesi en güvenli yol değildir. Kullanıcı girişi doğrudan SQL dizelerinin içine yerleştirilmemelidir. SQL enjeksiyonunun önlenmesine yardımcı olmak için bunun yerine hazırlanmış ifadeler kullanılmalıdır.
Doğrudan ekleme ifadeleri temel fikri anlamak için faydalıdır ancak prepared statements gerçek uygulamalar için önerilen yaklaşımdır.
MySQL Son Kimliği Al
Otomatik artan kimliğe sahip bir tabloya yeni bir satır ekledikten sonra, yeni oluşturulan kaydın kimliğini bilmeniz gerekebilir.
PHP PDO şunları sağlar:lastInsertId()Bu amaç için yöntem.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO users (name, email) VALUES ('Noor', 'noor@example.com')";
$pdo->exec($sql);
$lastId = $pdo->lastInsertId();
echo "New record created with ID: " . $lastId;
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>İlgili kayıtları oluştururken son eklenen kimliği almak faydalıdır. Örneğin, bir sipariş oluşturduktan sonra sipariş öğelerini başka bir tabloya eklemek için sipariş kimliğini kullanabilirsiniz.
MySQL Çoklu Ekle
Bazen birden fazla satır eklemeniz gerekir. Bu, verileri içe aktarırken, birden fazla ürün eklerken, varsayılan ayarları oluştururken veya ilgili birçok kaydı kaydederken meydana gelebilir.
Bunun bir yolu, bir işlem içinde birden fazla ekleme ifadesi yürütmektir.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
$pdo->exec("INSERT INTO users (name, email) VALUES ('Ali', 'ali@example.com')");
$pdo->exec("INSERT INTO users (name, email) VALUES ('Sara', 'sara@example.com')");
$pdo->exec("INSERT INTO users (name, email) VALUES ('Omar', 'omar@example.com')");
$pdo->commit();
echo "Multiple users inserted successfully.";
} catch (PDOException $exception) {
$pdo->rollBack();
echo "Error: " . $exception->getMessage();
}
?>Bir işlem, verilerin tutarlı kalmasına yardımcı olur. Bir ekleme başarısız olursa işlem, verilerin yalnızca bir kısmını kaydetmek yerine değişiklikleri geri alabilir.
Kullanıcı tarafından sağlanan veriler için, birden fazla kayıt eklenirken prepared statements kullanılmalıdır.
MySQL Hazırlandı
MySQL’i PHP ile kullanırken hazırlanan ifadeler en önemli kavramlardan biridir. SQL yapısını kullanıcı girişinden ayırarak uygulamaların SQL enjeksiyonundan korunmasına yardımcı olurlar.
Değerleri doğrudan SQL dizesine eklemek yerine yer tutucular kullanılır. Daha sonra değerler ayrı ayrı iletilir.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$statement = $pdo->prepare($sql);
$statement->execute([
"name" => "Adnan",
"email" => "adnan@example.com"
]);
echo "User inserted with prepared statement.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>Yer tutucular:isimve:e-postaifade yürütüldüğünde güvenli bir şekilde PDO ile değiştirilir.
Kullanıcı girişi söz konusu olduğunda sorgu eklemek, güncellemek, silmek ve seçmek için hazırlanmış ifadeler kullanılmalıdır.
Giriş formlarında, arama formlarında, profil güncellemelerinde, yönetici panellerinde, APIs'da ve istek verilerini alan herhangi bir sayfada özellikle önemlidirler.
MySQL Veri Seç
Veri seçmek, bir veritabanı tablosundan kayıtları okumak anlamına gelir.SELECTVeri almak için deyim kullanılır.
Aşağıdaki örnek, kullanıcılar tablosundaki tüm kullanıcıları seçmektedir.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $pdo->query("SELECT id, name, email, created_at FROM users");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo $user["name"] . " - " . $user["email"];
}
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>fetchAll(PDO::FETCH_ASSOC)yöntemi, sonucu bir dizi ilişkisel dizi olarak döndürür. Bu, sütunlara ada göre erişmeyi kolaylaştırır.
Seçme sorguları, blog gönderilerini, ürün listelerini, kullanıcı profillerini, kategorileri, yorumları ve arama sonuçlarını göstermek gibi hemen hemen her dinamik web sitesinde kullanılır.
MySQL Nerede
WHEREkayıtları filtrelemek için kullanılır. Tüm satırları seçmek yerine yalnızca bir koşulla eşleşen satırları seçebilirsiniz.
Örneğin, aşağıdaki sorgu e-posta yoluyla bir kullanıcıyı seçer.
<?php
$email = "adnan@example.com";
$statement = $pdo->prepare("SELECT id, name, email FROM users WHERE email = :email");
$statement->execute([
"email" => $email
]);
$user = $statement->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo $user["name"];
} else {
echo "User not found.";
}
?>WHERE yan tümcesi aşağıdakiler gibi birçok işleci kullanabilir:=,>,<,>=,<=,!=,LIKE,İÇİNDEveBETWEEN.
<?php
$statement = $pdo->prepare("SELECT * FROM users WHERE name LIKE :keyword");
$statement->execute([
"keyword" => "%ad%"
]);
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
?>WHERE genellikle arama, filtreleme, giriş kontrolleri, profil sayfaları, izinler ve belirli kayıtları bulmak için kullanılır.
MySQL Sipariş Veren
ORDER BYsorgu sonuçlarını sıralamak için kullanılır. Kayıtları artan düzende sıralayarak kullanabilirsiniz.ASCveya azalan sırada kullanarakTANIM.
Aşağıdaki örnek, kullanıcıları seçer ve oluşturma tarihine göre en yeniden en eskiye doğru sıralar.
<?php
$statement = $pdo->query("SELECT id, name, email, created_at FROM users ORDER BY created_at DESC");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo $user["name"] . " - " . $user["created_at"];
}
?>Ayrıca isme göre alfabetik olarak da sipariş verebilirsiniz.
<?php
$statement = $pdo->query("SELECT id, name, email FROM users ORDER BY name ASC");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
?>ORDER BY genellikle kontrol panellerinde, blog listelerinde, ürün sayfalarında, raporlarda, tablolarda ve yönetici panellerinde kullanılır.
MySQL Verileri Sil
Verileri silmek, bir tablodan kayıtları kaldırmak anlamına gelir.DELETEBu işlem için ifade kullanılır.
Kayıtları silerken WHERE cümlesinin kullanılması çok önemlidir. WHERE olmadan tablodaki tüm satırlar silinebilir.
<?php
$id = 5;
$statement = $pdo->prepare("DELETE FROM users WHERE id = :id");
$statement->execute([
"id" => $id
]);
echo "User deleted successfully.";
?>Gerçek uygulamalarda silme eylemlerinin genellikle izinler, onay mesajları ve bazen geçici silme mantığıyla korunması gerekir.
Geçici silme, kaydın veritabanından fiziksel olarak kaldırılmaması anlamına gelir. Bunun yerine, aşağıdaki gibi bir sütun kullanılarak silinmiş olarak işaretlenir:silinmiş_at. Bu, gerektiğinde sistemin kaydı daha sonra geri yüklemesine olanak tanır.
MySQL Güncelleme Verileri
Verileri güncellemek, bir tablodaki mevcut kayıtları değiştirmek anlamına gelir.UPDATEBu işlem için ifade kullanılır.
Silme sorguları gibi, güncelleme sorgularının da tüm satırların yanlışlıkla güncellenmesini önlemek için genellikle bir WHERE yan tümcesi içermesi gerekir.
<?php
$id = 1;
$name = "Adnan Mehrat";
$email = "adnan.mehrat@example.com";
$statement = $pdo->prepare("
UPDATE users
SET name = :name, email = :email
WHERE id = :id
");
$statement->execute([
"id" => $id,
"name" => $name,
"email" => $email
]);
echo "User updated successfully.";
?>Güncelleme sorguları profil düzenleme formlarında, yönetici panellerinde, ayarlar sayfalarında, sipariş durumu güncellemelerinde, şifre değişikliklerinde ve içerik yönetim sistemlerinde kullanılır.
Yeni değerler genellikle kullanıcı girişinden geldiğinden, güncelleme sorguları için hazırlanmış ifadeler şiddetle tavsiye edilir.
MySQL Sınır Verileri
LIMITcümlesi, bir sorgu tarafından döndürülen kayıtların sayısını kısıtlamak için kullanılır. Bu, tüm kayıtları aynı anda yüklemek istemediğinizde kullanışlıdır.
Örneğin, aşağıdaki sorgu yalnızca beş kullanıcıyı döndürür.
<?php
$statement = $pdo->query("SELECT id, name, email FROM users ORDER BY id DESC LIMIT 5");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
?>LIMIT, en son gönderiler, en son kullanıcılar, en son siparişler, kontrol paneli widget'ları ve sayfalandırma için yaygın olarak kullanılır.
Sayfalandırma için LIMIT genellikle OFFSET ile birlikte kullanılır.
<?php
$page = 2;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$statement = $pdo->prepare("
SELECT id, name, email
FROM users
ORDER BY id DESC
LIMIT :limit OFFSET :offset
");
$statement->bindValue(":limit", $perPage, PDO::PARAM_INT);
$statement->bindValue(":offset", $offset, PDO::PARAM_INT);
$statement->execute();
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
?>LIMIT ve OFFSET'i prepared statements ile kullanırken, aşağıdakileri kullanarak değerleri tam sayılar olarak bağlamak daha iyidir:PDO::PARAM_INT.
Tam MySQL CRUD Örneği
CRUD, Oluştur, Oku, Güncelle ve Sil anlamına gelir. Bunlar çoğu web uygulamasında kullanılan ana veritabanı işlemleridir.
Aşağıdaki basitleştirilmiş örnek, PDO prepared statements kullanan CRUD'nun genel fikrini göstermektedir.
<?php
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Create
$create = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$create->execute([
"name" => "Adnan",
"email" => "adnan@example.com"
]);
// Read
$read = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$read->execute([
"email" => "adnan@example.com"
]);
$user = $read->fetch(PDO::FETCH_ASSOC);
// Update
$update = $pdo->prepare("UPDATE users SET name = :name WHERE email = :email");
$update->execute([
"name" => "Adnan Mehrat",
"email" => "adnan@example.com"
]);
// Delete
$delete = $pdo->prepare("DELETE FROM users WHERE email = :email");
$delete->execute([
"email" => "adnan@example.com"
]);
?>Bu örnek, birçok uygulamada kullanılan temel veritabanı iş akışını gösterir. Gerçek projelerde bu mantık genellikle sınıflar, depolar, modeller, hizmetler veya çerçeve yapıları içinde düzenlenir.
PHP ile MySQL için Güvenlik Notları
Veritabanlarıyla çalışmak dikkatli güvenlik uygulamaları gerektirir. Veritabanı sorguları sıklıkla kullanıcı girdisini kullandığından, güvenli olmayan kod SQL enjeksiyonuna, veri sızıntılarına veya kayıtların zarar görmesine neden olabilir.
Önemli güvenlik uygulamaları şunları içerir:
Tüm kullanıcı girişi için prepared statements kullanın.
Ham kullanıcı girişini doğrudan SQL sorgularının içine yerleştirmeyin.
Kullanmadan önce form verilerini doğrulayın ve sterilize edin.
Veritabanı içeriğini HTML'da görüntülerken çıktıdan çıkın.
Üretimde güçlü veritabanı şifreleri kullanın.
Veritabanı hatalarını genel kullanıcılara göstermeyin.
Veritabanı kullanıcıları için uygun izinleri kullanın.
Önemli veritabanlarını düzenli olarak yedekleyin.
Laravel gibi çerçeveler, geçişler, Eloquent modelleri, sorgu oluşturucular, doğrulama ve veritabanı yapılandırması gibi araçlar sağlar. Ancak ham PHP ve MySQL’i anlamak önemlidir çünkü geliştiricilerin çerçevenin arkasında ne olduğunu anlamalarına yardımcı olur.
Sonuç
MySQL, dinamik ve veri odaklı web uygulamaları oluşturmak için PHP ile yaygın olarak kullanılan güçlü bir veritabanı sistemidir. MySQL'ya nasıl bağlanacağınızı, veritabanları ve tablolar oluşturmayı, veri eklemeyi, son eklenen kimliği almayı, birden fazla kayıt eklemeyi, prepared statements'yu kullanmayı, verileri seçmeyi, WHERE ile filtrelemeyi, sonuçları sıralamayı, kayıtları güncellemeyi, verileri silmeyi ve sonuçları sınırlamayı öğrenerek, veritabanı odaklı PHP geliştirmenin temelini anlarsınız.
Bu kavramlar, bloglar, kontrol panelleri, yönetici panelleri, e-ticaret sistemleri, APIs ve kullanıcı yönetim sistemleri dahil olmak üzere neredeyse her gerçek PHP projesinde kullanılmaktadır.
Bu MySQL temellerini öğrendikten sonraki adım, küçük CRUD uygulamaları oluşturarak pratik yapmak ve ardından PDO sınıflarını, depolarını, MVC yapısını veya Laravel gibi çerçeveleri kullanarak daha temiz mimariye doğru ilerlemektir.

