• 07-01-2022, 15:24:08
    #19
    canyucel adlı üyeden alıntı: mesajı görüntüle
    Sayfalama yöntemi işinizi görecektir. Diğer türlü 1M datayı işleme almanız çok mümkün değil. Bunu ne amaçla kullanırsanız kullanın yapmanız gerekiyor diye düşünüyorum.

    konuya yorum yapan arkadaslara ve size teşekkür ederim. söylediğiniz gibi yaptım.


    Hatası dişinda, verileri listeledi.

    index.php?s=1
    index.php?s=2
    index.php?s=3
    index.php?s=4
    index.php?s=5 vs.. şeklinde siralamayıda yapıyor.

    şimdi ben bu verileri nasıl ".json" olarak çekebilirim?

    tek tek
    index.php?s=1, index.php?s=2, index.php?s=3, index.php?s=4, index.php?s=5 şeklinde mi çekeceğim? çekeceğim yol nedir?







    db-bolme.php


    <?php
        set_time_limit(0);
    ini_set('memory_limit', '-1');
        
        
    
    
        $db = new PDO("mysql:host=localhost;dbname=hastag", "root", "");
        $toplamVeri = $db->query("SELECT COUNT(*) FROM koop  WHERE ip like 'KAPI' ORDER BY birth")->fetchColumn();
        $goster = 3000;
        $toplamSayfa = ceil($toplamVeri / $goster);
        $sayfa = $_GET["s"];
        if($sayfa < 1) $sayfa = 1;
        if($sayfa > $toplamSayfa)
        {
            $sayfa = (int)$toplamSayfa;
        }
        $limit = ($sayfa - 1) * $goster;
    
        $veriler = $db->prepare("SELECT id, name,surname, birth, ip FROM koop WHERE ip like 'KAPI' ORDER BY birth LIMIT :basla, :bitir");
        $veriler->bindValue(":basla",$limit,PDO::PARAM_INT);
        $veriler->bindValue(":bitir",$goster,PDO::PARAM_INT);
        $veriler->execute();
        $dizi = $veriler->fetchAll(PDO::FETCH_OBJ);
        foreach ($dizi as $item) {
            ?>
            <div class="icerik">
              
          <p><?php echo $item->id;?></p>
          <p><?php echo $item->name;?></p>
          <p><?php echo $item->surname ;?></p>
          <p><?php echo $item->birth ;?></p>
                <p><?php echo $item->ip ;?></p>
            </div>
            <hr>
            <?php
        }
        ?>
        
        <ul class="sayfalama">
            <?php
            for($i = 1; $i<=$toplamSayfa;$i++)
            {
                ?>
                <li><a href="index9.php?s=<?php echo $i;?>"><?php echo $i;?></a></li>
                <?php
            }
            ?>
    
        </ul>
  • 07-01-2022, 21:05:56
    #20
    Öncelikle yapmanız gereken ilk şey SQL sorgunuzu düzeltmek. Joker karakter kullanmadığınız sürece LIKE yapmanız anlamsız, direk = yapabilirsiniz.
    SELECT id, name,surname, birth, ip FROM koop WHERE ip = 'KAPI' ORDER BY birth
    İkinci olarak id sütunu için bir INDEX ekleyin.

    Üçüncü olarak bu veriyi veritabanından çekerken mi timeout oluyor yoksa json oluştururken mi timeout oluyor bunu tespit edin. Eğer mysql tarafında veriyi çekerken bu sorunu yaşamıyorsanız json oluştururken bu sorunu yaşıyorsunuz demektir. Bu durumda SQL sorgunuzu şu şekilde değiştirmeyi deneyin:
    SELECT JSON_ARRAYAGG(JSON_OBJECT(
    'id', id,
    'name', name,
    'surname', surname,
    'birth', birth,
    'ip', ip
    )) FROM koop WHERE ip = 'KAPI' ORDER BY birth
    Veriniz doğrudan MYSQL'den json olarak gelsin. Daha sonra siz PHP tarafında sadece ekrana ya da dosyaya yazdırırsınız.

    Yine de sorununuzun en uygun çözümü, kodunuzun hangi aşamada en çok kaynağı tükettiğini bulmanızda yatıyor.
  • 07-01-2022, 21:22:08
    #21
    canyucel adlı üyeden alıntı: mesajı görüntüle
    Sayfalama yöntemi işinizi görecektir. Diğer türlü 1M datayı işleme almanız çok mümkün değil. Bunu ne amaçla kullanırsanız kullanın yapmanız gerekiyor diye düşünüyorum.
    fatihemre adlı üyeden alıntı: mesajı görüntüle
    Öncelikle yapmanız gereken ilk şey SQL sorgunuzu düzeltmek. Joker karakter kullanmadığınız sürece LIKE yapmanız anlamsız, direk = yapabilirsiniz.
    SELECT id, name,surname, birth, ip FROM koop WHERE ip = 'KAPI' ORDER BY birth
    İkinci olarak id sütunu için bir INDEX ekleyin.

    Üçüncü olarak bu veriyi veritabanından çekerken mi timeout oluyor yoksa json oluştururken mi timeout oluyor bunu tespit edin. Eğer mysql tarafında veriyi çekerken bu sorunu yaşamıyorsanız json oluştururken bu sorunu yaşıyorsunuz demektir. Bu durumda SQL sorgunuzu şu şekilde değiştirmeyi deneyin:
    SELECT JSON_ARRAYAGG(JSON_OBJECT(
    'id', id,
    'name', name,
    'surname', surname,
    'birth', birth,
    'ip', ip
    )) FROM koop WHERE ip = 'KAPI' ORDER BY birth
    Veriniz doğrudan MYSQL'den json olarak gelsin. Daha sonra siz PHP tarafında sadece ekrana ya da dosyaya yazdırırsınız.

    Yine de sorununuzun en uygun çözümü, kodunuzun hangi aşamada en çok kaynağı tükettiğini bulmanızda yatıyor.
    bahsettiğiniz ekrana ya da dosyaya yazdırma işi biraz uzaman işine benziyor. bu konuda uzman değilim.

    sql sorgurusunu "joker" karakter kullanmadıgım için soylediginiz gibi değiştirdim. sanırım performans arttıracak.

    sorunu çok ilkel bir yöntemle çözüyorum.

    verileri ekrana json gibi cikti aliyorum.



    <?php
    $myObj = new stdClass();
    $myObj->id] = " $item->id";
    $myObj->name = " $item->name";
    $myObj->surname = " $item->surname";
    $myObj->ip = " $item->ip";
    
    
    $myJSON = json_encode($myObj);
    
    echo $myJSON;
            
            echo ',';
    ?>
    çıktı sonucu;

    {"id":" 32332244","name ":" MEHMET","surname ":" HAKANLAR","ip ":" 192.168.1.85"},
    290.000 veriyi toplamda 31 sayfada görüntülüyorum.

    her sayfayı kopyala yapistir yaparak .json içersine ekliyorum.

    31 sayfa bittiği zaman 87000k veriyi birlestirmis olacagim.
    291k desem 290k'dan yukarisini fazla sirala dedigim de timeout düşüyor.

    ilkel falan ama şuan tek yapabildigim cozum bu.

    herkese yardımlarından dolayı tesekkur ederim.
  • 08-01-2022, 11:37:58
    #22
    modeno adlı üyeden alıntı: mesajı görüntüle
    söylediğinizi anladım fakat listeleme aşaması için doğru soyluyorsunuz. ben bu yapıyı hiç kullanmayacağım. sayfalama mantığını listeleme için kullanabilirim ama json cıktı kısmında "tek bir .json" verisine ihtiyacım var. hepsi tek bir dosyaya gelmeli.

    eğer ki db tarafı sayfalayarak tek bir ".json" oluyorsa bunun yapılabileceği yolu da açıkçası bilmiyorum.
    1 - listeleme kısmında pagination yaparak sayfabaşı bin adet veriyi gösterirsiniz, örnek veriyorum siteniz.com/sqlDownload dediğinizde ise direkt php arka planda
    SELECT * INTO OUTFILE  $backupFile FROM $tableName
    böyle bir sql kodu çalıştırır, bu şekilde hem json çıktınızı sunucuya kaydeder hem siz verileri pagination şeklinde görürsünüz. dah asonra isterseniz çıktının kaydedildiği dosyayı 1 2 kod ile erişip indirebilirsiniz.

    2-
    SELECT    
    CONCAT("[",        
    GROUP_CONCAT(              
    CONCAT("{address_id:'",address_id,"'"),              
    CONCAT("address:'",address,"'"),            
     CONCAT(",address2:'",address2,"'}")         )    ,"]") AS json FROM location
    INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/location.json'
    böyle bir sql kodu kullanmak da belki işinizi görür