PHP / MySQL sadece üye başına bir oy izin?

4 Cevap php

ive bir ödül oylama sistemi kurma iş yerinde görev veriyorum, ben php ve mysql hakkında çok fazla bilmiyorum. Ama burada herkesten daha bu konuda daha fazla bilgi ve tatile benim patronum. Ama önce bizim sistemde kalan ve bu yıl için adapte olmuştu kodu, yeniden oldum.

Temelde oylama sistemi çalışıyor, ve ben verilerini yakalamak için mysql yeni tablolar kurdum. Ama mevcut kod bir oldukça büyük kusur buldu ve bunu değiştirmek için nasıl emin değilim ettik. Temelde kod onlar şu anda istediğiniz gibi insanlar kadar birçok kez oy sağlar. Ben adil şeyleri tutmak için, üye başına yalnızca 1 oy kısıtlamak istiyorum.

Şu anda, üyeleri üyelik numarası ile giriş Yani, daha sonra oy. Oy mysql tablolarında depolanır, ve ben o verileri sorgulayarak oy ekleyebilirsiniz.

Birisi sadece bir üye zaten oy olup olmadığını görmek için kontrol edecek bir satır kod ya da iki ekleyerek bana yardımcı olabilir umuyordum. Ne zaman bir üye oy, onların üye yok. oy kendi seçimleri ile birlikte SQL tablolarda depolanır. Yani belki en iyi yolu bir memeberid zaten tabloda olup olmadığını görmek için, ve eğer, onlar zaten oy verdiniz kullanıcı anlatmak - bu yönde ya da sözcükleri.

<?php
//Insert into volunteer awards
$coach=mysql_real_escape_string($_SESSION['coach']);
$official=mysql_real_escape_string($_SESSION['official']);
$young_volunteer=mysql_real_escape_string($_SESSION['young_volunteer']);
$volunteer=mysql_real_escape_string($_SESSION['volunteer']);

$memberid=$_SESSION['MM_Username'];
$association=$_SESSION['MM_Association'];
$region=$_SESSION['Region'];


$sql_query = mysql_query("INSERT INTO awards_2009_votes (`id`, `member_id`, `region`, `coach`, `official`, `volunteer`, `young_volunteer`) VALUES ('', '$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
?>

Teşekkürler

4 Cevap

Burada hızlı ve kirli bir yaklaşım:

$sql_query = "SELECT FROM awards_2009_votes WHERE member_id = '$memberid'";
$sql_result = mysql_query($sql_query);
$num_rows = mysql_num_rows($sql_result);

if ($num_rows > 0) {
    // this member has already voted
} else {
    // carry on
}

Piskvor işaret ettiği gibi, olsa da, bu çözüm (en azından) iki sınırlamaları vardır:

  1. Bu, kendisini içeren bir yöntem ile sınırlı olduğu, bu yüzden birden çok oy in general önlenmesi değil - yalnızca bu özel yöntem ile. (Bu aynı denetimi içeren bir işlev yazabilirsiniz, ama yine de bir kullanıcı oy çalışır her yerde bu işlevi çağırmak olurdu.)
  2. Bu yüksek trafikli senaryoda kabul edilemez olabilir ki, veri tabanında ek gerginlik ile sonuçlanır.

Bu noktaları göz önünde olan, benim tavsiyem ilk oy tablodaki yinelenen member_id değerlerden herhangi oluşumu kontrol etmek için bir komut dosyası çalıştırmak olacaktır, her durumda tüm ama kaldırmak ve sonra tabloya UNIQUE sınırlamasıyla ekleyin. Oradan size masa aynı member_id ile birden fazla satır var asla emin olabilirsiniz.

Sen masaya bir UNIQUE sınırlamasıyla ekleyebilirsiniz. Bu bir defalık bir işlemdir - Eğer tablo yapısı bir değişiklik olduğunu, bu script çalışan her zaman yapmak gerekmez. MySQL yönetim aracı (örn. phpMyAdmin, Navicat, HeidiSQL, ne-si-sen) Bu çalıştırın:

ALTER TABLE awards_2009_votes ADD UNIQUE (member_id);

INSERT (veya UPDATE) başarısız olacaktır - Bu değişiklikten sonra, aynı üye kimliği ile ikinci bir oylama eklemek mümkün olmayacaktır.

Burada avantaj onay veritabanında otomatik olarak yapılır, bu nedenle elle birden çok oy ekleyerek koduyla çiftleri veya 2) insanlar için kontrol) yaklaşık 1 endişelenmenize gerek kalmamasıdır.


@ middaparka diyor, sen INSERT IGNORE bir "yinelenen anahtar" hatayı önlemek için kullanmalısınız:

$sql_query = mysql_query("INSERT IGNORE INTO awards_2009_votes (`member_id`, `region`, `coach`, `official`, `volunteer`, `young_volunteer`) VALUES ('$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
if (mysql_insert_id()) {
    // row was inserted - vote added
} else {
    // row was not inserted - already voted
}

Ben senin tablo yapısı ne kodundan emin değilim, ama aşağıdaki tablo yapısını konu başına bir oy için kullanıcı oylama sınırlayacak:

Users table

user_id int unsigned not null auto_increment,
username varchar
// and other user info fields

Topics table

topic_id int unsigned not null auto_increment,
topic_title varchar
// and other topic info fields

Voting table

user_id,
topic_id,
vote_value,
primary key (user_id,topic_id) //this is the constraint that will allow only one vote

Aşağıdaki gibi kontrol ettim vermedi ama bu çalışması gerekir althouth Sen, birkaç satır yazabilirsiniz ...

$result=mysql_query("select count(*) count from awards_2009_votes where member_id='$memberid'");

$has_voted_array=mysql_fetch_array($result);
if($has_voted['count']!=0)
echo "You have already registered youur vote";
else
{
//do normal operation
$sql_query = mysql_query("INSERT INTO awards_2009_votes (id, member_id, region, coach, official, volunteer, young_volunteer) VALUES ('', '$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
}