2012-02-23 181 views
0

好吧,我試圖讓這個人可以投票選出「服務器」,每24小時,但目前,我被困在這裏:PHP/MySQL的:不插入到數據庫

function vote1() { 
    $pull = $_SERVER['REMOTE_ADDR']; 
    $votersIp = "select votersIp from voters"; 
    $usersIp = $_SERVER['REMOTE_ADDR']; 





    $fetch = mysql_query("SELECT * FROM voters WHERE votersIp = '".$_SERVER['REMOTE_ADDR']."'"); 



     while($rude = mysql_fetch_array($fetch)){ 

    if($rude[votersIp] != $pull) { 
    $zoot="INSERT INTO voters (votersIp, lastVoted) VALUES ('$usersIp', '0')"; 
    mysql_query($zoot) or die (mysql_error()); 
    echo 'Voters IP not in database'; //debugging 
    } 

    if($rude[votersIp] = $pull) { 
    echo 'found ip'; //debugging 
    } 

} 

所以,如果你說不出來,我試圖讓它每次有人投票時都會把它的IP地址添加到數據庫中。我知道我在這裏做了一些非常基本的錯誤,但我仍然在學習。

如果您可以發佈修復程序,但也解釋我做錯了什麼,並且任何建議都會很棒,我將不勝感激。

謝謝!

+0

發生了什麼? – 2012-02-23 01:23:56

+0

正確縮進代碼,刪除不必要的換行符並刪除未使用的變量。 – kba 2012-02-23 01:28:47

回答

4

有在你的代碼的幾個問題。

  1. 閉括號}缺失,無論是對while或爲function

  2. 我們並不需要遍歷所有的選民表,以找出是否一個IP是在數據庫或不。我們可以簡單地用一個WHERE子句中的SQL命令,就像這樣:SELECT votersIp FROM voters WHERE votersIp = $userIp

  3. 有很多奇怪的名字不必要的變量。

  4. 作爲一項安全措施,我們將用作SQL命令一部分的任何內容都應該轉義,以避免受到某些類型的攻擊。

  5. 當數組索引是字符串時,它們應該在引號之間。所以,$rude[votersIp]是錯誤的,而$rude['votersIp']是正確的。 (沒有引號,PHP將其解釋爲常量,而不是字符串。)

  6. $rude[votersIp] = $pull語句是一個變量賦值語句。您應該使用正確的運算符==來比較值:$rude[votersIp] == $pull

  7. 不良縮進使得代碼難以被我們,人類讀者理解。良好的縮進比較好。

  8. while循環賴以搜尋SEARCH_TERM_EXAMPLES特定IP查詢的結果完成。這意味着if裏面的第一個條件永遠不會是真的(一個不同的IP),因此永遠不會運行INSERT

這裏是一個改進版本:

function vote() 
{ 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $select = 'SELECT votersIp FROM voters WHERE votersIp = "' . mysql_real_escape_string($ip) . '"'; 
    $search = mysql_query($select); 
    $voter = mysql_fetch_array($search); 

    if (!empty($voter)) 
    { 
     echo 'found ip'; //debugging 
    } 
    else 
    { 
     echo 'Voters IP not in database'; //debugging 
     $insert = 'INSERT INTO voters (votersIp, lastVoted) VALUES ("' . mysql_real_escape_string($ip) . '", "0")'; 
     mysql_query($insert); 
    } 
} 

建議:你應該閱讀和學習有關編程初學者一本好書。由於我無法爲您推薦特定的書籍,因此我建議您要求提供圖書推薦。一本好書,學習如何編程,適合初學者。

+0

感謝您的固定版本,並感謝更多的告訴我什麼是錯的! – Hunt3r 2012-02-23 04:21:29

1

您沒有提到什麼實際去錯了,但你在這裏有一個問題:

if($rude[votersIp] = $pull) { 

在這裏,你要分配$rude[votersIp]$pull的值,而不是比較它的 - 它應該閱讀:

if($rude[votersIp] == $pull) { 
+0

還缺少quotesIp'引號,但如果沒有定義'votIp'常量,PHP會禮貌地將其視爲引用字符串。 – 2012-02-23 01:23:43

+0

我不知道這一點,因爲我從來沒有這樣寫他,但我不希望的情況下,說我錯了,哈哈 – BenOfTheNorth 2012-02-23 01:24:25

+1

其實,它不應該讀'如果($粗魯[votersIp] == $拉)「,但只是」其他「。 – kba 2012-02-23 01:50:58

3

你的邏輯需要改進 - 你做一個查詢來獲取帶有特定IP的所有記錄,然後遍歷這些結果,並插入一條記錄,如果你剛纔告訴數據庫爲你提取的非ip地址不在結果。

這就像進入一家餐廳,點了一份牛排,然後向服務員抱怨說,你被送達牛排(IP在數據庫中)。如果餐廳沒有牛排(IP沒有列出),那麼您的代碼什麼也不做,只是忽略了投票,因爲只有在數據庫中已經存在IP的情況下才會記錄IP。

你應該有這樣的事情:

$fetch = mysql_query("SELECT count(*) AS cnt FROM voters WHERE votersIp='{$_SERVER['REMOTE_ADDR']}'") or die(mysql_error()); 
$row = mysql_fetch_assoc($fetch); 
if ($row['cnt'] == 0) { 
    // ip is not in the database, allow the vote 
} else { 
    // ip is listed, no vote for you! 
} 
2

使用此:

function vote1() { 

    $mysqli=new mysqli("hostname", "username", "password", "database"); 

    //Check to see if voter is in DB 
    $stmt = $mysqli->prepare("SELECT id FROM voters WHERE votersIp = ?"); 
    $stmt->bind_param('s', $_SERVER['REMOTE_ADDR']); 
    $stmt->execute(); 
    $stmt->bind_result($rude); 
    $stmt->fetch(); 
    $stmt->close(); 

    //If not, add him to the DB 
    if($rude[votersIp] != $_SERVER['REMOTE_ADDR']) { 

     //The DateTime 
     $mySqlDateTime= date("Y-m-d H:i:s", $_SERVER['REQUEST_TIME']); 

     //Insert Into DB 
     $stmt = $mysqli->prepare("INSERT INTO voters (votersIp, lastVoted) VALUES (?, ?,)"); 
     $stmt->bind_param('ss', $_SERVER['REMOTE_ADDR'], $mySqlDateTime); 
     $stmt->execute(); 
     $stmt->close(); 

     echo "User Added"; 
    } 

    else{ echo "User Already Exhists"; } 
}