v2.5.2
Giriş yap

Neden/Nasıl Yanlış Veri Saydırıyor?

ugurkilci
496 defa görüntülendi

Bu şekilde kodum var. Bunda hiç problem yok. Bugün üye sayısı 1 olmalı çünkü veri tabanında öyle bir kayıt yok ama bana 29 kişi bugün üye oldu diyor. Çok enteresan bir olay.

Bu da sitemin "sözde kendim için hazırladığım analizi" https://www.girisimzel.com/merhabaekrani.php

Girdiğiniz anda saçma sapan bir şeyin döndüğünü anlayacaksınız ama onun neden kaynaklandığını ve nasıl çözeceğimi bulamadım.

<?php
    
    $sorgu = $db->prepare("SELECT COUNT(*) FROM uyeler WHERE DAY(uye_tarih) = DAY(CURDATE())");
    $sorgu->execute();
    $say = $sorgu->fetchColumn();
   
    echo $say;

?>
Cevap yaz
Cevaplar (5)
bgokcol
1236 gün önce

Kodda hatalar var ancak ondan önce şunu belirtmek istiyorum, Mysql sunucunun timezone'u muhtemelen Türkiye'den farklıdır ondan kaynaklı kaymalar olur. Düzeltmek için hesap kodlarından önce şunu yazın:
$db->exec("SET time_zone='+03:00';");

Bugünkü satırları çekmek için:
select count(*) as total from uyeler where DATE(uye_tarih) = CURDATE()

Bu haftaki kayıtları çekmek için (son 7 gün değil! hafta başından itibaren):
select count(*) as total from uyeler where YEARWEEK(uye_tarih, 1) = YEARWEEK(CURDATE(), 1)
Not: Burada 1 parametresi haftayı pazartesinden başlatmak için.

Bu ayki kayıtları çekmek için (son 30 gün değil! ay başından itibaren):
select count(*) as total from uyeler where MONTH(uye_tarih) = MONTH(CURDATE()) AND YEAR(uye_tarih) = YEAR(CURDATE())

Bu yıl kayıtları çekmek için (son 365 gün değil! yıl başından itibaren):
select count(*) as total from uyeler where YEAR(uye_tarih) = YEAR(CURDATE())

tayfunerbilen
1236 gün önce

bugün kayıt olanları almak için şunu kullan

select count(*) as total from uyeler
where date(uye_tarih) = curdate()
ugurkilci
1236 gün önce

Aydınlandım resmen. Hemen yanıtları beğendim test etmeden. Test edince yine hata çıktı sanırım ben kodu yazamadım.

bunu deneyince 0 gösteriyor halbuki 19 saat önce 1 kişi üye olmuştu. 1 olması gerek. Aynı şeyi yıl içinde yapınca olmuyor. 0 gösteriyor. Bir yere yıl yazmamız gerek:
Bu yüzden şöyle yazdım.
```DATE(uye_tarih) = YEAR(CURDATE())```
olmadı. Günde de olmuyor.

Tam tersini denedim.
```YEAR(uye_tarih) = DATE(CURDATE())```
yine çalışmadı. Acaba date koymayacakmıyız diye düşündüm.
```YEAR(uye_tarih) = CURDATE()```
Yine çalışmadı. Tam tersini de denedim.
```uye_tarih = YEAR(CURDATE())```
Sonuç yine aynı.

Çözemedim. :)
bgokcol
1236 gün önce

Tayfun hoca cevap vermiş ama kod ile düzeltmeyi yapayım:
DAY(uye_tarih) = DAY(CURDATE()) yerine DATE(uye_tarih) = CURDATE() kullanın düzelir.
Sorun DAY fonksiyonunun sadece günü (15 Aralık 2020 yerine sadece 15) döndürmesi.

tayfunerbilen
1236 gün önce

mantık olarak 15'inde kayıt olmuşları sayıyor bu kod, yani bu 15 aralıkta olabilir 15 ocakta o yüzden 29 çıkıyordur sayı :)