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.
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:
- PDO_DBLIB (FreeTDS / Microsoft SQL Server / Sybase)
- PDO_FIREBIRD (Firebird / Interbase 6)
- PDO_IBM (IBM DB2)
- PDO_INFORMIX (IBM Informix Dynamic Server)
- PDO_MYSQL (MySQL 3.x / 4.x / 5.x)
- PDO_OCI (Oracle Çağrı Arayüzü)
- PDO_ODBC (ODBC v3 (IBM DB2, unixODBC ve win32 ODBC))
- PDO_PGSQL (PostgreSQL)
- PDO_SQLITE (SQLite 3 ve SQLite 2)
- PDO_4D (4D)
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");
localhost:
Veritabanı kurulumunuz aynı sunucudaysa localhost kalabilir. Farklı bir sunucudaysa sunucu ip adresini yazmanız gerekiyor.dbname:
Veritabanı adı$user:
Veri tabanı kullanıcı adı (default root)$pasword:
Veri tabanı kullanıcı şifre (default olarak boş bırakılır. Siz mysql kullanıcısı için bir şifre belirlediyseniz o şifreyi girmeniz gerekiyor)
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
));
?>
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:
- Doğrudan uygulama :
exec()
vequery()
Methodları - Değişkenlerin hazırlanması : Güvenlik için önerilir
prepare()
Methoduyla.
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.
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
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:
- PDO :: FETCH_ASSOC: Anahtar olarak sütun adlarıyla bir dizi döndürür
- PDO :: FETCH_BOTH (varsayılan): Hem sütun adları hem de sıra numaraları biçiminde indisleri olan bir dizi döndürür
- PDO::FETCH_BOUND: Sütun değerlerini
PDOStatement::bindColumn()
ile ilişkilendirilmiş PHP değişkenlerine atar ve TRUE döndürür. - PDO :: FETCH_CLASS: Sütun sınıflarını belirtilen sınıfın uygun özelliklerine atar. Bazı sütun için özellik yoksa, oluşturulacak
- PDO :: FETCH_INTO: Belirtilen sınıfın mevcut bir örneğini günceller.
- PDO::FETCH_LAZY: PDO::FETCH_BOTH ve PDO::FETCH_OBJ sabitlerinin birleşimidir.
- PDO::FETCH_NUM: Sütun numaralarına göre indislenmiş bir dizi döner. İlk sütunun indisi 0'dır.
- PDO::FETCH_OBJ: Özellik isimlerinin sınıf isimlerine denk düştüğü bir anonim nesne örneği döndürür.
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();
}
?>
Hazırlanmış İfadelere Geniş Bakış:
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ı.
- Begin transaction: İşlem başlatıldı ve MySQL'in varsayılan otomatik devreye alma özelliği devre dışı bırakıldı. Örnek:
INSERT
sorgusu çalıştırırsanız, veriler hemen eklenmez. - Commit: Bir işlem yaptığınızda, temel olarak MySQL'e her şeyin yolunda gittiğini ve sorgularınızın sonuçlarının son haline getirildiğini söylüyorsunuz.
- Rollback:
PDO::beginTransaction()
ile başlatılan toplu hareketi geri alır. Bir toplu hareket etkin değilken bu yöntemin çağrılması bir hataya sebep olur.
PDO Sütun Hatası:
<?php
$ekle = $db->exec("INSERT INTO test (ad, soyad)
VALUES ('$ad', '$soyad')")
?>
ÇIKTI:
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:
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
Askin 11/01/2019
yönetici 12/01/2019
$ekle = $db->exec("INSERT sql sorgu");
if($ekle){
echo "kayıt yapıldı";
}else{
echo "hata";
}
Fatih Demir 29/06/2019
$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
$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
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
<?php
$metin = "'saat'";
$metin = trim($metin, "'");
echo '<pre>';
print_r ($metin);
Burak alan 14/06/2020
- HTML
- CSS
- PHP
- JQUERY
- PHOTOSHOP
- JavaScript
- Web Dünyası
- Linux
- MİTHRİL FRAMEWORK
- Laravel
- Git
- React
- 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