2009-12-11 2 views
-1

Я нашел этот скрипт на about.com, о котором я пытаюсь узнать, о том, как создать рейтинговую систему, но сценарий по какой-то причине не будет считать голосование при щелчке ссылки и просто перезагружает страницу.Проблема с подсчетом голосов PHP и MySQL?

Мне было интересно, как я могу исправить эту проблему? И какую часть кода мне нужно изменить и где?

Вот полный сценарий ниже.

<?php 
// Connects to your Database 
mysql_connect("localhost", "root", "", "sitename") or die(mysql_error()); 
mysql_select_db("sitename") or die(mysql_error()); 

//We only run this code if the user has just clicked a voting link 
if ($mode=="vote") { 

    //If the user has already voted on the particular thing, we do not allow them to vote again $cookie = "Mysite$id"; 
    if(isset($_COOKIE[$cookie])) { 
    echo "Sorry You have already ranked that site <p>"; 
    } else { 
     //Otherwise, we set a cooking telling us they have now voted 
    $month = 2592000 + time(); 
    setcookie(Mysite.$id, Voted, $month); 

    //Then we update the voting information by adding 1 to the total votes and adding their vote (1,2,3,etc) to the total rating 
    mysql_query ("UPDATE vote SET total = total+$voted, votes = votes+1 WHERE id = $id"); 
    echo "Your vote has been cast <p>"; 
    } 
} 

//Puts SQL Data into an array 
$data = mysql_query("SELECT * FROM vote") or die(mysql_error()); 

//Now we loop through all the data 
while($ratings = mysql_fetch_array($data)) { 

    //This outputs the sites name 
    echo "Name: " .$ratings['name']."<br>"; 

    //This calculates the sites ranking and then outputs it - rounded to 1 decimal 
    if($ratings['total'] > 0 && $ratings['votes'] > 0) { 
    $current = $ratings['total']/$ratings['votes']; 
    } else { 
    $current = 0; 
    } 

    echo "Current Rating: " . round($current, 1) . "<br>"; 

    //This creates 5 links to vote a 1, 2, 3, 4, or 5 rating for each particular item 
    echo "Rank Me: "; 
    echo "<a href=?mode=vote&voted=1&id=".$ratings['id'].">Vote 1</a> | "; 
    echo "<a href=?mode=vote&voted=2&id=".$ratings['id'].">Vote 2</a> | "; 
    echo "<a href=?mode=vote&voted=3&id=".$ratings['id'].">Vote 3</a> | "; 
    echo "<a href=?mode=vote&voted=4&id=".$ratings['id'].">Vote 4</a> | "; 
    echo "<a href=?mode=vote&voted=5&id=".$ratings['id'].">Vote 5</a><p>"; 
} 
?> 
+0

Вы получаете голос вниз за злоупотребление этого сайта, вы уже вставили этот код один раз, за ​​час до вы создали этот вопрос. Если вы хотите изменить некоторые детали своего вопроса, отредактируйте исходный вопрос, НЕ спрашивайте нового, вы просто повторяетесь. – TravisO

ответ

3

$mode никогда не установлен? Хотя это, возможно, работал, если register globals был включен, он не включен по умолчанию любой более (и снимается в более поздних версиях PHP)

//We only run this code if the user has just clicked a voting link 
if ($mode=="vote") { 

Может быть, вы имеете в виду

if ($_GET['mode']=="vote") { 

То же самое касается $id и $voted, которые также никогда не устанавливаются.

EDIT
Я также хотел бы добавить, что если бы я пошел и изменил удостоверение личности к 1';DROP TABLE vote; Вы бы целую много потерянных данных. Посмотрите на SQL Injection

EDIT
Если строка в таблице не существует, то вам нужно, чтобы вставить его, прежде чем вы можете обновить его.

+0

Это не будет работать. – PeAk

+1

Просьба пояснить, почему? – Yacoby

+0

Он не засчитает голоса. Он просто говорит, что ваш голос был брошен. – PeAk

-2

Я также могу видеть, что $ cookie никогда не устанавливается, глядя на код, который должен быть 'Mysite'. $ id. Я добавил кавычки для строки, хотя PHP будет обрабатывать любой неуказанный текст как строку, но избегать непонимания и ошибок позже, это всегда хорошая идея.

Кроме того, этот сценарий предполагает вариант PHP register_globals включен, вам нужно сделать, что register_globals = ON в вашем php.ini

+3

НИКОГДА НИКОГДА НИКОГДА НЕ включайте register_globals, кто-то должен забрать ваш сервер, даже предлагая это. – TravisO