2016-01-04 235 views
0

我目前正在一個有2個鏈接的網站上工作。 Upvote & downvote。 投票存儲在mysql中,在一個名爲「數據」,列「是」和「否」的表中PHP Mysql IF語句

我已經成功創建了一個查詢來更新yes或no的計數,然後將值這一頁。但是,目前用戶可以通過垃圾郵件點擊按鈕,計數將繼續增加。

我已經開始使用$ ip = $ _SERVER ['REMOTE_ADDR']記錄IP地址; &把它們放在名爲「ips」的表格中,並添加了「ipaddresses」列。

現在,我想改變我的代碼,以便它會查詢MySQL和檢查「IPS」表$ IP,如果返回true,則死亡();否則,如果...執行upvote查詢。這將使得一個人只能爲每個IP投票一次。

這裏是我當前的代碼:

<?php 
if ($_GET['vote']=="yes") { 
    // Connection to database 
    $connection=mysqli_connect("hostname-here","username-here","password-here","database-here"); 
    // Check connection 
    if (mysqli_connect_errno()) 
    { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 
    mysqli_query($connection,"UPDATE data SET yes = (yes + 1) WHERE ID = $_GET[id];"); 
    mysqli_close($connection); 

    echo "Voted.";  
} 
?> 

幫助,將不勝感激,我GOOGLE了很多,無法找到任何工作。謝謝!

+1

[你的腳本是在對SQL注入攻擊的風險。(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) –

+0

爲什麼不只用會話/令牌來做?當然不得不設置另一張桌子。並可能添加一個JS按鈕來提交一次。使用IP地址不是非常有效。 –

+0

我不關心SQLi。它是本地主機,不會去任何地方。我對會話/令牌沒有經驗,我只想爲此做一個簡單的修復。沒有其他的。 –

回答

1

如果某人已投票,您不應該將IP作爲決定性因素。多個用戶可以來自同一個IP。

如果你想這樣做,你應該創建一個新表。我們稱之爲「user_action」。該表應該有一個名爲IP的列,另一個名爲VOTE。您必須記錄每個單獨的用戶操作,並在更新「數據」表之前檢查IP。

編輯:一些僞代碼,以幫助您更多。

創建表:

CREATE TABLE user_action (IP varchar(39), VOTE tinyint(1)); 

簡單的PHP邏輯。只是實際的MySQL命令填寫(你顯然已經知道如何從OP做到這一點)

$sSql = "SELECT vote FROM user_action WHERE IP = '" . $_SERVER['REMOTE_ADDR'] ."'"; 

    If (rowcount > 1) { 
     //User already voted, update their answer. 
     $sSql = "UPDATE user_action SET vote = " .$_GET['vote']. " WHERE IP = '" . $_SERVER['REMOTE_ADDR'] ."'"; 
    } 
    Else { 
     //User hasn't voted, insert their answer 
     $sSql = "INSERT INTO user_action (vote, ip) VALUES(" .$_GET['vote']. ", '" . $_SERVER['REMOTE_ADDR'] ."'"; 
    } 

如果你想告訴你有多少upvotes有:

$sSql = "SELECT sum(vote) FROM user_action WHERE vote = 1"; 
+0

這幾乎是說我已經知道。我知道我想創建另一個表並運行一個查詢來檢查一行是否存在,如果它確實會死,如果它不存在,則繼續。我只是想弄清楚如何寫這個,因爲我到目前爲止已經嘗試了很多東西,而沒有工作。 –

+0

@markjennings增加了一點,以幫助澄清。 –

0

在這裏你去:

<?php 

if ($_GET['vote']=="yes") { 
    // Connection to database 
    $connection=mysqli_connect("fdb13.your-hosting.net","1789869_gow","niggers1","1789869_gow"); 
    // Check connection 
    if (mysqli_connect_errno()) 
     { 
      die("Failed to connect to MySQL: " . mysqli_connect_error()); 
     } 

    // Check if they've already voted 

    $result = mysqli_query($connection, "SELECT COUNT(*) AS already_voted FROM ips WHERE ip = '{$_SERVER['REMOTE_ADDR']}'") or die("Failed to query ips: " . mysqli_error()); 
    $row = mysqli_fetch_assoc($result); 
    if ($row['already_voted']) { 
     die("You already voted"); 
    } 

    // Increasing the current value with 1 
    mysqli_query($connection,"UPDATE girlsdata SET yes = (yes + 1) WHERE ID = $_GET[id];") or die("Failed to add vote: " . mysqli_error()); 
    mysqli_close($connection); 

    echo "PHP successfully executed. Edit this out later.";  
} 
?> 
+0

是的,但我希望它執行我的upvoting查詢,如果它不返回一個條目。你能把它放進我的完整代碼嗎? –

+0

投票代碼緊隨其後。 – Barmar

+0

你不需要'else',因爲'die'結束腳本。如果它離開了'if',則條件必須是錯誤的。 – Barmar