PHP Kullanarak MySQL Veritabanına Veri Ekleme

PHP Kullanarak MySQL Veritabanına Veri Ekleme

Bu rehberde. MySQL veritabanına INSERT için nasıl PHP scriptleri kullanılacağını göreceksiniz. Kullanabileceğiniz iki adet yöntem bulunmaktadır: MySQLi ve PDO. Bu PHP MySQL veritabana veri ekleme rehberine başlamadan önce hosting kontrol panelinize erişiminiz olması gerekmektedir.

Eğer MySQL bağlantınızı nasıl kuracağınızdan emin değilseniz bu PHP MySQL bağlantısı rehberine göz atarak PHP ve veritabanlarıyla çalışmanın püf noktalarını öğrenebilirsiniz.

Tablo Oluşturma (Tercihen)

Hostinger Kontrol Paneli phpMyAdmin

Her şeyden önce, veriniz için tablo oluşturmamız gerekiyor. Eğer zaten bir tablo oluşturduysanız bir dahaki sekmeye geçebilirsiniz. Hosting kontrol panelinizde bulunan phpMyAdmin aracılığıyla kolayca bir tablo oluşturabilirsiniz.

phpmyadmin anasayfası

phpMyAdmin sayfasına girdikten sonra aşağıdakine benzer bir şey görünüyor olmalıdır:

phpmyadmin veritabanı kurulumu

u266072517 veritabanımız için Students yani Öğrenciler adında bir tablo oluşturacağız. Create Table butonuna tıklayarak yeni bir tablo oluşturabilirsiniz. Ardından tablonuz için gerekli tüm bilgileri girebileceğiniz aşağıdakine benzer bir sayfa göreceksiniz:

Bu, bir tablo için kullanabileceğiniz en sade kurulumdur. Tablo/veritabanı yapısı ve sütunlar için hangi tür ayarları kullanabileceğinizi öğrenmek için phpMyAdmin resmi belgesine göz atabilirsiniz.

Şimdilik, bizim kullandığımız sütunlar için bazı temel bilgiler aşağıdadır:

  • Name – Sütununuzun adı. Tablonuzun en üstünde gösterilir.
  • Type – Burada bir sütun türü seçebilirsiniz. Örneğin biz varchar seçtik çünkü string türünde bir isim girmemiz gerekiyor (sadece harflerden oluşur, sayı bulunmaz).
  • Length/Values – Sütunun sahip olabileceği girdinin maksimum uzunluğunu belirtmek için kullanılır.
  • Index – Biz, “ID” alanımız için “Primaryindex’i kullandık. Bir tablo oluştururken tek bir ID sütunu olması tavsiye edilir. Tablo girdilerini numaralı şekilde sıralamak ve tablo ilişkilerini ayarlamak için kullanılır. Aynı zamanda “A_I” şeklinde işaretledik, bunun anlamı Auto Increment yani Otomatik Artış. Bu sayede girdiler otomatik olarak sıralanacaktır (1,2,3,4…).

Save’e tıklayın ve tablonuz oluşturulsun.

MySQL Veritabanına Veri Girdisi (INSERT) için PHP Kodu Yazma

MySQL veritabanınıza veri girdisi (INSERT) yapabilmenin iki yöntemi bulunmaktadır. PHP MySQLi yöntemi ve PHP Veri Objesi veya PDO yöntemi.

MySQLi Yöntemi

Her şeyden önce veritabanı ile bir bağlantı oluşturmalısınız. Tamamlandıktan sonra INSERT SQL sorgusu kullanarak devam edeceğiz. Basit bağlantı ve girdi yöntemleriyle örnek kod aşağıdadır:

<?php
$servername = "mysql.hostinger.co.uk";
$database = "u266072517_name";
$username = "u266072517_user";
$password = "buystuffpwd";

// Create connection

$conn = mysqli_connect($servername, $username, $password, $database);

// Check connection

if (!$conn) {
      die("Connection failed: " . mysqli_connect_error());
}
 
echo "Connected successfully";
 
$sql = "INSERT INTO Students (name, lastname, email) VALUES ('Test', 'Testing', 'Testing@testing.com')";
if (mysqli_query($conn, $sql)) {
      echo "New record created successfully";
} else {
      echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);

?>

Kodun ilk bölümü (3 – 18 satırları) veritabanı ile bağlantının kendisi içindir. Bu adımın üzerinden tekrar geçmeyeceğiz, eğer kodun her bir satırının ne anlama geldiğini öğrenmek istiyorsanız, önceden yayınlanmış olan veritabanı bağlantısı rehberimize göz atabilirsiniz.

19. satır numarasından başlayalım:

$sql = "INSERT INTO Students (name, lastname, email) VALUES ('Test', 'Testing', 'Testing@testing.com')";

Bu kodumuzun en önemli satırıdır ve rehberde öğrenmek istediğimiz şey olan verinin MySQL veritabanına girmesini sağlar. INSERT INTO veriyi belirtilen veritabanı tablosuna ekleme komutu yani bir ifadedir. Örneğimizde, veriyi Students tablosuna ekliyoruz.

İlerlerken, açılı parantezler arasında değerleri eklemek istediğimiz tablo sütunlarımız bulunuyor: (name, lastname, email). Veri belirlediğimiz sıra ile eklenecektir. Eğer (email, lastname, name), yazarsak değerler farklı bir sırada eklenir.

Sıradaki adım VALUES komutu. Burada daha önce belirlediğimiz sütunlara değerlerimizi belirtiyoruz. Bu sayede, her bir sütun belirli bir değeri temsil ediyor. Örneğin, bizim durumumuzda şu şekilde olacaktır: isim = Test, soyisim = Testing, eposta = Testing@testing.com.

Bahsetmeye değer bir diğer şey ise, az önce PHP kodu kullanarak SQL query gerçekleştirdik. SQL sorguları tırnak işaretlerinin arasında belirtilmelidir. Örneğimizde, tırnak işaretleri arasındaki ve $sql = sonrasındaki her şey SQL query’dir.

Kodun sonraki kısmı (20 – 22 satırları) sorgumuzun başarılı olup olmadığını kontrol eder:

if (mysqli_query($conn, $sql)) {
     echo "New record created successfully";
}

Eğer sorgu başarılı şekilde çalıştıysa basit bir onay mesajı gösterilir.

Ve son kısım (22 – 24 satırları) eğer sorgumuz başarısız olduysa farklı bir mesaj gösterir:

else {
     echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

Eğer bir şeyler ters gittiyse bize bir hata mesajı verir.

PHP Data Object (PDO) Yöntemi

Önceki örnekte olduğu gibi, yeni bir PDO object oluşturarak veritabanıyla bir bağlantı sağlamalıyız, bu rehberimizden nasıl yapılacağını öğrenebilirsiniz. MySQL veritabanı bağlantısı bir PDO object olduğundan, query hazırlamak ve çalıştırmak için çeşitli PDO ‘metotları’ (herhangi bir objenin parçası olan herhangi bir fonksiyon) kullanmalısınız. Object metodları aşağıdaki gibi çağrılır:

$the_Object->the_Method();

PDO, SQL kodunu çalıştırılmadan önce hazırlamanızı sağlar. SQL sorgusu değerlendirilir ve çalıştırılmadan önce doğrulanır. Basit bir SQL injection saldırısı, bir form üzerindeki alana sadece SQL kodu girilerek yapılabilir. Örneğin:

// User writes this in the username field of a login form
john"; DROP DATABASE user_table;

// The final query becomes this
"SELECT * FROM user_table WHERE username = john"; DROP DATABASE user_table;

Sözdizimsel olarak doğru bir SQL kodu olduğundan noktalı virgül DROP DATABASE user_table‘ı yeni bir SQL query haline getirir ve kullanıcı tablonuz oluşturulur. Hazırlanan komutlar ve ; karakterlerine izin vermeyerek orjinal sorguyu sonlandırır ve zararlı talimat olan DROP DATABASE asla çalıştırılmaz.

PDO ile veritabanından bilgi alırken veya gönderirken her zaman hazırlanmış komutlar kullanmalısınız.

Hazırlanmış komutları kullanmak için veritabanı object metodu olan prepare() için yeni bir değişken yazmalısınız.

Doğru kod şu şekilde olacaktır:

<?php
$servername = "mysql.hostinger.com";
$database = "u266072517_name"; 
$username = "u266072517_user";
$password = "buystuffpwd";
$sql = "mysql:host=$servername;dbname=$database;";
$dsn_Options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];

// Create a new connection to the MySQL database using PDO, $my_Db_Connection is an object
try { 
  $my_Db_Connection = new PDO($sql, $username, $password, $dsn_Options);
  echo "Connected successfully";
} catch (PDOException $error) {
  echo 'Connection error: ' . $error->getMessage();
}

// Set the variables for the person we want to add to the database
$first_Name = "Test";
$last_Name = "Testing";
$email = "Testing@testing.com";

// Here we create a variable that calls the prepare() method of the database object
// The SQL query you want to run is entered as the parameter, and placeholders are written like this :placeholder_name
$my_Insert_Statement = $my_Db_Connection->prepare("INSERT INTO Students (name, lastname, email) VALUES (:first_name, :last_name, :email)");

// Now we tell the script which variable each placeholder actually refers to using the bindParam() method
// First parameter is the placeholder in the statement above - the second parameter is a variable that it should refer to
$my_Insert_Statement->bindParam(:first_name, $first_Name);
$my_Insert_Statement->bindParam(:last_name, $last_Name);
$my_Insert_Statement->bindParam(:email, $email);

// Execute the query using the data we just defined
// The execute() method returns TRUE if it is successful and FALSE if it is not, allowing you to write your own messages here
if ($my_Insert_Statement->execute()) {
  echo "New record created successfully";
} else {
  echo "Unable to create record";
}

// At this point you can change the data of the variables and execute again to add more data to the database
$first_Name = "John";
$last_Name = "Smith";
$email = "john.smith@email.com";
$my_Insert_Statement->execute();

// Execute again now that the variables have changed
if ($my_Insert_Statement->execute()) {
  echo "New record created successfully";
} else {
  echo "Unable to create record";
}

Satır 28, 29 ve 30‘da bindParam() veritabanı object metodunu kullandık. Aynı zamanda çok daha farklı olan bindValue() metodu da bulunuyor.

  • bindParam() – Bu metod execute() metoduna ulaşıldığında veriyi değerlendirir. Bu script execute() metoduna ilk ulaştığında $first_Name “Test” karşılığına geldiğini görür ve bu değeri bağlayarak sorguyu çalıştırır. Script bir sonraki execute() metoduna ulaştığında, $first_Name artık “John’a” karşılık geldiğini görür ve sorguyu yeni değerlerle tekrar çalıştırır. Unutmamak gereken şey query’i sadece bir kez tanımladık ve script’in farklı noktalarında, farklı verilerle tekrar kullandık.
  • bindValue() – Bu metod veriyi bindValue()’a ulaşıldığı gibi değerlendirir. $bindValue()‘a ulaşıldığında $first_Name değeri “Test” olduğundan, $my_Insert_Statement için ne zaman bir execute() metodu çağrılırsa, bu kullanılacaktır.

$first_Name değerini tekrar kullanarak ikinci defa yeni bir değer verdiğimizi farkettiniz mi? Eğer veritabanınız bu script’i çalıştırdıktan sonra kontrol ederseniz, $first_Name değişkeni script’in sonunda “John’a” karşılık gelmesine rağmen iki ismide görebilirsiniz. Unutmayın, PHP tüm script’i çalıştırmadan önce değerlendirir.

Eğer bindParam‘ı  bindValue ile değiştirmek için script’i güncellerseniz, MySQL veritabanına “Test Testing” iki kez girmiş olursunuz ve John Smith görmezden gelinir.

Başarılı Şekilde Çalıştığını Onaylama ve Yaygın Sorunların Çözümleri

Eğer çalıştırarak MySQL veritabanına girdiğimiz query başarılı olmuşsa, aşağıdaki şekilde görüntülenir:

Connect Successfully
New record created successfully

Yaygın Sorunların Çözümleri

MySQLi

Eğer bir MySQLi hata mesajı görüntülenirse hatayı çözmek için aşağıdaki yöntemleri kullanarak çözebiliriz. Örneğin, kodumuzda bir syntax hatası oluşturursak şöyle bir görüntü oluşur:

Connect successfully
Error: INSERT INTO students {name, lastname, email} VALUES ('Test', 'Testing', 'Testing@testing.com')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{name, lastname, email} VALUES ('Test', 'Testing', 'Test@testingcom')' at line 1"

Görüldüğü üzere, kodumuzun ilk kısmında sorun yok. Bağlantı başarılı şekilde oluşturuldu ancak SQL query duvara tosladı.

"Error: INSERT INTO Students {name, lastname, email} VALUES ('Test', 'Testing', 'Testing@testing.com') You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{name, lastname, email} VALUES ('Test', 'Testing', 'Testing@testing.com')' at line 1"

Ne yazık ki script’imizin durmasına yol açan bir syntax hatası bulunuyor. Hata şurada:

$sql = "INSERT INTO Students {name, lastname, email} VALUES ('Test', 'Testing', 'Testing@testing.com')";

Gördüğünüz gibi normal parantez yerine açılı parantez kullandık. Bu doğru değil ve script’imizin syntax hatası vermesine sebep oldu.

PDO

PDO bağlantısının 7. satırında, hata modu ‘display all exceptions’ yani ‘tüm istisnaları göster’ şeklinde ayarlanmış. Eğer bu script’in dışında bırakılsaydı ve query hata verseydi, herhangi bir hata mesajı almayacaktınız. İstisnalara izin verildiğinden dolayı problemin spesifik olarak nerede olduğu gösteriliyor.

Bu genellikle, veritabanına ve tablo isimlerine maruz kalacağından sadece bir script geliştirirken kullanılmalı. Normal şartlarda verinize zararlı yollardan erişmeye çalışan kişilere karşı gizlemelisiniz. Yukarıdaki durumumda normal parantez yerine açılı parantez kullanıldığından hata aşağıdaki benzer olacaktır:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; <code>check the manual that corresponds to your MySQL server version for the right syntax to use near '{name, lastname, email} VALUES ('Test', 'Testing', 'test@testing.com')' at line 1"</code>

Karşılaşabileceğiniz diğer muhtemel sorunlar:

  • Hatalı belirtilen sütunlar (varolmayan sütunlar veya yazım hataları).
  • Değer türlerinden birisinin başka bir sütun türüne yönlendirilmesi. Örneğin, Name sütununa 47 rakamı vermeyi deneseydik bir hata ile karşılaşırdık çünkü bu sütun sadece string değeri alabilir. Ancak tırnak işaretleri içinde bir rakam verseydik, örneğin “47” bu sorun olmazdı çünkü rakamımız sütuna string olarak atanırdı.
  • Varolmayan bir tabloya veri girmeye çalışmak veya tablo adında yazım hatası yapmak.

Bu hataların tamamı hata mesajı kılavuzunu takip ederek veya hata kaydı dosyasını kontrol ederek giderilebilir.

Başarılı bir veri girişinden sonra, veritabanımızda görebiliyor olmalıyız. phpMyAdmin‘den görüntülediğimizde verimizi eklemiş olduğumuz tabloya bir örnek aşağıdaki gibidir:

phpMyAdmin verisi PHP aracılığıyla MySQL'e eklendi

Sonuç

Bu rehberde, MySQL veritabanına MySQLi ve PDO aracılığıyla veri girmek (INSERT) için nasıl PHP kullanabileceğimizi öğrendik. Aynı zamanda yaygın bağlantı hatalarını nasıl giderebileceğinizi de öğrendiniz. MySQL veritabanına PHP kullanarak nasıl veri girebileceğinizi bilmek, kod öğrenmeye yeni başlayan biriyseniz veya internet sitesi oluşturuyorsanız oldukça faydalıdır.

Author
Yazar

Gürkan M.

Gürkan, Amerikan Kültürü ve Edebiyatı mezunu ve Hostinger’da pazarlama asistanı olarak içerik yönetimi, dijital pazarlama ve çevirilerden sorumlu. Küçük yaşta tanışıp o günden bu yana hayatının büyük bir parçası olan internette web geliştirme ve özel olarak WordPress konularıyla yakından ilgileniyor. Ayrıca, pervasız bir gamer.