PHP PDO Kullanımı

PDO (PHP Veri Nesneleri), çeşitli veritabanlarına erişmek için basit bir arayüz sağlayan PHP için bir eklentidir. Veritabanından bağımsız olarak sorgulama ve veri getirme konusunda yardımcı olan bir veri soyutlama katmanı olarak davranır.

MySQL uzantısı kullanmaya devam ediyorsanız kullanmayı bırakınız. MySQL eklentisi artık tamamen PHP7.0 sürümünden kaldırıldı. MySQL yerine PDO eklentisini kulllanın.

PDO, web uygulamalarında ekstra güvenlik katmanı sağlayan daha güvenli yollara sahip olduğundan temiz ve güvenli kod yazmanıza olanak tanır. PDO, bir veya daha fazla farklı veritabanına erişmenin en kolay yolunu sağlayan kendi temel işlevlerine ve methodlarına sahiptir.

Yıllar geçtikçe, veritabanları uzun bir yol kat etti ve şimdi birçok farklı yazılım firması modern PHP uygulamalarına güç veren popüler Veritabanı Yönetim Sistemi (Database Management System – DBMS) 'ler sunuyor. PHP, geliştirme uygulamalarını standartlaştırmak ve kolaylaştırmak için PHP 5.1'de PHP Veri Nesneleri'ni (PDO) tanıttı. Bu nesneler, PDO veritabanı bağlantılarını kurmak için kullanılır.

php pdo

PDO, PHP uygulamalarında veritabanlarına erişmek ve yönetmek için hızlı ve tutarlı bir arayüz sağlayan bir veritabanı erişim katmanıdır. Her DBMS(Database Management System – Veritabanı Yönetim Sistemi), PHP uygulamalarında PDO kullanırken kurulu olması gereken belirli bir PDO sürücüsüne sahiptir.

PDO sürücüsünün yazdığı herhangi bir veritabanını destekleyebilir. Bu yazı yazıldığı sırada aşağıdaki veritabanı sürücüleri kullanılabilir:

Varsayılan olarak, PHP'nin PDO_mysql sürücüsü yüklüdür. Ancak, diğer veritabanlarıyla çalışmak isterseniz, önce ilgili sürücüyü yüklemeniz gerekir.

Sisteminizde hangi sürücülerin yüklü olduğunu kontrol etmek için yeni bir PHP dosyası oluşturun ve aşağıdaki kod parçacığını ekleyin.


<?php

print_r(PDO::getAvailableDrivers());

?>

Veritabanına bağlanma


Bağlantılar temel PDO sınıfının örneklenmesiyle kurulur. Hangi sürücüyü kullanacağınızın bir önemi yoktur; Daima PDO sınıf ismini kullanmanız gerekir. DSN (Data Source Name - Veri Kaynağı Adı) ve isteğe bağlı olarak kullanıcı ismini ve parolasını belirtmek için kurucuyu kullanabilirsiniz.

PDO komutlarımızı kullanabileceğimize göre MySQL için veritabanı bağlantımızı yapalım.


<?php

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4',

'username', 'password');

?>

Bağlantı kodunda charset=utf8mb4 belirttim fakat isteğe bağlı olarak aşağıdaki gibi de kullanabilirsiniz.


$db->query("SET CHARACTER SET utf8mb4");

Farklı veritabanlarında biraz farklı bağlantı yöntemleri olabilir. Aşağıda, en popüler veritabanlarından bazılarına bağlanma yöntemi gösterilmektedir. İlk üçünün aynı olduğunu, diğer veritabanı türü SQLite'nin kendi sözdizimi olduğunu fark edeceksiniz.


<?php

# PDO_DBLIB, MS SQL Server ve Sybase

$db = new PDO("mssql:host=localhost;dbname=testdb, user, pass");

$db = new PDO("sybase:host=localhost;dbname=testdb, user, pass");

# SQLite Database

$db = new PDO("sqlite:/opt/databases/mydb.sq3");
}

?>

Diğer sürücülerin DSN ifadeleri için şuraya bakın.

İstisnalar ve PDO


PDO, Çalışmadığında ilgili istisnalar(Hatalar) atabilir, bu yüzden her şey try / catch bloğunda olmalıdır.

Not: try / catch blogu if ifadesi gibi çalışır try bloğunda yapılacak işlemler belirtilir. catch bloğunda hatalar yakalanır ekrana hata mesajları görüntülenir.


<?php

$dsn = 'mysql:host=localhost;dbname=test';

$user = 'root';

$password = '';
 
try {

    $db = new PDO($dsn, $user, $password);

} catch (PDOException $e) {

    echo 'Connection failed: ' . $e->getMessage();
}

?>

Veritabanına göndereceğimiz SQL sorgularda hata oluşursa bu bir PDOException istisnasına sebep olur. Bağlantı oluşturulduktan hemen sonra, PDO üç hata modundan herhangi birine aktarılabilir:


$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );  

$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); 

$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

Veritabanına bağlanmaya çalışırken bir hata her zaman bir istisna atar.

PDO :: ERRMODE_SILENT

Bu varsayılan moddur. Mysql ve mysqli uzantılarındaki hataları yakalamak için muhtemelen en çok aynı şeyi kullanırsınız. Aşağıdaki iki mod, DRY programlama için daha uygundur.

PDO :: ERRMODE_WARNING

Bu mod Standart Uyarıyı çağırır ve komut dosyasının yürütülmesine devam etmesine izin verir. Hata ayıklama için uygun.

PDO :: ERRMODE_EXCEPTION

Çoğu durumda, bu tür komut dosyası denetimi tercih edilir. Hataları ustalıkla ele almanıza ve hassas bilgileri gizlemenize izin veren bir istisna atar. Aşağıdaki kodlar istisnaların avantajlarını gösteren bir örnek:


<?php

try {  

  // veritabanına bağlantı

 $db = new PDO('mysql:host=localhost;dbname=deneme;charset=utf8mb4',
 
'root', '');
//SQL hataları yakalamak için aşağıdaki kodları ekleyin

$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
   
  # SELECT! Yerine DELECT yazdık!
 
$db->prepare('DELECT ad FROM test')->execute();  
}  
catch(PDOException $e) { 
 
 echo "mesaj...: ".$e->getMessage(); //hata çıktısı 

}

?>

SELECT ifadesinde kasıtlı olarak yanlış yazıldı. Bu bir hata mesajı verecektir.

Bir Bağlantının Kapatılışı


Veritabanı değişkenini null olarak ayarlayarak herhangi bir bağlantıyı kapatabilirsiniz.

	
<?php

$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// Veritabanına bağlanıyoruz.

// İşimiz bittiğine göre bağlantıyı kapatabiliriz.
$db = null;
?>

Çoğu HTTP uygulaması veritabanı sunucularına kalıcı bağlantılardan medet umar. Kalıcı bağlantılar betiğin işi bittiğinde kapatılmaz, önbelleğe alınıp aynı kimlik kanıtlarıyla bağlantı kurmak isteyen başka betiklerce kullanılır. Kalıcı bağlantı önbelleği, bir betiğin bir veritabanı ile her iletişime geçme isteğinde yeni bir bağlantı kurma zamanını ortadan kaldırır ve uygulamanın daha hızlı çalışmasını sağlar.

Kalıcı Bağlantılar



<?php

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>

Kalıcı bağlantı kullanmak için PDO kurucusuna aktarılan sürücü seçenekleri dizisinde PDO::ATTR_PERSISTENT sabitine TRUE atamalısınız. Nesneyi oluşturduktan Nesne başlatıldıktan sonra bu özellik PDO :: setAttribute() ile ayarlanırsa, sürücü kalıcı bir bağlantı kullanmayacaktır.

Sorgu Yürütme Türleri


Temel olarak üç tür sorgu yürütme vardır.

Sonuç kümesi olmadan sorgu yürütme: INSERT, UPDATE ve DELETE gibi sorgular sonuç kümesini döndürmez ve yalnızca etkilenen satır sayısı hakkında bilgi verir.

Sonuç kümesiyle sorgu yürütme: SELECT gibi sorgu genellikle sonuç kümesini ve döndürülen satır sayısını döndürür.

Sorgu, birden fazla yürütüldü: Örneğin, farklı verileri ileterek INSERT sorgusu birden fazla çalıştırılabilir.

Veritabanına bağlantı başarıyla oluşturulduktan ve PDO nesne örneği oluşturulduktan sonra, nesne SQL sorguları gerçekleştirmek için kullanılabilir.

PDO ile SQL sorguları iki yolla yapılabilir:

PDO Methodları exec(), query() ve prepare Nerde Kullanılır.


Tablodaki satırları değiştiren ancak satır ve sütunlarla sonuç kümesi döndürmeyen sorgular (INSERT, UPDATE ve DELETE), exec() methodu ile gönderilir, bu method, etkilenen satırların sayısını veya hata durumunda "0" değerini döndürür.

PDO::exec() Methodu bir SELECT deyiminin sonucunu döndürmez. Bir SELECT deyimini uygulamanız boyunca sadece bir defa çalıştıracaksanız PDO::query() Methodunu kullanabilirsiniz. Defalarca çalıştıracaksanız PDO::prepare() Methodu ile bir PDOStatement nesnesi hazırlayıp bunu PDOStatement::execute() ile çalıştırabilirsiniz.

PDO::exec() methodu çalıştırılan SQL deyimiyle silinen veya değiştirilen satırların sayısını döndürür. Etkilenen satır yoksa PDO::exec() 0 (sıfır) döndürür.


Veritabanına Veri Ekleme() INSERT


Veritabanımızda adi, soyadi sütunları olsun.


<?php

try {
  $dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
  $user = "root";
  $passwd = "";

  $db = new PDO($dsn, $user, $passwd);
  //SQL gibi hatalarıda almak için aşağıdaki kod yazılır.
  $db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_WARNING);

  $ekle = $db->exec("INSERT INTO test ( adi, soyadi)
  VALUES ( '$ad', '$soyad')");

          
  } catch ( PDOException $e ){
     echo "Bir Hata Oluştu: ".$e->getMessage();
 }

?>

SQL Injection


SQL Injection, veri tabanına dayalı uygulamalara saldırmak için kullanılan bir atak tekniğidir. Yönetici panelinden kendimiz veri yüklerken sorun çıkmaz ama; Dışardan veri alırken verilerin güvenliği önemli. Ayrıca MySQL katı modda çalıştığından metinlerde yer alan tırnak ifadelerinden dolayı hata verecektir. Daha önce bu özel karakterlerden kaçmak için mysql_real_escape_string() kodu kullanıyorduk PDO ile PDO::quote methodu gelmiştir.

PDO::quote Methodu, mesajı tırnaklar içine otomatik sarar SQL ifadelerde tırnak içinde belirtmeyin.


$ders="PHP";

$ad = $db->quote($ders);

echo $ad; //ÇIKTI: 'PHP'

PDO::quote methodu kullanırken SQL ifadede values(Değerler) misal VALUES ('$ad', '$soyad', '$email') içindeki değişkenler tırnak içine alınmayacaktır çünkü methodun kendi otomatik oluşturur.


<?php

$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

$ad = $db->quote($_POST["ad"]);

$soyad = $db->quote($_POST["soyad"]);

$email = $db->quote($_POST["email"]);

$ekle = $db->exec("INSERT INTO test (ad, soyad, email)
VALUES ($ad, $soyad, $email)");

?>

Son otomatik olarak eklenen "id" (AUTO_INCREMENT PRIMARY KEY sütunu) almak için lastInsertId() methodu kullanın. SQL INSERT deyimi için kullanılır.


echo $db-> lastInsertId ();

Veritabanımızda SQL komutu SELECT ile query methodu ile işlem yapalım, etkilenen satır sayısını bulmak için PDO sınıfımızın içerisinde yer alan rowCount() metodunuz kullanırız.


$db->rowCount();

Veritabanımızda SQL komutu ile INSERT, UPDATE ve DELETE işlemlerini exec() methodu ile gönderilir, bu method, etkilenen satırların sayısını veya hata durumunda "0" değerini döndürür.


if($ekle){} // 0 veya 1 döner yani TRUE veya FALSE

Hazırlanmış İfadeler


Hazırlanmış ifadelerden dışarıdan veri almada SQL Injection Korunmak için PDO::quote Methodu ile uğraşmayacağız, prepare(sql) methodu ile verileri Güvenli yükleriz.

Hazırlanmış ifadeleri yani prepare() Methodunu kullanmak, SQL enjeksiyonlarına karşı korumayı artırır.

<?php

try {
  $dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
  $user = "root";
  $passwd = "";

 $db = new PDO($dsn, $user, $passwd);
 $db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_WARNING);

 $query = $db->prepare("INSERT INTO test SET adi=?, soyadi=?");
 $insert = $query->execute(array($ad,$soyad));
          
  } catch ( PDOException $e ){
     echo "Bir Hata Oluştu: ".$e->getMessage();
 }

 ?>


UPDATE ve DELETE , bir tablodaki verileri değiştiren ancak satır ve sütunlarla sonuç kümesini döndürmeyen SQL yönergeleridir. Exec() Methodu ile INSERT deyimi ile aynı şekilde yürütülebilirler.

GÜNCELLEŞTİRME (UPDATE)


MySQL tablonun satırlarındaki veriler, SQL komutu UPDATE ile değiştirilebilir. SQL ifadesini veritabanını bağlama bloğuna yazın.


$ekle =$db->exec("UPDATE test SET ad='Levent' WHERE id=2")


Veritabanında Veri Sil (DELETE)


SİL (DELETE) talimat bir tablonun satırlarını siler. SQL ifadesini veritabanını bağlama bloğuna yazın.


$ekle =$db->exec("DELETE FROM test WHERE id=3) 

Veri Çekme ve Listeleme


PDO::query — Bir SQL deyimini çalıştırıp sonucu bir PDOStatement nesnesi olarak döndürür.

Bir SQL deyimini tek bir method çağrısında çalıştırılır ve sorgu sonucunu (bir sonuç varsa) bir PDOStatement nesnesi olarak döndürür.

Birden fazla yapılacak bir sorgu için, PDO::prepare() kullanarak bir PDOStatement nesnesi hazırlarsanız ve PDOStatement::execute() öğesine yapılan çoklu çağrılar ile ifadeyi düzenlerseniz daha iyi performans elde edersiniz.

Veritabanı tablonuzda yer alan verileri listelemek istediğinizde SELECT komutunu kullanırsınız. Aşağıdaki örnekte tablonuzda tüm kayıtları nasıl listeleyeceğinizi görebilirsiniz.


<?php

try {
  $dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
  $user = "root";
  $passwd = "";

  $db = new PDO($dsn, $user, $passwd);
  $db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_WARNING);
  $db = $db->query("SELECT * FROM deneme");

  $oku = $db->fetchAll(PDO::FETCH_ASSOC); //verilerin hepsi

  foreach ($oku as $row) {
  extract($row);
  echo "Adı:..$ad Soyad:..$soyad Email:..$email<br>";
  }
          
  } catch ( PDOException $e ){
     echo "Bir Hata Oluştu: ".$e->getMessage();
 }

?>

Dizideki sütun isimlerini dizi halinde değilde değişken şekilde yazmak için extract fonksiyonundan faydalanıyoruz.

Veritabanımızdan Tek bir veri getirelim.


$sql = "SELECT * FROM test where id=2";

$oku = $db->query($sql);

$oku = $oku->fetch(PDO::FETCH_ASSOC); // Tek veri

extract($oku);

echo "Adı:..$ad Soyad:..$soyad Email:..$email<br>";


Dışardan veri alıp ona göre verileri listeliyorsak SQL injeksiyona karşı prepare method kullanılmalı.


$query = $db->prepare("SELECT * FROM tabloadi WHERE id=:uye_id AND ad=:uye_ad");
$query->execute(array($id,$ad));// Liste halinde gönderiliyor.

if ( $query->rowCount() ){
     foreach( $query as $row ){
          echo $row['sutunadi']."<br>";
     }
}
else{
    echo "Kayıt bulunamadı";
}

Veri Alma Yöntemleri


php pdo

data->fetch() methodu kullanılarak alınabilir. Verileri aramadan önce, hangi biçime ihtiyaç duyulduğunu açıkça belirtmeniz önerilir. Birkaç seçenek var:

FETCH_LAZY ifadesi betiği yavaşlatır, bu yüzden onu kullanmayın.

Pratikte, üç özellik sizin için yeterlidir: FETCH_CLASS, FETCH_ASSOC ve FETCH_OBJ. Veri formatını ayarlamak için aşağıdaki sözdizimini kullanın:


 $oku->fetch(PDO::FETCH_ASSOC); 

FETCH_CLASS


Bu getirme Methodu, verileri doğrudan seçtiğiniz bir sınıfa getirmenizi sağlar. FETCH_CLASS kullanırken, nesnenizin özellikleri kurucuyu çağırmadan ÖNCE ayarlanır. Bu çok önemli. İlgili sütun adının özellikleri yoksa, sizin için böyle bir özellik ( genel olarak ) oluşturulur .

Bu, veri tabanından çıkarıldıktan sonra verilerin dönüştürülmesi gerektiğinde, nesne oluşturulduktan hemen sonra otomatik olarak gerçekleştirilebileceği anlamına gelir.


<?php
class User
{
  public $ad;
  public $soyad;
  public $email;
  public function showInfo()
  {
  echo "<br>".$this->ad."<br>".$this->soyad."<br>".$this->email."<br>";
  }
}
$oku = $db->query("SELECT * FROM test");  

$result = $oku->FETCHALL(PDO::FETCH_CLASS, "User");

foreach($result as $user)
{
    $user->showInfo();
}
?>

Oluşturulan sınıftaki özelliklerin adları, veritabanındaki alanların adları ile aynı olmalıdır.

Hazırlanmış İfadelere Geniş Bakış:


Hazırlanan ifadeleri kullanmak, SQL enjeksiyonlarına karşı korumayı artırır.

Hazırlanan bir ifade, sunucuya yalnızca farklı veri kümeleri göndererek sürekli olarak çalıştırılabilen önceden derlenmiş bir SQL ifadesidir. Bu, yer tutucularda kullanılan verilerin otomatik olarak SQL enjeksiyon saldırılarına karşı güvenli hale getirilmesi avantajına sahiptir.

Aşağıda hazırlanan ifadelerin üç örneği vardır.


# Yer tutucu olmadan - SQL enjeksiyon kapısı açık!

$oku = $db->prepare("INSERT INTO okul (ad, ders, not) 
values ($ad, $ders, $not)");
 
# adsız yer tutucuları

$oku = $db->prepare("INSERT INTO okul (ad, ders, not) 
values (?, ?, ?);
 
#  adlandırılmış yer tutucuları

$oku = $db->prepare("INSERT INTO okul (ad, ders, not) 
value (:ad, :ders, :not)");

İlk sorgu örneğinden kullanmak istemezsiniz; Burdaki örnekte yer alması karşılaştırma yapmak için, İsimsiz ve adlandırılmış yer tutucular arasındaki fark, hazırlanan ifadelere nasıl aktaracağınızdır.


<?php
# Her bir yer tutucuya değişkenler atayın, index 1-3

$oku->bindParam(1, $ad);
$oku->bindParam(2, $ders);
$oku->bindParam(3, $not);
 
# Bir satır ekle

$ad = "Ali"
$ders = "matematik";
$not = 80;
$oku->execute();
 
#  farklı değerler içeren başka bir satır ekle

$ad = "Mehmet"
$ders = "Fizik";
$not = 100;
$oku->execute();
?>

İlk önce, tüm yer tutuculara değişkenler atarız. Daha sonra bu değişkenlere değerler atar ve sorguyu yürütürüz. Yeni bir veri seti göndermek için, sadece değişkenlerin değerlerini değiştirin ve tekrar sorgulayın.

SQL'inizde çok fazla parametre varsa, her birini bir değişkene atamak çok sakıncalıdır. Bu gibi durumlarda, verileri bir dizide saklayabilir ve aktarabilirsiniz:


#  eklemek istediğimiz veriler
$data = ['Ali', 'aaaa@mail.com', 'Ankara'];
 
$oku = $db->prepare("INSERT INTO test (ad, email, sehir) values (?, ?, ?);
$oku->execute($data);

Dizideki veriler sırayla yer tutucuları için geçerlidir. $ data [0] ilk yer tutucuya, $ data [1] ikincisine vb... gider. Ancak, eğer dizi indeksler sıralı değilse, bu düzgün çalışmayabilir ve diziyi yeniden indekslemeniz gerekir.

Adlandırılmış Yer Tutucular



# İlk argüman adlandırılmış yer tutucu ismidir.
# Yer tutucular her zaman bir kolon ile başlar.

$oku->bindParam(':name', $name);

Burada bir diziyide ekleyebilirsiniz, ancak ilişkilendirilmiş dizi olmalıdır. Anahtarların rolü, tahmin edeceğiniz gibi, yer tutucuların isimleri olmalıdır.


# eklediğimiz veriler
$data = ['ad'=>'Ali','email'=>'aaaa@mail.com','sehir'=>'Ankara'];  

$oku = $db->prepare("INSERT INTO test (ad,email,sehir) 
values (:ad, :email, :sehir)"); 

$oku->execute($data);

Birer isimle (:isim) ifade edilen değiştirgeli prepare örnek



<?php

$oku = $db->prepare("INSERT INTO test (ad, soyad, email) 
VALUES (:ad, :soyad, :email)");

$oku->bindParam(':ad', $ad);

$oku->bindParam(':soyad', $soyad);

$oku->bindParam(':email', $email);

$oku->execute();

?>

soru imi (?) ile ifade edilen değiştirgeli prepare örnek



<?php

$oku = $db->prepare("INSERT INTO test (ad, soyad, email) VALUES (?, ?, ?)");

$oku->bindParam(1, $ad);

$oku->bindParam(2, $soyad);

$oku->bindParam(3, $email);

$oku->execute();

?>

Dizili ekleme



$oku = $db->prepare("INSERT INTO test (ad, soyad, email) VALUES (?, ?, ?)");

$oku->execute([$ad,$soyad,$email]);

Veri Güncelleme



<?php
$data = [
    'id' => $id,
    'ad' => $ad,
    'soyad' => $soyad,
    ];
$sql = "UPDATE test SET ad=:ad, soyad=:soyad WHERE id=:id";

$db->prepare($sql)->execute($data);
?>

Bir işlemde toplu işlem yürütme


Toplu işlem yapmak oldukça kolay, proğram kodları içine PDO-> beginTransaction() ve PDO-> commit() methodlarını dahil ederek, Toplu işlemler tamamlanana kadar başka kimsenin göremeyeceğini php çekirdeğeni yazan kadro tarafından size garanti ediyorlar. Bir şeyler ters giderse, yakalama bloğu, işlem başlatıldığından beri yapılan tüm değişiklikleri geri alır ve sonra bir hata mesajı yazdırır.

Örnek:

Aşağıdaki örnek, Test adlı bir veritabanı ve Tablo1 adlı bir tabloyu kullanır. Bir işlem başlatır ve sonra iki satır eklemek ve sonra bir satırı silmek için komutlar verir. Komutlar veritabanına gönderilir ve PDO::commit işlem ile açıkça sona erdirilir .


<?php

conn = new PDO( "sqlsrv:server=(local); Database = Test", "", "");

  $conn->beginTransaction(); 

try{

$ekle = $conn->exec("insert into Table1(col1, col2) values('a', 'b') ");  
$ekle = $conn->exec("insert into Table1(col1, col2) values('a', 'c') ");  
$ekle = $conn->exec("delete from Table1 where col1 = 'a' and col2 = 'b'"); 
 
 $conn->commit();

 catch(Exception $e){
    
    echo $e->getMessage();

    //İşlemi geri al.

    $pdo->rollBack();
}

?>

İşlem Şartlarının Açıklaması.


PDO Sütun Hatası:


Veritabanına SQL ifade ile kayıt ekleyelim yanlız bir sütunu boş bırakalım örnek olarak email alanı veri eklemeyelim.

<?php

$ekle = $db->exec("INSERT INTO test (ad, soyad)
VALUES ('$ad', '$soyad')")

?>

ÇIKTI:

General error: 1364 Field 'email' doesn't have a default value

Bazen bazı sütunlara veri girmek istemeyebiliriz örnek verirsek bu tabloda hit alanı olsa sadece makale okunduğunda bu alanın değişmesini isteyebiliriz bunun için tablomuzun bu alanının verisi bu sorgu ile değiştirilmeyeceği için bu alanı SQL sorgusunda boş geçtiğimizde bize veritabanı hata verecektir bu sorunu aşmak için:


$sql = "INSERT IGNORE INTO test (ad, soyad) VALUES ('$ad', '$soyad')"

MySQL veritabanı varsayılan bir değer kümesine sahip olmadığı boş alanlara izin vermeyecek INSERT veya UPDATE komut çalışmayacaktır MySQL katı modda çalışmasından kaynaklanır. SQL ifademize IGNORE ifadesi ekleyerek verimiz veritabanına eklenecektir.

Tabloya birden çok satır eklemek için INSERT deyimi kullandığınızda ve işlem sırasında bir hata oluşursa, MySQL ifadeyi sonlandırır ve bir hata döndürür. Sonuç olarak, tabloya hiçbir satır eklenmez.

Ancak, INSERT IGNORE deyimi kullanırsanız, hataya neden olan geçersiz verilere sahip satırlar dikkate alınmaz ve geçerli verilere sahip satırlar tabloya eklenir.

IGNORE ifadesi, MySQL veritabanının bir özelliğidir. SQL standardına değil, MYSQL'de SQL ifadelerin bir uzantısı olduğunu unutmayın .

Rasim Gel 31/12/2018

Elinize, emeğiniz sağlık, teşekkürler.

Askin 11/01/2019

Merhaba bir mysql databasede daha önceden veri eklenmiş mi eklenmemişse ekleme eklenmişse eklememe sorgusu nasıl yapabiliriz acaba veri ekleme rahatlıkla yapabiliyorum ama PDO ya geçtiğimden PDO lu kontrol şeklini bir türlü çözemedim pdo suz gayet basit bir şekilde ekleniyordu.

yönetici 12/01/2019

if else bloğu kullanmaya gerekmez. try catch bloğu veya or die() if else gibi çalışır. Veritabanına kayıt yapılmışsa hiç bir sorun çıkarmadan altta ki kodları çalıştırmaya devam eder. veritabanına kayıt edilmediyse catch bloğu veya or die() devreye girerek hata verir ve proğram çalışmayı durdurur. if else bloğu fazlalık olur, oda şu şekilde kullanılır.
 
$ekle = $db->exec("INSERT sql sorgu");
if($ekle){
echo "kayıt yapıldı";
}else{
echo  "hata";
}

Fatih Demir 29/06/2019

Merhabalar. Cevabını anlamadığım için tekrar soruyorum. Aşağıdaki kodlarıma göre veritabanına eklenen bir kaydın daha önce eklenmişse kullaniciadi na göre tekrar eklemeyi engelleyen kod nedir hocam? Teşekkürler şimdiden.

$kullaniciadi = $_POST['kullaniciadi'];
    $adivesoyadi = $_POST['adivesoyadi'];
    $telno = $_POST['telno'];
    $email = $_POST['email'];
    $sifre = $_POST['sifre'];
try {
    $ekle = "INSERT INTO kullanicilar(kullaniciadi, adivesoyadi, telno, email, sifre) VALUES ('$kullaniciadi', '$adivesoyadi', '$telno', '$email', '$sifre')";
    $conn->exec($ekle);
    echo "Kullanıcı başarıyla eklendi. ";
    }
catch(PDOException $e){
    echo $ekle . "" . $e->getMessage();
    }
}

yönetici 01/07/2019

Fatih, öncelikle kullanıcı adını trim fonksiyondan geçir. çünkü kullanıcı inputtan boşluklu ismini yazmışşa böyle veriyi farklı görür. PDOStatement::rowCount() bir DELETE, INSERT veya UPDATE deyiminden etkilenen satır sayısını döndürür. Çoğu veritabanında PDOStatement::rowCount() bir SELECT deyiminden etkilenen satır sayısını döndürmez. Bu bakımdan, SELECT deyiminde kullandığınız yüklemlerin kullanıldığı bir SELECT COUNT(*) deyimi ile yapacağınız bir PDO::query() çağrısından sonra bir PDOStatement::fetchColumn() çağrısı ile etkilenen satır sayısını elde edebilirsiniz.

$oku = $db->query("SELECT count(*) FROM test WHERE adi='$kullaniciadi'"); 

$oku->fetchColumn();

if ($oku){ 

    echo "Böyle bir kayıt var";

}else{ 
  // veritabanına kayıt işlemleri yap.
}  

Berkan serdar kavas 09/05/2020

iyi günler hocam, ben bir veri tabanı oluşturdum bir site yapıyorum (dönem projem). Girilen bilgileri karşılaştırıp doğru ise o profile giriş yapmasını sağlamam lazım fakat nasıl yapabilirim buradaki kodlarda bulamadım. Yardımcı olur musunuz.
2.soru olarak biri veri girmeye çalıştığında (arayüzde) "' gibi işaretleri kullanırsa bu bilgiler kaydedilmiyor bir yöntem var mıdır bunun için.

yönetici 10/05/2020

Berkan, İf ifadesi ile girilenlerin doğru olup olmadığına bakabilirsin. 2. soru için:

<?php
$metin = "'saat'";
$metin = trim($metin, "'");
echo '<pre>';
print_r ($metin);

Burak alan 14/06/2020

Bilgiler için teşekkürler.
Lütfen konu haricinde soru sormayın cevaplanmayacaktır. Yorumunuz onaylandıktan sonra yayınlanacaktır. Lütfen Yukarıda ki mesajları okuyun tekrar aynı soruları sormayın.

6292

KATEGORİ
  • HTML
  • CSS
  • PHP
  • JQUERY
  • PHOTOSHOP
  • JavaScript
  • Web Dünyası
  • Linux
  • MİTHRİL FRAMEWORK
  • Laravel
  • Git
  • React
POPÜLER MAKALE
  • HTML LİNK(Bağlantı)EKLEME - LİNK VERME
  • HTML YAZI VE RESİM ORTALAMA
  • HTML RESME LİNK VERME
  • HTML FORM OLUŞTURMA
  • CSS YATAY MENÜ YAPIMI
  • HTML RESİM EKLEME
  • CSS (BOYUT) GENİŞLİK VE YÜKSEKLİK (Width-Height)
  • HTML DİV ve SPAN NEDİR?
  • HTML ARKAPLANA MÜZİK EKLEME
  • KALİTE KAYBETMEDEN RESİMLERİ BÜYÜTME
ETİKET
WEBCEBİR © 2013 Tüm hakları saklıdır.