2012-05-07 41 views
6

Tôi có một ứng dụng đơn giản cho phép người dùng gửi 'các vấn đề' và sau đó nhận xét về chúng. Tôi đang cố gắng thực hiện một hệ thống bỏ phiếu đơn giản để người dùng có thể 'bỏ phiếu' các vấn đề mà lần lượt sẽ đẩy họ lên một danh sách cao hơn. Tôi có một số kiến ​​thức cơ bản về PHP và tất cả mọi thứ cho đến nay là làm việc, tôi chỉ không thể tìm ra cách để có được điều này để làm việc.Hệ thống bỏ phiếu PHP đơn giản

Tôi đã theo một hướng dẫn trực tuyến và cho đến nay có điều này trên trang problem.php tôi ...

if (isset($_GET['vote'], $_GET['id'])){ 
     add_problem_vote($_GET['id]'], $_GET['vote']); 
    } 

<a href="?vote=up&amp;id=<?php echo $problemID; ?>">Vote</a> 

Và trên trang functions.php của tôi ...

function add_problem_vote($problemID, $vote){ 

    $problemID = (int)$problemID; 

    $vote = ($vote === 'up') ? '+' : '-'; 

    $sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}"; 

    mysql_query($sql); 
} 

Tất cả các trường bảng của tôi chắc chắn được đặt tên chính xác. Tôi biết có rất nhiều điều cần xem xét như tái biểu quyết sau khi phiên họp đã kết thúc nhưng miễn là tôi đã cho thấy ý tưởng nó không phải là hoàn hảo. Vào phút khi liên kết được nhấp vào nó chuyển hướng đến một trang nhưng phiếu bầu không thay đổi trong bảng mysql.

+0

việc kiểm tra này http://stackoverflow.com/questions/490969/stack-overflow-reddit-voting-system-in-php – nu6A

+0

Nếu đó là trang problem.php toàn bộ của bạn, bạn đang bỏ lỡ '' thẻ xung quanh mệnh đề if của bạn. –

+0

Bạn gặp phải loại lỗi nào? –

Trả lời

0

Điều đó không hoạt động theo cách này vì bạn chưa thiết lập kết nối MYSQL cho cơ sở dữ liệu của mình, tôi đoán vậy.

Đối với dự án PHP của tôi, tôi (lại) sử dụng một lớp Tôi đã từng viết mọi lúc, gói tất cả các chức năng này, với xử lý lỗi thích hợp, vv

Có lẽ bạn nên suy nghĩ về một cái gì đó như thế này, hoặc bạn có ít nhất cần phải thêm mysql_connect trước khi thực hiện truy vấn.

Hy vọng điều đó sẽ hữu ích.

+1

Ông không bao gồm một phần của mã vì nó rõ ràng ... –

+0

Xin lỗi vì đã mơ hồ. Đây chỉ là một phần của mã, tất cả mọi thứ hoạt động khác hơn này. Tôi đã thực hiện một kết nối (tất cả các dữ liệu trên trang là đến từ một cơ sở dữ liệu mysql) và tất cả mọi thứ hoạt động khác với những dòng đầu vào gần đây của mã. – GuerillaRadio

0

thử điều này:

"UPDATE `problems` SET `votes` = `votes` ".mysql_real_escape_string($vote)." 1 WHERE `id` = ".mysql_real_escape_string($problem_id); 
+0

Không làm việc tôi sợ. Làm cách nào để kiểm tra chức năng thực sự đang chạy khi liên kết được nhấp? – GuerillaRadio

0

Không hoàn toàn chắc chắn về điều này ở tất cả nhưng:

$problemID = (int)$problemID; 

nó nên là:

$problemID = intval($problemID); 

Bất cứ khi nào một cái gì đó ngừng hoạt động Tôi luôn luôn thêm một

echo $sql; 

Trước khi gọi mysql_query(); theo cách đó tôi có thể sao chép và dán kết quả vào một trình duyệt SQL và xem nó có đúng không.

EDIT: Đã nhìn nhau và như một số một trước đây đã thoát khỏi câu lệnh SQL Tôi nghĩ nó có thể là đáng nói thử:

$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}"; 

Để:

$sql = "UPDATE `problems` SET `votes` = `votes` {".$vote."} 1 WHERE `id` = {$problem_id}"; 

nhưng nếu tất cả các SQL đang làm là đi lên rồi tại sao không thử:

$sql = "UPDATE `problems` SET `votes` = `votes`+1 WHERE `id` = {$problem_id}"; 

vì đó chính xác là những gì bạn đang làm Không cần thông số bỏ phiếu $.

tùy chọn dễ dàng gỡ lỗi khác là:

print_r($_POST); // to show all the POSTED variables from a form 
print_r($_GET); // to show all the parameters from the URL 

BBloke

1
$sql = "UPDATE `problems` SET `votes` = `votes` ".$vote." 1 WHERE `id` = ".$problem_id; 
mysql_query($sql) or die(mysql_error()); 

Kiểm tra những gì lỗi bạn đang nhận được?

0

Đầu tiên truy vấn đó là không đúng

$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}"; 

Correction

$sql = "update `problems` set `votes` = '$vote' where `id` = '$problem_id'"; 

tôi sẽ đề nghị một cách khác. Hãy bỏ phiếu với những cột này: - người dùng (id của người dùng) - câu hỏi (id của điều cần được bỏ phiếu) - bỏ phiếu (hoặc một số (ví dụ: 0 đến 4) hoặc tùy chọn (a, b, c ...))

chính key = người dùng, câu hỏi

bây giờ bạn có thể chèn easilly/cập nhật các phiếu

mysql_query("replace into votes values ($userid, $question, $vote)"); 

DONE! và bạn có thể easilly nhận được avg (nếu bạn đã chọn lựa bỏ phiếu là một số) hoặc số phiếu bầu (nếu bạn có lựa chọn lựa chọn)!

+0

Đây không phải là giải pháp tốt và tùy thuộc vào điều kiện chủng tộc và sẽ mất phiếu nếu trang web bận. –

+0

Vâng, nếu bạn muốn nó làm việc với các điều kiện chủng tộc, bạn có thể sử dụng rowversion $ sql = "cập nhật' vấn đề' đặt 'phiếu' = '$ bỏ phiếu', rowversion = $ rowversion + 1 trong đó' id' = '$ problem_id' và rowversion = $ rowversion "; sau đó bạn có thể kiểm tra các hàng bị ảnh hưởng ... –

+0

Hoặc chỉ 'cập nhật vấn đề đặt phiếu = (phiếu + 1) trong đó id = '$ problem_id'' và không lo lắng về việc kiểm tra hàng bị ảnh hưởng và cố gắng đăng ký lại phiếu bầu, v.v. sẽ luôn hoạt động. –

0

Tôi xin lỗi vì tiếng anh xấu của tôi. Tôi hy vọng bạn sẽ hiểu nó :) Vì vậy, đầu tiên là sử dụng tốt hơn mysqli hoặc pdo. Và nếu bạn tạo bảng mới để bỏ phiếu, bạn sẽ có thêm tùy chọn để làm trong tương lai (tham gia xếp hạng với người dùng, xếp hạng người dùng cụ thể trung bình, xác minh xem người dùng đã bỏ phiếu trước hay chưa ...)

Cảm hứng làm: tài khoản bên (cho gửi sử dụng jquery - ajax):

<a href="IDOFPROBLEM" title="VoteUp" class="voteUp">VoteUp</a> 
    <script> 
     $(document).ready(function() { 
      $(".voteUp").click(function(e) { 
       e.preventDefault(); 

       var id = $(this).attr("href"); 

       $.ajax({ 
        type: "POST", 
        //This is destination of php script 
        url: "YOURVOTEUPFILE.php?vote=up", 
        data: {id: id} 
       }) 
         .done(function(msg) { 
        //msg contains data from php script so you can show message to user good or bad :) 
        alert(msg); 
       }); 
      }); 
     }); 
    </script> 

server side:

final class manageVote { 

    /** 
    * Id of problem 
    * @var int|string 
    */ 
    private $voteFor; 
    /** 
    * Id of user 
    * @var int|string 
    */ 
    private $whoVote; 

    /** 
    * Mysqli 
    * @var \mysqli 
    */ 
    private $database; 

    /** 
    * Construct - initialize variable 
    * @param int|string $voteFor 
    * @param int|string $whoVote 
    * @param \mysqli $db 
    */ 
    public function __construct($voteFor, $whoVote, &$db) { 

     $this->voteFor = $voteFor; 
     $this->whoVote = $whoVote; 
     $this->database = $db; 
    } 

    /** 
    * Try to make vote 
    * @param string $upOrDown "up" or "down" 
    * @return boolean 
    */ 
    public function vote($upOrDown) { 
     if (!$this->verifyIfUserCannote() || ($upOrDown != "up" && $upOrDown != "down")) 
      return false; 
     //Change database name to your name 
     //Better solution is sql table for all ranks 
     //And you need "whoVote" because I think one problem - one vote for one user 
     /* 
     * Table could be: 
     * idvote PK NN AI 
     * vote INT NN 
     * idproblems FK NN 
     * whoVote FK NN 
     */ 
     $sql = "INSERT INTO `DATABASENAME`.`problems` (`idproblems`, `vote`, `whoVote`) VALUES('" . $this->voteFor . "', '" . 
       ($upOrDown == "up" ? 1 : -1) . "', '" . $this->whoVote . "')"; 
     $query = $this->database->query($sql); 
     if (!$query) 
      return false; 
     return true; 
    } 


    private function verifyIfUserCannote() { 
     $sql = "SELECT COUNT(*) AS 'cnt' FROM `DATABASENAME`.`problems` WHERE `idproblems` = '" . $this->voteFor . "' AND `whoVote` = '" . $this->whoVote . "'"; 

     $query = $this->database->query($sql); 

     if (!$query) 
      return false; 

     $result = mysqli_fetch_array($query); 

     return ($result["cnt"] == 0 ? true : false); 
    } 

} 

if (isset($_GET["vote"])) { 
    $voteClass = new manageVote($_POST["id"], $someYourIdentificatorWhoVote, $mysqliDatabaseReference); 

    echo ($voteClass->vote($_GET["vote"]) == true ? "TRUE" : "FALSE"); 
} 
else 
    echo "FALSE"; 

đối với cấp bậc thức sử dụng phiếu lệnh SQL SELECT SUM (vote) TỪ .... ... GROUP BY idProblems

0

Nếu bạn muốn đi về với giải pháp đầu tiên bạn truy vấn nên là:

$sql = "update `problems` set `votes` = `votes` + 1 where `id` = '$problem_id'"; 
0

Vui lòng kiểm tra sau cho các lỗi

  • Bao gồm các functions.php trong problem.php
  • Sử dụng mysqli_query ($ sql) insted của mysql_query ($ sql) .Bởi vì nó không được chấp nhận.Bạn có thể sử dụng PDO cũng
  • Sử dụng chức năng die (mysqli_error ($ connection_varible)) để theo dõi lỗi sql.
0

Sử dụng 'Và' giữa cả hai dữ liệu trong hàm được đặt hoặc đơn giản là một trong các dữ liệu có thể được sử dụng cho hàm được đặt.

if (isset($_GET['vote'] && $_GET['id'])){ 
       add_problem_vote($_GET['id]'], $_GET['vote']); 
      } 

     <a href="?vote=up&amp;id=<?php echo $problemID; ?>">Vote</a> 



    function add_problem_vote($problem_id,$vote) 
{ 
$query_select="select votes from problems where id='".$problem_id."'"; 
$query_run=mysql_query($query_select); 
if(mysql_num_rows($query_run)>0) 
{ 
$vote_num=mysql_result($query_run,0,votes) 
if($vote==up) 
$vote_num=+$vote_num; 
else 
$vote_num=-$vote_num 
} 
$sql = "UPDATE `problems` SET `votes` = '$vote_num' WHERE `id` = '".$problem_id.'""; 

    mysql_query($sql); 

} 
+0

Ví dụ mã của bạn có đầy đủ các lỗi. –

+0

vui lòng chỉ định lỗi để tôi cải thiện chương trình của mình. Mỗi lập trình viên giải quyết một vấn đề với cách riêng của mình, tôi đã sử dụng các cose đơn giản dễ hiểu nhưng nếu họ có lỗi hơn tôi muốn biết những nơi mà lỗi thoát, –

Các vấn đề liên quan