Ik heb een vote systeem gemaakt, maar er word wel eens gespamd (elke aflevering hetzelfde cijfer geven) Dat probeer ik tegen te gaan, maar ook moet de "schade" oplossen. Ik weet alleen niet hoe ik dat het beste kan doen.
Nu heb ik twee tabellen met rijen:
lv_episodes
ep_id
rating
num_votes
rate
lv_voted_ip
id
ep_id
rate
ip
Deze code gebruik ik om de valse stemmen (die ik aangevinkt heb) te verwijderen uit lv_voted_ip
$id = $_GET['id'];
if($_SERVER['REQUEST_METHOD'] == "POST")
{
// Bestaat het id veld in de POST data?
if (isset($_POST['id']))
{
foreach($_POST['id'] as $iID)
{
$sWhere = implode(',',$_POST['id']);
$sQuery = "DELETE FROM lv_voted_ep WHERE id IN(".$sWhere.")";
if (!mysql_query($sQuery))
{
echo 'Query failed:'.$sQuery.'<BR>'.mysql_error();
}
}
}
else
{
echo "No votes selected";
}
echo "You've successfully deleted the selected votes";
}
else
{
$sql2 = "SELECT id,ep_id,rate,ip FROM lv_voted_ip ORDER BY ip,ep_id ASC";
//sql code om de gegevens op te halen
$query2 = mysql_query($sql2);
//sql code uitvoeren
$count = mysql_num_rows($query2);
if ($count !== 0){
echo "<table width=\"100%\">\n";
echo "<form action='rating.php?a=show' method='post'>\n";
while($aRow = mysql_fetch_assoc($query2))
{
echo "<tr>\n<td width='10%'><input type='checkbox' name='id[]' value='".$aRow['id']."'/>\n</td><td>".$aRow['ip']."</td><td width='10%'>".$aRow['rate']."</td>\n</tr>\n";
}
echo "<tr>\n<td> </td>\n<td>\n<input type='submit' name='delete' value=' Delete Checked Votes '>\n</td>\n</tr>\n</form>\n</table>";
}
echo "No votes available<br />";
}
Maar de stem moet ook uit lv_episodes verwijderd worden.
Dus dit moet gebeuren per verwijderde stem: rating(lv_episodes) - rate(lv_voted) = nieuwe rating num_votes(lv_episodes) - 1 = nieuwe num_votes
nieuwe rating/nieuw num_votes = rate(lv_episodes)
Weet iemand hoe ik dat makkelijk in de bovenstaande code kan toevoegen?
Voordat je de stem verwijderd uit tabel lv_voted_ip (of lv_voted_ep ?) moet je eerst de huidige waarde van het veld rate vastleggen.
Daarna kun je de stem verwijderen.
Direct na het verwijderen van de stem de tabel lv_episodes bijwerken met een UPDATE-query.
<?php
$id = $_POST['id'];
$query = "UPDATE lv_episodes SET
rating = rating - $rate,
num_votes = num_votes-1,
rate = rating/num_votes
WHERE ep_id = $id";
// aanname: ep_id is de relatie tussen de tabellen
?>
Misschien moet je de regel 'rate = rating/num_votes' nog veranderen in:
rate = rating-$rate/num_votes-1
zoiets had ik ook bedacht, maar ik zat met het probleem dat als ik meerdere "votes" aanvink om te verwijderen, dan is de id als volgd: 1,2,3 als ik de votes met id 1, 2 en 3 aanvink. Die moeten dan allemaal geupdate worden. Volgens mij kan deze code dat niet, of toch wel?
Je hebt me erg opweg geholpen, bedankt.
Ik ben bezig gegaan, maar heb nog een probleem. lv_episodes wel wordt geupdate, maar helaas wordt de waarde uit lv_voted_ip geupdate naar -1. Ik doe dit, omdat degene die heeft gestemd dan niet nog eens "vals" kan stemmen.
De code die ik veranderd heb:
$id = $_GET['id'];
if($_SERVER['REQUEST_METHOD'] == "POST")
{
// Bestaat het id veld in de POST data?
if (isset($_POST['id']))
{
foreach($_POST['id'] as $iID)
{
$sql_rate = "SELECT ep_id,rate FROM lv_voted_ip WHERE id='".$iID."'";
$result = mysql_query($sql_rate);
while ($row = mysql_fetch_assoc($result)) {
mysql_query("UPDATE `lv_episodes` SET `rating` = (`rating` - ".$row['rate']."), num_votes = (num_votes-1), `rate` = (`rating`/`num_votes`) WHERE ep_id = ".$row['ep_id']."");
}
$sWhere = implode(',',$_POST['id']);
mysql_query("UPDATE `lv_voted_ep` SET `rate` = -1 WHERE id IN(".$sWhere.")");
mysql_error();
echo"<br />";
}
}
else
{
echo "No votes selected";
}
echo "You've successfully deleted the selected votes";
}
Ik begrijp nu even niet goed wat het probleem danwel de bedoeling is.
Je verwijderd nu geen records meer uit de database, alleen wat updates.
Wat wil je precies bereiken of werkt het nu naar wens?
In lv_episodes moet dit gebeuren:
UPDATE rating, num_votes en rate (bij het juiste ep_id) Dit werkt naar behoren
In lv_voted_ip moet dit gebeuren:
UPDATE rate naar -1 (bij de id's die in de POST zitten) Dit werkt niet
EDIT:
Ik zie net dat ik zelf een domme fout gemaakt heb, ik had "lv_voted_ep" gebruikt i.p.v. "lv_voted_ip". Nu werkt het dus allebei. Het enige wat ik nog graag verbeterd wil hebben is: dat de rate uit lv_episodes afgerond word op 2 cijfers, hoe kan ik dat doen?
Maar dat werkte niet helemaal.
Moet ik nu eerst gewoon met een query de oude info ophalen.
Dan met php gaan rekenen en die nieuwe variabelen dan in de database zetten of is er een betere oplossing?