2009-12-27 4 views
1

Когда пользователь произносит голосование, скрипт обновляет мою базу данных, но он не отображает следующий код ниже, чтобы сообщить пользователю, что его голос был исключен.Проблемы с PHP и AJAX?

//This will output the movie id, new rating, new votes, and a message. 
echo "<result id='".$id."' rating='".$rating."' votes='".$votes."'>Vote cast and saved.</result>n"; 


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


Вот часть кода ниже, я думаю, что это проблема.

if(mysql_num_rows(mysql_query("SELECT * FROM `voters` WHERE `id`='".$id."' && `ip`='".$ip."'")) == 0) { 
    //This will insert the information about the user, so they can't vote for the same movie again. 
    mysql_query("INSERT INTO `voters`(`id`, `ip`) VALUES('".$id."', '".$ip."')"); 
    //This will add one more vote and add the rating to the total rating. 
    mysql_query("UPDATE `movies` SET `votes`=votes+1, `rating`=rating+".$vote_cast." WHERE `id`='".$id."'") or die(mysql_error()); 

    //This will retrieve the newly updated data about the movie. 
    $data = mysql_fetch_array(mysql_query("SELECT * FROM `movies` WHERE `id`='".$id."'")); 
    //This will get the average rating and round it to one decimal place. 
    $rating = round($data['rating']/$data['votes'], 1); 
    $votes = $data['votes']; 

    //This will change the output type to XML, instead of HTML. 
    header('Content-Type: text/xml'); 
    header('Pragma: no-cache'); 
    //Required header in valid XML files 
    echo '<?xml version="1.0" encoding="UTF-8"?>'."n"; 
    //This will output the movie id, new rating, new votes, and a message. 
    echo "<result id='".$id."' rating='".$rating."' votes='".$votes."'>Vote cast and saved.</result>n"; 
}else{ 
    ////This will change the output type to XML, instead of HTML. 
    header('Content-Type: text/xml'); 
    header('Pragma: no-cache'); 
    ////Required header in valid XML files 
    echo '<?xml version="1.0" encoding="UTF-8"?>'."n"; 
    //This message will be shown if they have already voted, 
    echo "<result id='".$id."' rating='-1' votes='-1'>You have already voted.</result>n"; 
} 

}


Хорошо, может быть, именно эта часть моего Ajax ниже код, который дает мне проблему.

function statechange_rate() { 
    if (http.readyState == 4) { 
     var xmlObj = http.responseXML; 
     var html = xmlObj.getElementsByTagName('result').item(0).firstChild.data; 
     var id = xmlObj.getElementsByTagName('result').item(0).getAttribute("id"); 
     var votes = xmlObj.getElementsByTagName('result').item(0).getAttribute("votes"); 
     var rating = xmlObj.getElementsByTagName('result').item(0).getAttribute("rating"); 
     //Before, you may have noticed we set votes="-1" if they had already voted, this was just to provide an easy way to check the return of our script. 
     if(votes != -1) { 
      //This will inform the user about the vote they have cast. 
      document.getElementsByName('output_' + id).item(0).innerHTML = "<br />" + html; 
      //This will set a delay to make that message go away in 5000 miliseconds (5 seconds). 
      window.setTimeout("document.getElementsByName('output_" + id + "').item(0).innerHTML = '';", 5000); 
      //This will update the rating on the page to the new one. 
      document.getElementsByName('rating_' + id).item(0).innerHTML = rating; 
      document.getElementsByName('votes_' + id).item(0).innerHTML = votes; 
     }else{ 
      document.getElementsByName('output_' + id).item(0).innerHTML = "<br />" + html; 
      window.setTimeout("document.getElementsByName('output_" + id + "').item(0).innerHTML = '';", 5000); 
     } 
    } 
} 
+1

@mAdCoDeR Ваш PHP, кажется, отправляет XML, но проблема, вероятно, связана с вашим вызовом ajax JavaScript на странице PHP. Можете ли вы отправить этот код? (Не забудьте упомянуть, если вы используете что-то вроде jQuery или Prototype) –

ответ

1

Я считаю, что ваша проблема заключается в том, что вы звоните data вместо что-то вроде textContent:

var html = xmlObj.getElementsByTagName('result').item(0).firstChild.textContent; 

Однако, просто чтобы проверить, что все остальное работает (если это не исправить) , сделать что-то вроде этого:

var html = "Sample content"; 

Таким образом, вы можете увидеть, если все ваши getElementsByName вызовы работают правильно.

Есть ли причина, по которой вы не используете библиотеку, такую ​​как jQuery, чтобы сделать ее более управляемой и кросс-браузерной?

jQuery делает некоторые вещи очень легкими, например, ваш вызов ajax может выглядеть примерно так (вместо new XMLHTTPRequest и других строк кода, которые идут с ним). id и vote произвольны и будут ссылаться в PHP, как $_POST['id'] и $_POST['vote']:

$.post('/path/to/file.php', {id: "1", vote:5 }, function(data){ 
    // Runs when ajax call successfully returns. data is the xml 
}, "xml"); 

И для выбора и обновления элементов (это будет заменить getElementsByName):

$("#output_" + id).html("<br />" + html); // Select by id 

Надежда, что помогает объяснить немного больше, почему вы, возможно, захотите использовать jQuery или подобную библиотеку, чтобы упростить ваш код ... и вашу жизнь.

+0

Насколько я понимаю, AJAX лучше, чем любой другой, и лучше с PHP может ошибаться? Я попробую ваш ответ и отправлю обратно с результатами. – mAdCoDeR

+0

@mAdCoDeR (Твое имя трудно напечатать;) Я не совсем понимаю ваш комментарий, но все, что я говорил, это использование jQuery (библиотека javascript), которая может действительно очистить ваш код и упростить его поддержку. –

+0

Хорошо, ваш ответ дал мне те же результаты, что и перед любыми другими решениями? Я хотел сказать, что я думал, что AJAX лучше, но я буду смотреть в JQuery. Постскриптумвырезать и вставлять всегда полезно :) – mAdCoDeR

Смежные вопросы