v2.5.2
Giriş yap

MySQL tabloki bir sütununun içerisinde yer alan aynı ip'leri saydırarak yazdırma

redandwhite
794 defa görüntülendi ve 1 kişi tarafından değerlendirildi

Merhaba, bir tablom var ismi myips;
Ben bu tablo içerisindeki "ip" isimlü sütunda yer alan IP numaralarını bir amaç için kaydediyorum ancak her birinden kaç adet olduğunu bulabilmem gerekiyor. Zira bazı IP'ler gün içerisinde 5-6 defa giriş yapıyor bu nedenle aynı ipleri seçtirterek saydırmam ve sonucu da yazdırmam gerekiyor. Bunun için şöyle bir yol denedim ama beceremedim. Rica etsem en pratik yol ile nasıl yapıldığını gösterir misiniz?

Cevap yaz
Cevaplar (6)
farukdst
1350 gün önce

Dediğim gibi döngü içinde kullanmışsın, 2 ayrı sorguya ihtiyacın yok $veriler dediğin sorgu yerine verdiğim sorgu tek başına ihtiyacını karşılayacak zaten :)

redandwhite
1350 gün önce

Hocam tekrardan merhaba, dediğinizi yaptım ancak sonuç değişmedi. Ben de oldukça yeniyim PHP'de kusura bakmayın belki de kolay bir yöntemi var ancak ben bilmiyorum.
Tam olarak yapmaya çalıştığım şey şu, nerede yanlış yaptığımı gösterirseniz çok daha iyi olabilir.

Öncelikle kayıtlı ipleri veritabanından çekiyor ve zamana göre sıralatıyorum:

<?php

$veriler = $db->prepare("SELECT * FROM myips ORDER BY zaman DESC");
$veriler->execute();
$arr = $veriler->fetchAll(PDO::FETCH_ASSOC);
foreach ($arr as $deger):
?>

Bundan sonraki süreçte sizin verdiğiniz kodu, tablo değerindeki ip kısmı için kullanıyorum:

<td><?php echo $deger ['ip'];

        $query = $db->prepare('SELECT *, COUNT(*) AS say FROM myips GROUP BY ip HAVING say>1');
        $query->execute();
        if( $query->rowCount() ):

            while( $row = $query->fetch(PDO::FETCH_OBJ) ){
                echo " $row->say";
            }

        endif;
    ?>
    
    Bundan sonra gelen çıktı IP adresi yanında IP'lerin adetini ve kaç farklı adet varsa yan yana yazdırıyor. Benim istediğim sadece o IP'ten kaç adet girmişse yanına (2) veya (5) gibi rakam yazmak.
    Örnek veriyorum A IP'ınden 4 tane varsa bunun diğer bloklara karışmaması lazım sadece ilgili IP sayısı ilgili IP'lerin yanında yazmalı. 
    Kusura bakmayın vaktinizi alıyorum, eğer böyle bir şey mümkünse nasıl yapabilirim uykularım kaçtı bir türlü beceremedim :)
farukdst
1351 gün önce

Sanırım bir yanlışlık yaptın. Verileri çektiğin asıl sorgunu, dediğim örneğe göre düzenlemen gerekiyor. Verdiğim kodu ekstradan eklememelisin yani ki aynı ip adresinin birden fazla kez gelmesi GROUP BY kısmıyla çelişiyor. Verdiğim kodu bir döngü içinde kullandığını sanıyorum. Onun yerine asıl verilerini çektiğin sorgunu verdiğim örneğe göre düzenleyip denemelisin.

redandwhite
1351 gün önce

Hocam öncelikle ilginiz ve yardımseverliğiniz için çok teşekkür ederim. Vermiş olduğunuz kodu uyguladım gayet güzel çalışıyor ancak;
http://prntscr.com/tjt0ad

Resimdeki tabloda çektirdiğim iplerin yan tarafına kaç adet olduklarını yazdırıyorum ancak her iki sonucu da ekrana basıyor. Yani bir ipten 3 tane varsa 3 diğerinden 2 tane varsa 2 diye yan yana yazdırıyor. Bunu sadece var olan satırdaki ip sayısını yazdıracak şekilde ayarlayamaz mıyım?
Mesela 127.2.2 3

uyguladığım kod ise tam olarak şu:
$query = $db->prepare('SELECT , COUNT() AS say FROM myips GROUP BY ip HAVING say>1');

        $query->execute();
        if( $query->rowCount() ):

            while( $row = $query->fetch(PDO::FETCH_OBJ) ){
                echo " $row->say";
            }

        endif;
    ?>
farukdst
1351 gün önce

Ek olarak eğer sadece tekrarlanan ip adreslerini seçmek istiyorsan
"HAVING say" kısmını HAVING say > 1 şeklinde değiştirmelisin.

farukdst
1351 gün önce
<?php

$query = $db->prepare('SELECT *, COUNT(*) AS say FROM myips GROUP BY ip HAVING say');
$query->execute();
if( $query->rowCount() ):
    
    while( $row = $query->fetch(PDO::FETCH_OBJ) ){
        echo "<strong>$row->ip</strong> adresi <strong>$row->say</strong> kez tekrarlandı <br>";
    }
    
endif;