+ Cevap Yaz
Toplam 4 sayfadan 1. sayfa
1 2 3 4 En SonEn Son
31 sonuçtan 1 ile 10 arası gösteriliyor

Konu: PHP üzerine bi kaç sık sorulan soru ve bi kaç cevap

  1. #1
    mkarabulut
    misafir

    PHP üzerine bi kaç sık sorulan soru ve bi kaç cevap

    Merhaba,
    PHP'ye yeni başlayanların sıkça sorduğu bir kaç soruya burada bir cevap yazmak istiyorum. Geçenlerde yine sorulduğu için özel cevap vermek yerine buradan herkesin görebileceği bir cevap yazmak istedim.
    Sorular :

    1- Veritabanındaki kayıtları listeliyorum ama tıklanıp detayların başka bir sayfada görünmesini istiyorum ?

    Öncelikle bu işi en iyi yapmanın yolu veritabanı tasarımdan başlıyor. Veritabanında her kaydı diğer kayıttan ayıracak tekil (unique) bir alan oluşturmak gerekiyor. GEnellikle bu alan değer tekilliğini sağlayabilmek için auto_increment özelliğe sahip int türünde bir alan olur. GEnellikle bu alana kayıtları birbirinden ayıran bir alan olduğu için ID denir.

    Birincisi yapmamız gereken veritabanı tablomuzda bahsettiğimiz gibi bir alan oluşturmak. Mesela uyeler tablomuz için şöyle bi şeyler tasarlayabiliriz.

    Create table uyeler (
    uye_id INT auto_increment,
    uye_isim VARCHAR(50) DEFAULT '',
    uye_ozgecmis TEXT DEFAULT '',
    PRIMARY_KEY (uye_id)
    )

    Şimdi veritabanı tablomuz gerektiği gibi olduğuna göre istediğimiz işlemi yapacak iki tane php sayfası oluşturacağız ( aslında iki işlemi aynı sayfada da yapabiliriz )

    1- Birinci sayfa kayıtları listeleyecek
    2-İkinci sayfa birinci sayfada tıklanarak,seçilen üyenin detaylarını gösterecek

    Birinci sayfamızda malum veritabanı listeleme dongümüzü herkes biliyordur artık heralde,pek çok listeleme metodu olmasına rağmen, ben genelde mysql_fetch_array kullanırım.

    Kod:
    ...
    while ($row=mysql_fetch_array($query)){
       echo "<a href=\"detay.php?id=$row[uye_id]\">$row[uye_isim]</a><br>";
    }
    ...
    
    Dikkat ettiyseniz uye ismini ekrana yazdırıyor ve isim üzerinde bir link tanımlıyorum.İsme tıklanınca gidilecek adres ise detay.php?id=$row[uye_id]. Yani her üyenin linki birbirinden farklı olacak:
    Kod:
    detay.php?id=1 
    detay.php?id=2
    detay.php?id=3
    
    İkinci sayfamızda ise tıklanan üyelerin özgeçmişlerini göstereceğiz. İkinci sayfamız şöyle bi şeyler olacak.
    Kod:
    ...
    //Öncelikle id değerini adres satırından alalım 
    $id= @$_GET["id"];
    $query=mysql_query("SELECT * FROM uyeler WHERE uye_id='$uye'");
    
    if ($row=mysql_fetch_array($query)){
     echo "<p>İsim : $row[uye_isim]";  
     echo "<p>Özgeçmiş:<br>$row[uye_ozgecmis]";
    } else {
     //Böyle bir kayıt yok
     header ("Location:index.php");die;
    }
    ...
    
    Evet olay kısaca bu kadar.

  2. #2
    mkarabulut
    misafir

    2-Kayıtları listelerken her sayfada 10 kayıt göstermek istiyorum,ve en altta sayfalama linkler çıksın istiyorum

    Bu çok sorulan bir sorudur. Pek çok yerde de cevabı var aslında. Mesela ocal.net'de Asosyal isimli arkadaşımız vakt-i zamanında bu konuyla ilgili bir yazı yazmıştı. Öncelikle bu yazıyı incelemenizi tavsiye ederim
    PHP-Mysql ile veri sayfalama

    Ben tekrar burada anlatmayacağım ama bi kaç şey söylemek istiyorum:
    Öncelikle mysql'de veri sayfalama mesela ASP Ve ADODB kullanmış birisine biraz yabancı gelebilir. Çünkü RecordSet'in Paging(sayfalama ) özelliği zaten varken, mysql'de böyle bir özellik yoktur.

    Mysql onun yerine LIMIT özelliğini önermektedir. Şöyle çalışır :
    Kod:
    SELECT * FROM uyeler LIMIT 0,30
    SELECT * FROM uyeler LIMIT 30,30
    SELECT * FROM uyeler LIMIT 60,30
    
    Sırasıyla ilk sorgu 0. kayıt ile 30. kayıt arasını alır.
    İkinci sorgu 30. kayıtdan başlayarak 30 kayıt alır,yani 30-60 arası
    Son sorgu ise 60.kayıtdan itibaren 30 kayıt alır yani 60-90 arası alınır.

    Dikkat ettiyseniz sorgularımızın gidişatı her seferinde 30 kayıt listeleme üzerine kurulu ve bu 3 sorgu ile 90 kayıtlık bir tabloyu 30'arlık 3 parça halinde veritabanından alıyoruz.

    Öyleyse yapmamız gereken hangi sayfayı listelemek istediğimizi belirlemek ve sorguyu ona göre göndermek,mesela
    Kod:
    $page=2;
    $pagesize=30;
    
    //sorguyu hazırla
    $start=($page - 1) * $pagesize;
    $query="SELECT * FROM uyeler LIMIT $start,$pagesize";
    
    Yukarıdaki kod parçası sadece 2.sayfadaki kayıtları listelemektedir. Tek yapmamız gereken $page değişkenini dinamik olarak değiştirmek ve böylece sadece istenen sayfaları listelemek olacaktır.Anahtar nokta şu olacak
    Kod:
    $page=$_GET["page"];
    
    Böylece,adres satırndan hangi sayfa alınırsa, o sayfa ekranda listelenecek.
    Şöyle bi soru aklınıza gelecektir şimdi ve gelmelidir de ..
    Peki adres satırına sayfa linklerini nasıl verceğiz ? Sorunun cevabı şu öncelikle tablonuzda kaç sayfalık veri olduğunu bulacaksınız,ve linkleri ona göre vereceksiniz.
    Kod:
    $page=$_GET["page"];
    $pagesize=30;
    //tüm kayıtları vt den al
    $query=mysql_query("SELECT * FROM uyeler");
    $toplam=mysql_num_rows($query);
    
    $sayfasayisi=ceil($toplam/$pagesize);
    
    ve sayfalama linkleri
    Kod:
    for ($i=1;$i<=$sayfasayisi;$i++){
       if ($i==$page)
           echo $i;
       else 
           echo "<a href=\"$PHP_SELF?page=$i\">$i</a> "; 
    }
    
    Başka da bi şey yok !
    Anlattıklarım parça parça ama yukarıdaki yazıyı okuyup,biraz düşünüp taşınıp sonra bunları okuyarak parçaları birleştirip voltran'ı oluşturabilirsiniz.

  3. #3
    mkarabulut
    misafir

    3-Fonksiyonlar,parametreler,referanslar ve swap fonksiyon sorunu
    Swap fonksiyonu nedir ? Kısaca bu fonksiyon verilen iki değişkenin içeriğini değiş-tokuş yapan fonksiyondur,çok önemli değil ama anlatacağım konuyu açıklamak için iyi bir örnek olacağını düşündüm.
    Mesela programın içinde iki değişkenin değerini değiştirmek istediğiniz farzedelim
    Kod:
    ...
    $a=3;$b=4;
    swap($a,$b);
    echo $a.$b;
    ...
    
    Sway fonksiyonu şöyle bi şeyler olacaktır.
    Kod:
    function swap($v1,$v2){
       $temp=$v1;
       $v1=$v2;
       $v2=$temp;
    }
    
    Peki sizce swap'dan sonra ekranda ne yazar,cevap basit 34...
    Çünkü fonksiyon içine parametre olarak geçirilen değişkenin kendisi değil,bir kopyasıdır. Eğer fonksiyon içinde değişkenlere yapılan değişiklikten ana program içindeki değişkenlerde etkilensin istiyorsanız referanslar ile tanışma zamanı...

    Tek yapmamız gereken swap fonksiyonunda ufak bi değişiklik yapmak olacaktır.
    Kod:
    function swap(&$v1,&$v2){
       $temp=$v1;
       $v1=$v2;
       $v2=$temp;
    }
    
    Böylece fonksiyona değişkenlerimiz değer olarak değil de değişkenlerin kendileri aktarılmış oldu. Referans ile aktarma işlemini ise & operatorü ile yapıyoruz.
    Artık ekran çıktımız istediğimiz gibi olacak : 43

    PHP manual'dan referanslar ile ilgili güzel açıklamalar bulabilirsiniz.

  4. #4
    Primus inter pares Sahin Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2002
    Yer
    Kuzey Kutbu
    Mesaj
    8,671

    Eline sağlık üstat güzel oldu bu yazı. Birde tabloya dışardan nasıl veri ekleriz onuda yaz istersen tam olsun
    hava sıcak, de ki mayıs papatyasıyım
    ardımda dört mevsim, içimde sen...

  5. #5
    Üye
    Üyelik Tarihi
    07/2002
    Yer
    Ankara
    Mesaj
    1,120

    Orjinal mesajı gönderen mkarabulut
    [B]Böylece fonksiyona değişkenlerimiz değer olarak değil de değişkenlerin kendileri aktarılmış oldu.
    Bakınız C
    UTF-8 kullanalım, kullanmayanları uyaralım.

  6. #6
    Üye
    Üyelik Tarihi
    07/2002
    Yer
    istanbul
    Mesaj
    537

    devam et kardes devam et

  7. #7
    Üye
    Üyelik Tarihi
    07/2002
    Yer
    Ankara
    Mesaj
    1,120

    Verilen bilgiler hakkında bi kaç şey soleyim:

    - Gözüme çarpan küçük bir yanlış:
    Unique'in karşılığı Tekil değil Biricik'tir.

    - Sayfalama konusunda, sanırım o Limit'le yapılan her sorgunun birbirinden ve Limit'siz halinden maliyet açısından pek bir fakı yoktur. Yani 50 sayfalık bir sonuç kümesi için 50 kere sorgu atmak pek de mantıklı değil bence. Başlangıçta bir kere Limit'siz sorgulama yapılıp, sonuçlar bir Result Set'te de değilde ondan da alınan sonuçlar bir dizide (çok boyutlu) saklanabilir ve bu dizi (referansı) Oturum Nesnesi olarak taşınabilir. Her sayfalama isteminde de bu dizinin istenilen aralıktaki elemanları alınır ki bunun dizi açısından maliyeti 0'dır (dizinin herhangi bir ogesine erişim maliyeti diğerleri ile aynıdır).

    - Sorgulardan donen veri kumesi icin "query" gibi bir isme sahip degisken degil de "sonuc", "sonucKumesi", "rs", resultSet" gibi isimler kullanılması daha mantıklı olur.

    - Biraz da referanslar ile ilgili sorunlar var ama, sadece anlatım düzeyinde ve şu an kafa karıştırabileceği için detaya inmiyorum.

    Acizane fikirlerim...
    Enson 10/10/2002 23:01 tarihinde ee++ tarafından düzenlenmiştir.
    UTF-8 kullanalım, kullanmayanları uyaralım.

  8. #8
    mkarabulut
    misafir

    Orjinal mesajı gönderen ee++
    Verilen bilgiler hakkında bi kaç şey soleyim:

    - Gözüme çarpan küçük bir yanlış:
    Unique'in karşılığı Tekil değil Biricik'tir.
    Demek istediğim bu alanın değerinin tekrar etmeyeceği idi. O an aklıma gelen kelime tekil oldu. Bu durumda biricik mi kullanılıyor ?


    - Sayfalama konusunda, sanırım o Limit'le yapılan her sorgunun birbirinden ve Limit'siz halinden maliyet açısından pek bir fakı yoktur.
    Buffer'a alınan kayıtlar kadar bi maliyet farkı var. 30 sonuçluk bi sorgu ile 100 sonuçluk bi sorgunun maliyeti aynı olmaz tabii ki.

    Yani 50 sayfalık bir sonuç kümesi için 50 kere sorgu atmak pek de mantıklı değil bence.
    Bu 50 rakamı bir latife galiba

    Başlangıçta bir kere Limit'siz sorgulama yapılıp, sonuçlar bir Result Set'te de değilde ondan da alınan sonuçlar bir dizide (çok boyutlu) saklanabilir

    Aslında güzel bi düşünce ama unutulan nokta sorgu sonucunun buffer'da saklanma maliyeti kadar php ile tüm kayıtları fetch etme işlemininde oldukça pahalı olduğu,hatta belki de buffer'da recordset bulundurmaktan daha tuzlu bi işlem...

    ve bu dizi (referansı) Oturum Nesnesi olarak taşınabilir. Her sayfalama isteminde de bu dizinin istenilen aralıktaki elemanları alınır ki bunun dizi açısından maliyeti 0'dır (dizinin herhangi bir ogesine erişim maliyeti diğerleri ile aynıdır).
    Yine güzel bi fikir ama tüm result seti oturum ile taşımak pek uygun olmayabilir kanımca.

    Bence en güzel çözüm,tüm kayıt sayısını en az bir kere yapmak ve oturum ile taşımak,sonra ise LIMIT ile prça parça kayıtları almak.
    100-200 kayıt için çok çözüm birbirne yakın görünüyor ama 1000-2000 kayıt için bence bu yöntem daha iyi gibi...

    - Sorgulardan donen veri kumesi icin "query" gibi bir isme sahip degisken degil de "sonuc", "sonucKumesi", "rs", resultSet" gibi isimler kullanılması daha mantıklı olur.
    Haklısın üstad olabilir.

    - Biraz da referanslar ile ilgili sorunlar var ama, sadece anlatım düzeyinde ve şu an kafa karıştırabileceği için detaya inmiyorum.
    eheh. İyi olur


  9. #9
    Üye
    Üyelik Tarihi
    07/2002
    Yer
    Ankara
    Mesaj
    1,120

    Sayfalama konusunu, Mustafa ile hararetli geçen görüşmelerimiz sonucu uzatmamaya karar verdik

    Ama 50'nin rakam değil sayı olduğunu söylemeden geçemicem..
    UTF-8 kullanalım, kullanmayanları uyaralım.

  10. #10
    mkarabulut
    misafir

    eheh. peki üstadım

+ Cevap Yaz

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Benzer Konular

  1. Asp Bilgi 29 Soru ve Cevap
    By Ridomx in forum ASP
    Cevap: 0
    En Son Mesaj: 13/12/2006, 00:13
  2. 55 soru 55 cevap
    By yemre in forum Windows
    Cevap: 3
    En Son Mesaj: 16/07/2004, 11:57
  3. ADSL üzerine bir kaç soru
    By realperest in forum Ağ / Güvenlik
    Cevap: 18
    En Son Mesaj: 06/03/2004, 15:28
  4. soru cevap
    By sato in forum PHP
    Cevap: 2
    En Son Mesaj: 28/10/2002, 11:19
  5. Cevap: 1
    En Son Mesaj: 12/10/2002, 22:58

Bookmarks

Mesaj Yazma Hakları

  • Yeni mesajgöndermezsiniz
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajınızı düzenleyemezsiniz