PDO ile Koşullu Toplu Kayıt
|PDO ile toplu kayıt yaparken var olan satırları atlayıp kayıtlı olmayanları yeni kayıt olarak nasıl açarız? Bu sorgu için MySql de bir “unique” yani benzersiz sütuna ihtiyacımız var. Ayrıca oluşturacağımız PDO sorgusunda da “ON DUPLICATE KEY UPDATE” koşulunu kullanacağız.
PDO ile koşullu toplu kayıt için veritabanı gereksinimleri
Sorgumuzu yazmadan önce veritabanımızda var olan bir sütunu unique (benzersiz) olarak tanımlamalıyız. Bunu yaparken benzersiz seçtiğimiz sütuna girilecek veriler kesinlikle benzersiz olmalı. (Bu işlem için id kullanılamaz çünkü id auto increment olduğundan kayıt esnasında belirlenir bize kayıdı yapmadan önce işleyeceğimiz bir değer lazım)
Benzersiz bir sütun için kullanacağınız birçok yöntem internette mevcut bunlardan herhangi birini kullanabilirsiniz. (E-posta ve kayıt zamanı unique değer için en çok kullanılan değerlerdir.)
Benim kullandığım yöntem ise şöyle, son yaptığım işte eklediğim kayıtları incelediğimde eklediğim içeriğin url kısmının benzersiz olduğunu fark ettim. Fakat bir sorun vardı url uzunluğu benzersiz bir index oluşturmak için çok uzun olabiliyor. Bu durumu aşmak için kontrol adında bir sütun açıp kayıt için gelen url’yi ilk olarak MD5 formatına dönüştürüp sonra bu alana eklemek oldu. Tabi bu işlem sayesinde elimde md5 dönüştürülmüş benzersiz bir değer oldu. İşte bu tamda ihtiyacımız olan veri.
'kontrol' varchar(32) NOT NULL
Mysql’deki işimiz bu kadar şimdi geçelim PHP içinde kullanacağımız PDO sorgusuna.
PDO ile koşullu toplu kayıt sorgusu
Oluşturacağımız bu sorgudaki en kilit kısım “ON DUPLICATE KEY UPDATE” MySql fonksiyonu. Bu fonksiyon kayıt yapmadan önce eklenecek içeriğin tabloda var olup olmadığına bakar.
Şimdi yazacağımız koda geçmeden önce PDO ile toplu kayıt nasıl yapılır sorusuna cevaben bu işin standartlarını belirleyen W3Schools‘da bunu nasıl anlatmışlar bir bakalım. (Prepared Statements in PDO alt başlığı altında anlatılıyor)
PDO ile Koşullu Toplu Kayıt
// Veri tabanı bilgileri $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { // PDO bağlantısı $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // PDO hatalarını görebilmek için $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // prepare sayesinde temiz ve güvenli sorgular $stmt = $conn->prepare("INSERT INTO posts (title, url, kontrol) VALUES (:title, :url, :kontrol) ON DUPLICATE KEY UPDATE kontrol= :kontrol");// tablomuzun koşulunu bu satır sağlayacak // Değerleri değişkenlere alalım $stmt->bindParam(':title', $title, PDO::PARAM_STR); $stmt->bindParam(':url', $url, PDO::PARAM_STR); $stmt->bindParam(':kontrol', $kontrol, PDO::PARAM_STR); // Gelen verileri foreach ile döngüye sokalım foreach($sonuclar as $data){ // gelen verinin içindeki url kısmını kontrolId adında bir değişkene md5 olarak atıyoruz $kontrolId = md5($data["url"]); // Değerleri çalışan sorguya ekleyelim $title = $data["title"]; $url = $data["url"]; $kontrol = $kontrolId; // hazırlanan sorguyu çalıştır $stmt->execute(); } echo "Kayıtlar başarı ile yapıldı"; } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $conn = null;
Yukarıdaki koddan Foreach döngüsünü yani 24 ve 36 satırlardaki döngü başlangıcını ve sonunu çıkartırsanız sorgu her seferinde tek kayıt yapar.
Faydalı olması dileğiyle…
Dostum ben pek anlayamadım.
Ürünler tablomda bir id ye ait verileri yeni son id ye aktarmak istiyorum butona tıklayınca bunu nasıl yapıcaz burada anlattığın gibi mi oluyor?
Ekleme yapacağın yeni tablodaki id sütunun değerini “auto increment” olarak tanımlarsan otomatik her kayıtta son id alır
Sizinle Tanışmak isterim.