2010-01-03 3 views
0

이이 질문의 연속입니다 : 내가 처음 등록되지 않은 사용자로 질문을 게시하고 나중에 등록, 그래서 수정하거나 원래의 질문에 추가 할 수 없습니다 Move div based on user voting이 PHP/자바 스크립트 투표 코드에 대한 약간의 도움을받을 수 있습니까?

...

저스틴 존슨 (Justin Johnson)은 코드에 대해 정말로 도움이되었지만 여전히 vote.php 페이지를 통합하는 방법을 파악하는 데 문제가 있습니다.

여기에서 질문을 다시 실행하는 대신, 누군가가 이것을보고, 위의 질문을 봅니다. (나는 "답변을 더 내려 놓습니다"에서 1을 더했습니다.) 1) 문제를 해결하고 2) 저스틴의 작품 - 등록 할 일 때문에 더 이상 할 수 없기 때문에 ...

감사! 조엘

+0

이메일 다시 질문을 얻을 수있는 SO 팀 (SO 닷컴에서 팀). – cletus

+0

고마워 Cletus ... 두 계정을 병합하기 위해 몇 시간 전에 했어 ...하지만 아직 작동하지 않는이 스크립트가 붙어 있습니다. (참기 힘들어, 알아 .-D – Joel

답변

1

MySQL은 :

CREATE TABLE song (
    song_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    vote INT NOT NULL DEFAULT 0, 
    PRIMARY KEY(song_id) 
); 

자바 스크립트 :

$(function() { 
    var listContainer = $("#daily-songs"), 
     songs   = []; 
    var songSort = function(a, b) { 
     return +b.vote.text() - +a.vote.text(); 
    }; 

    var submitVote = function(song, delta) { 
     $.post("vote.php", 
      { 
       id: song.node.attr("id").match(/\d+$/)[0], 
       delta: delta, 
      }, 
      function(data) { 
       if (data != 'success') { alert(data); } 
      } 
     ); 

     $.each(songs.sort(songSort), function() { 
      listContainer.append(this.node); 
     }); 
    }; 

    listContainer.find("li").each(function() { 
     var $this = $(this); 
     var song = { 
      node: $this, 
      vote: $this.find(".votes") 
     }; 
     $this.find(".vote-up").click(function() { 
      submitVote(song, 1); 
     }); 
     $this.find(".vote-down").click(function() { 
      submitVote(song, -1); 
     }); 

     songs.push(song); 
    }); 
}); 

PHP :

<?php 

$song_id = !empty($_POST['id']) ? (int)$_POST['id'] : 0; 
$delta = !empty($_POST['delta']) ? (int)$_POST['delta'] : 0; 

if (!$song_id || !$delta || !is_int($song_id) || !is_int($delta)) { 
    die("Invalid parameters"); 
} 

// Make sure the voting value is within the valid range. 
if ($delta != -1 && $delta != 1) { 
    exit("Invalid delta"); 
} 


// Check to see if user has already voted for this song 
session_start(); 
if (isset($_SESSION['voted'])) { 
    exit("You already voted!"); 
} 

// If they haven't voted yet, connect to the database 
// YOU NEED TO CHANGE THIS INFOMATION TO WHATEVER APPLYS TO YOU. 
$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 

try { 
    $dbh = new PDO($dsn, $user, $password); 
} 
catch (PDOException $e) { 
    exit('Connection failed: ' . $e->getMessage()); 
} 


// If the database connection is succesful, update song entry 
// UPDATE daily_song SET votes=votes+$delta WHERE daily_song_id=$songId 
$sth = $dbh->prepare('UPDATE song SET votes = votes + :delta WHERE song_id = :song_id'); 
$sth->bindParam(':delta', $delta); 
$sth->bindParam(':song_id', $song_id); 
if (!$sth->execute()) { 
    exit("Unable to update votes"); 
} 

exit("success"); 
+0

Dmitri에게 감사드립니다. 나를 위해 명확히 해 주시겠습니까? : 첫 번째 질문에서 제안한 데이터베이스를 이미 만들었습니다 ... 대신에 사용할 데이터베이스를 만들 수 있습니까? 어떤 값을 변경해야합니까? 감사합니다. – Joel

+0

기본적으로 열을 제거하고 이름을 변경했습니다. 당신이 원한다면 그것들을 완전히 지킬 수 있습니다. 그렇다면 $ dbh-> prepare 문을 다음과 같이 변경하십시오 : $ sth = $ dbh-> prepare ('UPDATE daily_song SET = votes + : delta WHERE daily_song_id = : song_id '); 그리고 데이터베이스에 아무런 변화가 없어야합니다. – dmitrig01

+0

Dmitri에게 감사드립니다. 아직 오류가 발생하고 있습니다. 여기에서 경험하십시오. 나는 내 계정이 합쳐 지도록 관리 했으므로 한 페이지에 모든 것을 보관할 수 있도록이 질문을 닫을 것입니다. – Joel