Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

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

Konu, 'PHP' kısmında mkarabulut tarafından paylaşıldı.

  1. mkarabulut

    mkarabulut Misafir

    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. mkarabulut

    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. mkarabulut

    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. Sahin

    Sahin Daimi Üye

    Kayıt:
    28 Mayıs 2002
    Mesajlar:
    8,943
    Beğenilen Mesajlar:
    0
    Eline sağlık üstat güzel oldu bu yazı. Birde tabloya dışardan nasıl veri ekleriz onuda yaz istersen tam olsun :tabi:
     
  5. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara


    Bakınız C :)
     
  6. sokrates

    sokrates Daimi Üye

    Kayıt:
    8 Temmuz 2002
    Mesajlar:
    537
    Beğenilen Mesajlar:
    0
    Meslek:
    Web Programmer
    Şehir:
    istanbul
    devam et kardes devam et:)
     
  7. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    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...
     
    Son düzenleme yönetici tarafından yapıldı: 10 Ekim 2002
  8. mkarabulut

    mkarabulut Misafir

    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 ?

    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.
    Bu 50 rakamı bir latife galiba :)

    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...
    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...
    Haklısın üstad olabilir.
    eheh. İyi olur :)
     
  9. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    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.. :)
     
  10. mkarabulut

    mkarabulut Misafir

    eheh. peki üstadım :)
     
  11. Sahin

    Sahin Daimi Üye

    Kayıt:
    28 Mayıs 2002
    Mesajlar:
    8,943
    Beğenilen Mesajlar:
    0
    Peki hazır bu konuya değinmişken Mustafam bizim sitedeki ana sayfa haberlerini sonraki sayfa butonu ile sıralayabilirmiyiz? :D

    Ben bir şeyler yaptım ama sadece bütün haber başlıklarını sıralıyor orda ve oradan diğer haberlere ulaşılıyor ben ikinci üçüncü sayfa diye gitsin istiyorum. Hadi arkadaşlar şu olaya bir el atalım :p
     
  12. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    ANA! Mustafa senin tipin duzelmis! :D
     
  13. Sahin

    Sahin Daimi Üye

    Kayıt:
    28 Mayıs 2002
    Mesajlar:
    8,943
    Beğenilen Mesajlar:
    0
    Biraz fazla gençlesmemis mi? Hatta tıfıl bile denemez mi? :D
     
  14. mkarabulut

    mkarabulut Misafir

    Konuyu dağıtmak istemiyordum ama neyse yanıt vereyim :)

    Bu fotograf yaklaşık 3 sene önceki bi fotografım,yakkaşık 20 yaşında falanım, pek tıfıl değildim yani orada... Ama fotograf biraz öyle çıkmış :)

    Üstad tipin düzelmiş diyonda tipim bozukmuydu ki önceden yani :aglama:
     
  15. LoS.ToF

    LoS.ToF Daimi Üye

    Kayıt:
    11 Ağustos 2002
    Mesajlar:
    1,088
    Beğenilen Mesajlar:
    0
    Meslek:
    PHP Developer
    Şehir:
    Antalya
    yok be eski resim daha iyidi. :D
    zaten Mustafa tek bi Mustafa :D tipi kayık değil en azından benim gibi :D
     
  16. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    Estagfur'Allah.. :) Daha parlak cikmissin.. :)
     
  17. LoS.ToF

    LoS.ToF Daimi Üye

    Kayıt:
    11 Ağustos 2002
    Mesajlar:
    1,088
    Beğenilen Mesajlar:
    0
    Meslek:
    PHP Developer
    Şehir:
    Antalya
    Parlak !

    Ahahaha :sus:
     
  18. mkarabulut

    mkarabulut Misafir

    Ağlamak istiyorum :aglama:
     
  19. LoS.ToF

    LoS.ToF Daimi Üye

    Kayıt:
    11 Ağustos 2002
    Mesajlar:
    1,088
    Beğenilen Mesajlar:
    0
    Meslek:
    PHP Developer
    Şehir:
    Antalya
    Mustafa'nın üzerinde kara bulutlar dolaşıyo. Sıkma canını be dostum.
     
  20. Sahin

    Sahin Daimi Üye

    Kayıt:
    28 Mayıs 2002
    Mesajlar:
    8,943
    Beğenilen Mesajlar:
    0

    demiştim konuyu toparlayalım hadi. :p