• 22-10-2014, 17:59:19
    #1
    Merhaba arkadaşlar,
    Uzun bir zaman sonra bir script yaptım ve ciddi bir hataya imza atmışım.
    Üyelerin yaşını almak için Gün-Ay-Yıl değilde iki haneli sayı olarak alıyordum..
    Zaman geçmesine ragmen uyelerin yaşlarının değişmedigini farkedince hatanın büyüklüğünü anladım..

    şimdi veritabanındaki tüm yaşları 01.01.YYYY olarak değiştirdim
    bu sefer şöyle bir ihtiyaç ortaya çıktı..
    Üye yaşlarında 20 ile 30 yaş arasını çekmek istersem nasıl bir mantık yürütmem lazım ? sadece yıla göre degil tam yaşını bulmak için gun ve ayda olması lazım aksi halde sonuclarda çelişki çıkıyor.

    Çözebilirim gibi geliyor bana ama şuanda beynim ERROR veriyor.

    DÜZENLEME:
    Veritabanında dogum tarihleri şu şekilde 01-01-YYYY
    ve ben şöyle bir kod hazırladım

    $yas1=$_GET['yas1']; // ornek 20 olsun
    $yas2=$_GET['yas2']; // ornek 25 olsun
    // Yaslar arasi arama yapmak icin yaslari dogum tarihine ceviriyoruz
    $simdikiyil = explode("-", trtarih());
    $ilkyas=$simdikiyil[2]-$yas1; // dogum YILINI bulduk
    $sonyas=$simdikiyil[2]-$yas2; // dogum YILINI bulduk
    $ilkyasara="01-01-".$ilkyas; // tam tarihe ceviriyoruz
    $sonyasara="01-01-".$sonyas; // tam tarihe ceviriyoruz
    Bu sekilde gelen rakamları doğum tarihine çevirdikten sonra sorguyu şöyle oluşturdum
    if($gelencinsiyet==""){ $cins=""; } else { $cins="cinsiyet='$gelencinsiyet' and"; }
    if($gelensehir==""){ $memleket=""; } else { $memleket="sehir='$gelensehir' and"; }
    
    $arama=mysql_query("select * from uyeler where $cins $memleket onay='1' and yas BETWEEN '$ilkyasara' and '$sonyasara' ORDER BY id desc limit $a,$limit");
    while ($cek=mysql_fetch_array($arama)) {
    echo "...........";
    }
    yas1 ve yas2 aynı degere sahipse arama yapıyor ama farklı ise yapmıyor
    mesela ikisini 20 yaptıgımda 20 yaşındaki tüm üyeleri çekiyor..

    Forumda kimse yokmu? yoksa herkes benim gibi ERROR mu veriyo
    Bi teselli felan verin bari..
  • 22-10-2014, 22:21:07
    #2
    Üyeliği durduruldu
    $sorgu = "select * from tabloadi where (tarih between '$başlangıçtarih' and '$bitistarih') order by id desc";


    çok fazla yazı yazmışın başlıgı dikkate alarak cevap yazdım.
  • 22-10-2014, 22:27:31
    #3
    XYZ
    Kimlik doğrulama veya yönetimden onay bekliyor.
    SurucLu adlı üyeden alıntı: mesajı görüntüle
    Merhaba arkadaşlar,
    Uzun bir zaman sonra bir script yaptım ve ciddi bir hataya imza atmışım.
    Üyelerin yaşını almak için Gün-Ay-Yıl değilde iki haneli sayı olarak alıyordum..
    Zaman geçmesine ragmen uyelerin yaşlarının değişmedigini farkedince hatanın büyüklüğünü anladım..

    şimdi veritabanındaki tüm yaşları 01.01.YYYY olarak değiştirdim
    bu sefer şöyle bir ihtiyaç ortaya çıktı..
    Üye yaşlarında 20 ile 30 yaş arasını çekmek istersem nasıl bir mantık yürütmem lazım ? sadece yıla göre degil tam yaşını bulmak için gun ve ayda olması lazım aksi halde sonuclarda çelişki çıkıyor.

    Çözebilirim gibi geliyor bana ama şuanda beynim ERROR veriyor.

    DÜZENLEME:
    Veritabanında dogum tarihleri şu şekilde 01-01-YYYY
    ve ben şöyle bir kod hazırladım

    $yas1=$_GET['yas1']; // ornek 20 olsun
    $yas2=$_GET['yas2']; // ornek 25 olsun
    // Yaslar arasi arama yapmak icin yaslari dogum tarihine ceviriyoruz
    $simdikiyil = explode("-", trtarih());
    $ilkyas=$simdikiyil[2]-$yas1; // dogum YILINI bulduk
    $sonyas=$simdikiyil[2]-$yas2; // dogum YILINI bulduk
    $ilkyasara="01-01-".$ilkyas; // tam tarihe ceviriyoruz
    $sonyasara="01-01-".$sonyas; // tam tarihe ceviriyoruz
    Bu sekilde gelen rakamları doğum tarihine çevirdikten sonra sorguyu şöyle oluşturdum
    if($gelencinsiyet==""){ $cins=""; } else { $cins="cinsiyet='$gelencinsiyet' and"; }
    if($gelensehir==""){ $memleket=""; } else { $memleket="sehir='$gelensehir' and"; }
    
    $arama=mysql_query("select * from uyeler where $cins $memleket onay='1' and yas BETWEEN '$ilkyasara' and '$sonyasara' ORDER BY id desc limit $a,$limit");
    while ($cek=mysql_fetch_array($arama)) {
    echo "...........";
    }
    yas1 ve yas2 aynı degere sahipse arama yapıyor ama farklı ise yapmıyor
    mesela ikisini 20 yaptıgımda 20 yaşındaki tüm üyeleri çekiyor..

    Forumda kimse yokmu? yoksa herkes benim gibi ERROR mu veriyo
    Bi teselli felan verin bari..
    Tablodaki "yas" sütunu VARCHAR mı?
  • 23-10-2014, 08:16:46
    #4
    @XYZ VARCHAR olarakta denedim TEXT olarakta denedim olmadı.
    Şuanda DATE yaptım ve tarih verilerinide update yapıp YYYY-AA-GG olarak değiştirdim.

    18 ile 18 arası arama yaptıgımda sonuc donuyor ama değişik oldugunda sonuc vermiyor.
  • 23-10-2014, 14:49:10
    #5
    SurucLu adlı üyeden alıntı: mesajı görüntüle
    @XYZ VARCHAR olarakta denedim TEXT olarakta denedim olmadı.
    Şuanda DATE yaptım ve tarih verilerinide update yapıp YYYY-AA-GG olarak değiştirdim.

    18 ile 18 arası arama yaptıgımda sonuc donuyor ama değişik oldugunda sonuc vermiyor.
    Sütunu DATE yaptıktan sonra SQL sorgunuz şöyle birşey olmalı:

    select * from uyeler where $cins $memleket onay='1' and str_to_date(`yas`, '%d-%m-%Y') BETWEEN '$ilkyasara' and '$sonyasara' ORDER BY id desc limit $a,$limit
  • 23-10-2014, 15:09:02
    #6
    XYZ adlı üyeden alıntı: mesajı görüntüle
    Sütunu DATE yaptıktan sonra SQL sorgunuz şöyle birşey olmalı:

    select * from uyeler where $cins $memleket onay='1' and str_to_date(`yas`, '%d-%m-%Y') BETWEEN '$ilkyasara' and '$sonyasara' ORDER BY id desc limit $a,$limit
    Dediğinizi yaptım ama hiç bir sonuç çıkmadı..
    Veritabanında dogum tarihlerini YYYY-AA-GG olarak kayıt etmişim

    Örneğin forumdan 20 ile 25 yaş arası aranmak istediginde bu degerler şöyle bir yoldan geçiyor
    $yas1=mysql_real_escape_string(strip_tags(trim($_GET['yas1'])));
    $yas2=mysql_real_escape_string(strip_tags(trim($_GET['yas2'])));
    // Yaslar arasi arama yapmak icin yaslari dogum tarihine ceviriyoruz
    $simdikizaman = explode("-", trtarih());
    $ilkyas=$simdikizaman[0]-$yas1; // dogum YILINI bulduk
    $sonyas=$simdikizaman[0]-$yas2; // dogum YILINI bulduk
    $ilkyasara=$ilkyas."-".$simdikizaman[1]."-".$simdikizaman[2];
    $sonyasara=$sonyas."-".$simdikizaman[1]."-".$simdikizaman[2];
    Bu yoldan geçtikten sonra
    20 degerimiz 1994-10-23 oluyor
    25 degerimiz 1989-10-23 oluyor
    bende elde ettigim 1994-10-23 ve 1989-10-23 degerlerini şu şekilde aratıyorum

    if($gelencinsiyet==""){ $cins=""; } else { $cins="cinsiyet='$gelencinsiyet' and"; }
    if($gelensehir==""){ $memleket=""; } else { $memleket="sehir='$gelensehir' and"; }
    
    $arama=mysql_query("select * from uyeler where $cins $memleket onay='1' and yas BETWEEN '$ilkyasara' and '$sonyasara' ORDER BY id desc limit $a,$limit");
    while ($cek=mysql_fetch_array($arama)) {
    echo ".....çekilenler.....";
    }
    Az önce dediginiz kısmıda ekledim sırf tatmin olmak için ama sonuç başarısız..
  • 23-10-2014, 15:55:14
    #7
    SurucLu adlı üyeden alıntı: mesajı görüntüle
    Dediğinizi yaptım ama hiç bir sonuç çıkmadı..
    Veritabanında dogum tarihlerini YYYY-AA-GG olarak kayıt etmişim

    Örneğin forumdan 20 ile 25 yaş arası aranmak istediginde bu degerler şöyle bir yoldan geçiyor
    $yas1=mysql_real_escape_string(strip_tags(trim($_GET['yas1'])));
    $yas2=mysql_real_escape_string(strip_tags(trim($_GET['yas2'])));
    // Yaslar arasi arama yapmak icin yaslari dogum tarihine ceviriyoruz
    $simdikizaman = explode("-", trtarih());
    $ilkyas=$simdikizaman[0]-$yas1; // dogum YILINI bulduk
    $sonyas=$simdikizaman[0]-$yas2; // dogum YILINI bulduk
    $ilkyasara=$ilkyas."-".$simdikizaman[1]."-".$simdikizaman[2];
    $sonyasara=$sonyas."-".$simdikizaman[1]."-".$simdikizaman[2];
    Bu yoldan geçtikten sonra
    20 degerimiz 1994-10-23 oluyor
    25 degerimiz 1989-10-23 oluyor
    bende elde ettigim 1994-10-23 ve 1989-10-23 degerlerini şu şekilde aratıyorum

    if($gelencinsiyet==""){ $cins=""; } else { $cins="cinsiyet='$gelencinsiyet' and"; }
    if($gelensehir==""){ $memleket=""; } else { $memleket="sehir='$gelensehir' and"; }
    
    $arama=mysql_query("select * from uyeler where $cins $memleket onay='1' and yas BETWEEN '$ilkyasara' and '$sonyasara' ORDER BY id desc limit $a,$limit");
    while ($cek=mysql_fetch_array($arama)) {
    echo ".....çekilenler.....";
    }
    Az önce dediginiz kısmıda ekledim sırf tatmin olmak için ama sonuç başarısız..
    İkinci tarihinizin ($sonyasara)'nın birinci tarihinizden ($ilkyasara) daha erken bir tarih olmasından kaynaklanıyor olabilir. Yerlerini değiştirerek deneyebilirsiniz. Belki sorununuz çözülür.

    if($gelencinsiyet==""){ $cins=""; } else { $cins="cinsiyet='$gelencinsiyet' and"; }
    if($gelensehir==""){ $memleket=""; } else { $memleket="sehir='$gelensehir' and"; }
    
    $arama=mysql_query("select * from uyeler where $cins $memleket onay='1' and yas BETWEEN '$sonyasara' and '$ilkyasara' ORDER BY id desc limit $a,$limit");
    while ($cek=mysql_fetch_array($arama)) {
    echo ".....çekilenler.....";
    }
  • 23-10-2014, 16:07:19
    #8
    XYZ adlı üyeden alıntı: mesajı görüntüle
    İkinci tarihinizin ($sonyasara)'nın birinci tarihinizden ($ilkyasara) daha erken bir tarih olmasından kaynaklanıyor olabilir. Yerlerini değiştirerek deneyebilirsiniz. Belki sorununuz çözülür.
    Ahaa.. vallahada çalıştı.
    bir iki yıl farklı atıyor ama onuda deneme yanılma ile insallah yerine oturttururuz.
    ben sonun veritabanından kaynaklandıgını düşünüyordum..
    Aşağıdaki konuya bakarmısın hocam bu normal bi durum mu ?

    https://www.r10.net/php/1349009-phpmy...il-olmali.html
  • 23-10-2014, 16:31:00
    #9
    Öncelikle şahsi fikrim olarak bu tarz date ile alakalı bilgi tuttuğumda genelde değerleri integer alanda mikrotime tutarım.

    Kafanızı fazla karıştırmadan ufak bir örnek vereceğim. Tarihleri mikrotime olarak tuttuğumuzu farz ediyorum field'inda.
    /* Bir tarihi kısa yoldan mikrotime almak istersek strtotime fonksiyonu işimizi görür.. Veritabanındaki field da nasıl tutacağız derseniz aşağıdaki kod ile mikrotime değerini alıp yazmamız yeterli..
    
    $birthday = strtotime("01.12.2000");
    */
    
    // Gelelim sorguya
    
    $yas1 = strtotime("-25 years");
    $yas2 = strtotime("-30 years");
    
    $sorgu = "SELECT * FROM tablename WHERE fieldname<=$yas1 && fieldname>=$yas2";
    Neden mikrotime olarak tutmak tarih bazında iyi derseniz sorgular daha hızlıdır ve geriye dönüş değerleri birden fazla şekilde kullanabiliyoruz.