簡體   English   中英

PHP / MySQL:不插入數據庫

[英]PHP/MySQL: Not inserting into database

好吧,我正在努力做到這一點,以便有人可以每24小時為一個“服務器”投票,但是目前,我被困在這里:

    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地址添加到數據庫中。 我知道我在這里犯了一些非常基本的錯誤,但是我仍在學習。

如果您可以發布此修復程序,但也能解釋我做錯了,我將不勝感激,任何建議也都很好。

謝謝!

您的代碼中有幾個問題。

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

  2. 我們不需要遍歷所有的選民表來查找IP是否在數據庫中。 我們可以在SQL命令中簡單地使用WHERE子句,如下所示: 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循環是根據查詢特定IP的查詢結果完成的。 這意味着if里面的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);
    }
}

建議:您應該閱讀和學習有關初學者編程的好書。 由於我無法為您推薦一本書,因此建議您提出推薦書。 對於初學者來說,這是一本學習編程的好書。

您的邏輯需要改進-您進行查詢以獲取其中包含特定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!
}

用這個:

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"; }
}

您沒有提到實際出了什么問題,但是這里有一個問題:

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

在這里,您為$rude[votersIp]分配了$pull的值,而不是對其進行比較-它應顯示為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM