26 Kasım 2008Php’nin Mysql Data Seek Fonksiyon Kullanımı
Merhabalar bu sefer de çok oldun artık sen yusuf der gibisiniz ya da ben öyle hissediyorum
. Geçenler de ceviz.net‘ te bir kullanıcımız bir sql sorgusu ile sayfanın farklı farklı yerlerinde yeniden kullanmak istediğini ancak sql sorgusunu sadece bir kere kullanıp while ile döngüye girip alabildiğinden yakınmıştı. Aslında tam olarak yapmak istediği şey bir sql sorgusu ile dönen sonuçları sayfanın farklı farklı yerlerinde aynı sorguyu tekrarlamadan yazdırmaktı.
Kullanıcının bu dediğini yapamamamızın nedeni ise sql sorgusu yapıldığında imlecin sonuna gitmesidir böyle olunca da aynı sorguyu başa almadığımız için farklı farklı yerlerde yeniden kullanamamaktayız. İşte burada bize yardıma php ‘nin mysql ve mysqli fonksiyonlarından mysql_data_seek() ve mysqli_data_seek() fonksiyonları yetişmekte. İsterseniz birer örnekle konumuzu detaylandıralım. Öncelikle bir veritabanı oluşturduğunuzu varsayarak aşağıya bir sql kodlarını veriyorum.
CREATE TABLE data_seek_test_tablo( id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ad varchar(50) NOT NULL, soyad varchar(50) NOT NULL ); INSERT INTO data_seek_test_tablo(ad,soyad) VALUES ('yusuf','koç'); INSERT INTO data_seek_test_tablo(ad,soyad) VALUES ('akın','yorulmaz'); INSERT INTO data_seek_test_tablo(ad,soyad) VALUES ('ersin','ölmez');
yukarıdaki sql satırlarını phpmyadmin veya türevi bir arayüz ile veritabanınızda tablo ve bilgileri eklediğinizi varsayıyorum.
Şimdi gelelim tek sorgu yaptık ve bunu farklı farklı yerlerde kullanmaya… Şimdi öncelikle bir genel sorgumuzu yapalım
< ?php mysql_connect('locahost','root','') or die (mysql_error()); mysql_select_db('veritabani_adi') or die (mysql_error()); $query = mysql_query("SELECT * FROM data_seek_test_tablo"); while ($rows = mysql_fetch_array($query)) { echo $rows['id'].' '.$rows['ad'].' '.$rows['soyad'].'<br />'; } ?>
yusuf koç akın yorulmaz ersin ölmez
üstteki betik bize tanımladığımız tablodaki tüm verileri listeleyip işlemini tamamlayacaktır. Fakat sayfanın alt kısımlarında ikinci bir while ile tekrar verileri yazdırmak istediğimiz de hata alacağızdır. Onun için imleci tekrar başa almak gerekiyor bunu da mysql_data_seek() ile yapıyoruz.
< ?php mysql_connect('locahost','root','') or die (mysql_error()); mysql_select_db('veritabani_adi') or die (mysql_error()); $query = mysql_query("SELECT * FROM data_seek_test_tablo"); while ($rows = mysql_fetch_array($query)) { echo $rows['id'].' '.$rows['ad'].' '.$rows['soyad'].'<br />'; } mysql_data_seek($query,0); while ($rows = mysql_fetch_array($query)) { echo $rows['id'].' '.$rows['ad'].' '.$rows['soyad'].'<br />; } ?>
yusuf koç akın yorulmaz ersin ölmez yusuf koç akın yorulmaz ersin ölmez
bu betik çalıştırıldığında ise göreceksiniz ki tek $query sorgusu ile iki adet while kullandık bunun sonucunda iki kere aynı kayıtları bastığını göreceksiniz.
Bunun yanında mysql_data_seek() fonksiyonundaki 0 ( sıfır ) imleci sorgunun başına alır. 0 yerine örneğin 1 derseniz tablodaki ikinci kayıttan itibaren listelemeye başlar. Bunu da anlamamız için bir örnek yapalım.
< ?php mysql_connect('locahost','root','') or die (mysql_error()); mysql_select_db('veritabani_adi') or die (mysql_error()); $query = mysql_query("SELECT * FROM data_seek_test_tablo"); while ($rows = mysql_fetch_array($query)) { echo $rows['id'].' '.$rows['ad'].' '.$rows['soyad'].'<br />'; } mysql_data_seek($query,1); while ($rows = mysql_fetch_array($query)) { echo $rows['id'].' '.$rows['ad'].' '.$rows['soyad'].'<br />'; } ?>
yusuf koç akın yorulmaz ersin ölmez akın yorulmaz ersin ölmez
Bunda da göreceksiniz ki “yusuf koç” ikinci while dikkate alınmadı çünkü imlec ikinci kaydın başına getirildi.
Sabırla okuduğunuz için saolun var olun


PHP den pek anlamam amma, iki kere mysql_fetch_array çağırmaya gerek yok bence.
Daha verimli bir yol olarak
$rows = mysql_fetch_array($query);
for($i in $rows) //böyle mi dönüyorsunuz? Yoksa foreach var mı neyse…
O şekilde okuyup, ilk döngüde hash benzeri bir yapıya alırsanız, ikinci ulaşımda hash den direkt id verip okutabilirsiniz.
Gerçi php deki bu dizi aynı hash gibi davranıyor ama.
Dizinin istenilen elemanına giden bir fonksiyon da muhakkak php de vardır. Bilmiyorum ama inancım tam
Bu arada, çok oluyorsun Yusuf.
@necat’cım
evet dediğin şey de yapılabilir ve uygulanabilir de ama burda önemli olan konu mysql_data_seek idi :p
Dediğin şey ise şudur
$dizi sine sayfa başında aktarıldıktan sonra artık diğer kısımlarda for veya foreach ile diziyi listelemek kalıyor. Ama dediğim gibi mysql_data_seek i tanıtmak idi amaç :p
kullanım amaçları ve farklılıkları olabilir… Tabii bu işlemi görünce acaba nerde nasıl kullanmış bu işlemi diye de kendime sormadan edemedim..
@yakusha
yazının başında da belirttiğim üzere bir sql sorgusu bir kere çalıştırıldığında imlec sona gittiği için tekrar aynı sql sorgusunu kullanamıyoruz. mysql_data_seek de orda giriyor devreye. Bu fonksiyon ile yapılan sql sorgusu üzerinde imleci istenilen satırın başına götürüp ordan itibaren aldırabiliyoruz kayıtları. Pek kimsenin işine yarar mı bilemiyorum lakin mutlaka kullanan bir kısım çevre vardır
İyi bir örnekleme..
Komplex kodlarla uğraşırken ben çok kullanıyorum..
Eleştiren arkadaşlar profesyonel olarak php ile uğraşmaya başladıklarında faydasını göreceklerdir..
SQL de ki Distinct komutu bu işi daha kolay yapar..
php ye gerek bırakmaz bu durumu..
@yaren
Distinct sadece aynı kayıtlardan bir tanesini alır. data seek ise tamamen farklıdır.
Bu blog’dan öğreneceğim çok şey var.
Teşekkürler.
Bu blog’u nasıl daha önce farketmedim..
Bilgiler çok iyi sağolun
Hocam çok güzel anlatmışsın ,eline sağlık.