PHP

PHP Kullanarak MySQL Veritabanına Veri Ekleme

php kullanarak mysql veritabanına veri ekleme

Giriş

Bu rehberde PHP scriptleri ile bir veritabanını yönetmeye nasıl başlayacağınızı öğreneceksiniz. MySQL veritabanına INSERT için nasıl PHP kullanılacağını göreceksiniz. Başlamadan önce, PHP ve veritabanlarıyla çalışmanın en önemli basamaklarını anlatan diğer rehberimize mutlaka göz atmalısınız – PHP MySQL bağlantısı.

İhtiyacınız olacaklar

Bu rehbere başlamadan önce aşağıdakilere sahip olmalısınız:

  • Hosting kontrol paneli erişimi

Adım 1 – Tablo oluşturma

Herşeyden önce, veriniz için tablo oluşturmamız gerekiyor. Bu kolay prosedürü hosting kontrol panelinizde bulunan phpMyAdmin aracılığıyla kolayca uygulayabilirsiniz. Önceki rehberimizde MySQL veritabanı nasıl oluşturulduğunu işlemiştik, dolayısıyla bu kısmı atlıyoruz.Hostinger Kontrol Paneli phpMyAdmin

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

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:phpmyadmin veritabanı kurulumu

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özatabilirsiniz.

Ş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şaretledim, 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.

Adım 2 – MySQL veritabanına veri girdisi (INSERT) için PHP kodu yazma

Seçenek 1 – MySQLi Yöntemi

Herşeyden önce, önceki rehberimizde gösterildiği üzere 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 ('Thom', 'Vial', 'thom.v@some.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özatabilirsiniz.

  1. satır numarasından başlayalım:
$sql = "INSERT INTO Students (name, lastname, email) VALUES ('Thom', 'Vial', 'thom.v@some.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 statement’dır. Örneğimizde, veriyi Students tablosuna ekliyoruz.

İlerlerken, açılı parentezler 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 = Thom, soyisim = Vial, eposta = thom.v@some.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.

Seçenek 2 – 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ün 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 = "Thom";
$last_Name = "Vial";
$email = "thom.v@some.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 “Thom” 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 “Thom” 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 “Thom Vial” iki kez girmiş olursunuz ve John Smith görmezden gelinir.

Adım 3 – 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:

mysql girdisi başarılı

Yaygın sorunların çözümleri

MySQLi

Diğer her durumda bir hata mesajı gösterilecektir. Örneğin, kodumuzda bir syntax hatası oluşturursak şöyle bir görüntü oluşur:

hata mesajı

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 ('Thom', 'Vial', 'thom.v@some.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 ('Thom', 'Vial', 'thom.v@some.com')' at line 1"

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

$sql = "INSERT INTO Students {name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.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 ('Thom', 'Vial', 'thom.v@some.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 error_log 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.

Yorum Ekle

Yorum göndermek için buraya tıklayın

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Dünya çapında binlerce aboneye katılın

ve mükemmel fırsatlarla en yeni rehberler e-posta adresinize gelsin

Please wait...

Abone olduğunuz için teşekkürler!

Şimdi kazanmaya başlayın!

Hepsi bir arada web hosting & alan adı yalnızca

6
25 TL
/ay