Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

Günün ürünü

Selam,

Bir mySQL tablosundan random bir ürünü getiren bir fnksiyon yazmayı düşünüyorum, getirilen ürün günün ürünü olacak ve hergün değişmesi lazım. Yani mesela dünkü ürünü getirmesin.

Bunu yapmamnın en düzgün yolu nedir sizce??

teşekür
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • liutas adlı üyenin fotoğrafı
    8 yıl önce yazılmış
    1 cevap - 0 soru
    Eğer ürünlerin değişmiyorsa, ya da az değişiyorsa hangi gün ne seçileceğini önceden bir kerelik hesaplayabilirsin:

    ALTER TABLE your_table ADD COLUMN item_day INT DEFAULT 0;
    


    Seçmek için:

    select .... WHERE item_day = DATE_FORMAT('%j')
    



    Seçerken sonuç gelmezse de aşağıdaki kod çalışsın:

    <?php 
    $qry = " UPDATE your_table SET item_day = 0";
    $db->execute($qry);
    
    // You only need 355 item to set as item of the day
    for($i = 0; $i < 355; $i++) {
       $qry = "UPDATE your_table SET item_day = ".($i+1)." WHERE item_day = 0 ORDER BY RAND() LIMIT 1";
       $rs = $db->execute($qry);
       // If no items left stop update
       if (!$rs) { break; }
    }
    

Cevaplar

  • mitch-wheat adlı üyenin fotoğrafı
    8 yıl önce yazılmış
    1 cevap - 0 soru
    ürünler tablsouna bi tane alan ekle: "günün_urunu_secildi" diye, günün ürünü seçildiği zaman update edersin. Günün ürününü de şöyle bir sql'le çekersin:

    SELECT * FROM `table` 
    WHERE gunun_urunu_secildi = 0
    ORDER BY RAND() LIMIT 1;
    


    (Not: rand() özellikle büyük tablolarda çok yavaş çalışır)
    • omg-ponies adlı üyenin fotoğrafı omg-ponies
      Aynen... 100.000+ satırlı bir tabloda biraz yük altında bile rand() epey yavaşlıyor...
      8 yıl önce yazılmış
  • dinesh-atoliya adlı üyenin fotoğrafı
    8 yıl önce yazılmış
    1 cevap - 0 soru
    sequence neden kullanmıyorsun? bence senin işini rahatlıkla görür...
    • lars adlı üyenin fotoğrafı lars
      sequence ne bilmediğimden olabilir mi:)
      8 yıl önce yazılmış
    • dinesh-atoliya adlı üyenin fotoğrafı dinesh-atoliya
      unique bir sayı üreten bir database objesi. Oracle destekliyor ama mysql'den emin değilim.
      8 yıl önce yazılmış
  • 3
    mike adlı üyenin fotoğrafı
    8 yıl önce yazılmış
    1 cevap - 0 soru
    "order by rand" kullanmadan tablodan random bir satır çeken bir prosedür:

    DROP PROCEDURE IF EXISTS random_iotd//
    CREATE PROCEDURE random_iotd()
    BEGIN
        # Tüm ürünler günün ürünü seçildiyse baştan başla 
        SELECT COUNT(*) INTO @used FROM iotd WHERE used = 1;
        SELECT COUNT(*) INTO @rows FROM iotd;
        IF (@used = @rows) THEN
            UPDATE iotd SET used = 0;
        END IF;
    
        # 1 ile seçilmemiş satır adedi arasında bir random sayı üret
        SELECT FLOOR(RAND() * (@rows - @used)) INTO @rand;
    
        # Random sayıya denk gelen ürünün id'si
        PREPARE stmt FROM 'SELECT id INTO @id FROM iotd WHERE used = 0 LIMIT ?,1';
        EXECUTE stmt USING @rand;
    
        # Ürün bilgilerini çek
        PREPARE stmt FROM 'SELECT id, item FROM iotd WHERE id = ?';
        EXECUTE stmt USING @id;
    
        # Seçildi diye işaretle
        PREPARE stmt FROM 'UPDATE iotd SET used = 1 WHERE id = ?';
        EXECUTE stmt USING @id;
    
        DEALLOCATE PREPARE stmt;
    END;
    



    Kullanımı şööle:

    CALL random_iotd();
    



    Denediğim tablo:

    CREATE TABLE `iotd` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `item` varchar(255) NOT NULL,
      `used` BOOLEAN NOT NULL DEFAULT 0,
      INDEX `used` (`used`),
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB;
    




    PHP'den prosedürü de şu şekilde çağırabilirsin:

    $mysqli = new mysqli('localhost', 'root', 'password', 'database');
    $stmt = $mysqli->prepare('CALL random_iotd()');
    $stmt->execute();
    $stmt->bind_result($id, $item);
    $stmt->fetch();
    
    echo "$id, $item\n";
    // 4, Ürün açıklaması
    
    • lars adlı üyenin fotoğrafı lars
      Bravo hocam çok sağol. Yalnız sorun şu ki daha önce hiç prosedür kullanmamıştım ve senin kodu phpMyAdmin'e copy paste yaptım. Hata vermedi ama prosedürü hiçbi yerde göremiyorum?
      8 yıl önce yazılmış
    • mike adlı üyenin fotoğrafı mike
      phpMyAdmin hiç kullanmam ben o yüzden emin değilim, desteklemiyor olabilir. mysql komut satırından çalışamıyor musun?
      8 yıl önce yazılmış
    • MoneyGreen adlı üyenin fotoğrafı MoneyGreen
      Kodları denemedim ama çalışıyor gibi duruyor. Fakat yazarın gözünden kaçmış olabileceğini düşündüğüm bir yer var.
      (@used = @rows) kontrol edilip tablodaki used alanları 0 olarak değiştirildikten sonra @used değişkeni de 0 olarak değiştirilmedi. Yoksa her ürün bir kez seçildikten sonra ilk günün ürününü seçekerken rastgele ürün yerine kaydedilen ilk ürün gelebilir veya farklı sonuçlar doğabilir.
      8 yıl önce yazılmış