etkili PHP ve MySQL bir oylama sistemi için almak

6 Cevap php

Ben kayıtlı kullanıcılar / resim için yorumlarınızı oy kadar oy bir sistem var. Bu Overflow en oylama sistemi Stack çok benzer.

Ben gibi değerleri ile bir tabloda oy saklayın:

vote_id | vote_comment_id | vote_user_id | vote_date | vote_type 

Şimdi aşağıdakiler için hız ve verimlilik ile ilgili bir kaç soru var:

Bir kullanıcı yorumlarıyla resim sayfası açıldıktan sonra o kullanıcı zaten gibi göstermek için bir yorumum YUKARI / AŞAĞI olarak ise PROBLEM:, ihtiyacım; "Yukarı olarak" ya (Yığın taşması oy görüntü vurgulanır) aşağıdaki yorumuna "aşağı oy".

MY POSSIBLE SOLUTION: Şu anda ben her yorumun aracılığıyla resim sayfası ben döngü açtığınızda ve oy benim tablo ile ben döngü de bir kullanıcı olarak olup olmadığını kontrol ve (ben kullanıcının ile vote_user_id karşılaştırma durumunu gösterir oturum).

Bu ne kadar etkili? Herkes bu tür bir sorunun üstesinden gelmek için daha iyi bir yaklaşım var mı?

6 Cevap

Sen oy tabloya döngü vardır? Eğer belleğe tüm veritabanı okuma ve daha sonra döngü musunuz?

Yalnızca ilgili veri için veritabanı sorgulama denediniz mi?

SELECT vote_comment_id, vote_type
FROM vote
WHERE vote_user_id = 34513
  AND vote_comment_id IN (3443145, 3443256, 3443983)

Eğer kullanmakta olduğunuz veritabanı söz yok ama bazı SQL varyantı varsayalım.

bu yüzden, yerine oy tüm tablo döngü, sen gibi bir şey yapabilirsiniz

select vote_type from vote_table where vote_comment_id = $commentId and vote_user_id = $userId

hatta daha iyi, size bir left join gibi yapabilirsiniz gerçek yorumlar alınırken olduğunuzda yani

select c.*, v.vote_type from comments c left join (select * from votes where vote_user_id = $userId) v on v.vote_comment_id = c.comment_id

vote_type boş, yukarı veya aşağı ekran döngü içinde ise o zaman kontrol edin. 1000 bir yorum var ve sadece ilk yöntem yardımcı olmalıdır bu durumda olsa bir seferde 10 gösterirseniz, bu daha az etkili olabilir.

[Yaklaşık vote_type sütunun üstünde Yorumlarınız sonra düzenlenebilir]

Eğer satır sayıda alınıyor eğer özel Alt Seç'i kullanarak önlemek için deneyin.

select c.*, v.vote_type 
from comments c 
left join vote v 
on v.vote_comment_id = c.comment_id
and v.vote_user_id = $userId

/ Sakla vote_type görüntülemek için CASE deyimi kullanma.

select c.*, CASE v.vote_user_id WHEN $userId
THEN v.vote_type /*compare vote_user_id with the user's session*/
ELSE null END AS 'votetype' /*hide vote_type */
from comments c 
left join vote v 
on v.vote_comment_id = c.comment_id

Eğer kullanıcı, yani Post_id ilgili olarak ne olursa olsun için bir sütun gerek değil mi?

Sen, bir seçme sorgusu yapmak Geçerli yazı ve kullanıcı için bir satır Varlığından bile görebiliyordu - bir satır döndürdü, onlar oy verdin.


Aslında, ben sadece vote_comment_id I (vote_comment) olarak okumak ne olmadığını fark ettim.

Sadece bir satır olup olmadığını kontrol etmek gerekir

Ben benzer bir mantıkla bir site var. Ben (Bunun için) ayrı oy izlemek yok, ben sadece kullanıcı adınız ile bir oy sayımı ve bir metin alanı, bir mesaj (images) tablo var: oy; kimliği: oy ... oy olduğunu + / çiftleri, -. Bu şekilde ben büyük oy tablosundan seçmek gerek yoktur ve ben yine mesaja ait satır yüklemeniz gerekir. "Kullanıcı adınız:" için basit bir string arama geçerli kullanıcı olarak olup olmadığını ortaya çıkaracaktır.

ASİT işlemler tutarlı oy sayımı ve oy metin alanını tutmak için gereklidir.

My solution is to fetch all user's votes when he's logging in into a session. Fetch all comments' ids into two arrays:

$_SESSION['votes'] = array(
    'up'   => array(12, 854, 87, 78),
    'down' => array(84, 32, 77)
);

ve ne zaman kullanıcı erişim bazı sayfası onay ilgili id ​​o diziler herhangi varsa.