2017-03-20 7 views
0

で私は、IPは、データベース内の画像を投票できる回数を制限しようとしていますが、私は私の二つのテーブル評価スクリプト制限投票IP

T1(定格)

の問題

概要を持っています

id   votes  rating  category  rating 
----------- ---------- ----------- ----------- ----------- 

T2(rating_users)

user_id  user_ip  user_vote user_source 
----------- ---------- ----------- ----------- 

表1 - > ID は、ARを有します 表2に高揚感 - > USER_SOURCE

私は過去2日間非常に多くの異なるクエリを試してみましたが、私はちょうどこれを行う方法を見つけ出すことはできません:(

今私はこのクエリを使用します。

select * 
from rating 
left join rating_users on rating_users.user_source = rating.id 
where rating_users.user_ip is null 
    or rating_users.user_ip != $ip 
order by RAND() LIMIT 1 

は、データの5行を持っているTABLE1とさせて頂きます。..

IP1は、ウェブサイトおよび表2に入った場合は空である(truncatet)、そして彼は、すべての5枚の画像を投票し、「第6」の画像は何もできなくなりますまさに私が欲しいものです...

しかし、IP2が入り、表2は、まだ文字通り行のどれもが「NULL」ではないので、彼が望んでいるほど多くを投票することができIP2その後、IP1からの票を持っている場合...

私は本当に私が持ってここに失われたのです土曜日/日曜日の夜以来、この問題を解決しようとした。..

誰かが私を助けてください、私はここで白髪の多くを取得しています:(

EDITを自分のコード - >

Forside.php(index.phpを)

このうち
<?php 
$dbCon = dbCon(); 

$sql = "SELECT * FROM rating ORDER BY id DESC LIMIT 1"; 
$result = $dbCon->query($sql); 
$result = $result->fetch_object(); 

$id = $result->id; 

//$tal = ip2long($_SERVER['REMOTE_ADDR']); 
//$tal = long2ip($_SERVER['REMOTE_ADDR']); 
$ip = ip2long($_SERVER['REMOTE_ADDR']); 

// CHECKKER OM DEN IP HAR VOTET DETTE BILLEDE 
$sql = "SELECT user_ip, user_source, user_vote FROM rating_users WHERE user_ip = $ip AND user_source = $id"; 
$result = $dbCon->query($sql); 
$result = $result->fetch_object(); 
$rating = $result->user_vote; 


if (!empty($result)) { 
// echo 'Du har allerede votet dette billede : ' . $rating . "/5"; 
    //IMGINFO 
    $string = "<div class=\"flex absolute centerAm borc1 boxsb\">"; 
    $string = $string .= "<div id=\"innerVotingWrapper\" class=\"innerVotingWrapper relative flex \">"; 

    $string = $string .= "<div id=\"imgInfo\" class=\"imgInfo absolute top0 right0\">"; 
    $string = $string .= "<div id=\"imgRefresh\">"; 
    $string = $string .= "</div>"; 
    $string = $string .= "</div>"; 

    $string = $string .= "<div class=\"imageWrapper mauto relative fadeInClass\">"; 
    $string = $string .= "<img id=\"imgSrc\" src=\"assets/img/$id.png\" class=\"babeImg borb2 boxsb\">"; 
    $string = $string .= "<div id=\"starWrapper\" class=\"flex absolute left0 bot0 mar10\">"; 

    for ($i = 1; $i <= $rating; $i++) { 
     $string = $string .= "<div class='voteFull'></div>"; 
    } 
    for ($i = $rating; $i < 5; $i++) { 
     $string = $string .= "<div class='voteEmpty'></div>"; 
    } 
    $string = $string .= "</div>"; //STAR WRAPPER 
    $string = $string .= "</div>"; //IMAGE WRAPPER 
    $string = $string .= "</div>";//INNER WRAPPER 
    $string = $string .= "</div>";//YDRE WRAPPER 

//HVIS PERSONEN IKKE HAR STEMT FØR 
} else { 


    $string = "<div class=\"flex absolute centerAm borc1 boxsb\">"; 
    $string = $string .= "<div id=\"innerVotingWrapper\" class=\"innerVotingWrapper relative flex \">"; 
    //IMGINFO 
    $string = $string .= "<div id=\"imgInfo\" class=\"imgInfo absolute top0 right0\">"; 
    $string = $string .= "</div>"; 

    $string .= "<div class=\"imageWrapper mauto relative fadeInClass\">"; 

    $string .= "<img id=\"imgSrc\" src=\"assets/img/$id.png\" class=\"babeImg borb2 boxsb\">"; 

    //BILLEDE VALUEN 
    $string .= "<input id=\"imgValue\" class=\"absolute displayn\" type=\"radio\" value=\"$id\">"; 

    //STAR FORM 
    $string .= "<div id=\"starWrapper\" class=\"starWrapper flex center absolute left0 bot0 mar10\">"; 
    $string .= "<form action=\"\" method=\"post\" class=\"flex flex-drr absolute bot0 left0\">"; 

    for ($i = 5; $i > 0; $i--) { 
     $string .= "<input id=\"vote$i\" class=\"vote displayn\" type=\"radio\" name=\"vote\" value=\"$i\">"; 
     $string .= "<label for=\"vote$i\"></label>"; 
    } 

    //SUBMIT FORM 
    $string .= "<input type=\"submit\" id=\"voteSubmit\" class=\"displayn\">"; 

    $string .= "</form>"; 
    $string .= "</div>"; //starWrapper 
    $string .= "</div>"; //imageWrapper 
    $string .= "</div>"; //innerVotingWrapper 
    $string .= "</div>"; //YDRE NAV TIL AT CENTRERE 
} 
//COL10 
$test = "<div id=\"testid\" class=\"bgw\">"; 
$test .= "</div>"; 
?> 

<div class="flex"> 
    <div class="col10 bgc2"> 
     <?php echo $test; ?> 
    </div> 
    <div class="col90 bgc1 relative vh100"> 
     <?php echo $string; ?> 
    </div> 
</div> 

newimage.php

<?php 

require_once '../includes/db.php'; 
require_once '../includes/functions.php'; 
$dbCon = dbCon(); 

//$voteValue = filter_input(INPUT_POST, 'voteValue', FILTER_SANITIZE_NUMBER_INT); 
//$imgValue = filter_input(INPUT_POST, 'imgValue', FILTER_SANITIZE_NUMBER_INT); 

$voteValue = $_POST['voteValue']; 
$imgValue = $_POST['imgValue']; 

$ip = ip2long($_SERVER['REMOTE_ADDR']); 

$stmtt = $dbCon->prepare("INSERT INTO rating_users (user_ip, user_vote, user_source) VALUES (?, ?, ?)"); 
$stmtt->bind_param('iii', $ip, $voteValue, $imgValue); 
$stmtt->execute(); 

//UPDATERE DATABASED 
$stmt = $dbCon->prepare("UPDATE rating SET 
    votes = votes + 1, 
    rating = rating + ? WHERE id = ?"); 
$stmt->bind_param('ii', $voteValue, $imgValue); 
$stmt->execute(); 


//LAV EN SQL QUERY SOM CHECKKER AT id ikke matcher et id allerede votet af den ip 
//SENDER NY QUERY AFSTED 

$sql = "SELECT * FROM rating INNER JOIN rating_users ON rating_users.user_source = rating.id WHERE rating_users.user_source= $user_source AND (rating_users.user_id= $user_id OR rating_user.ip= $ip) "; 
$result = $dbCon->query($sql); 
$result = $result->fetch_object(); 
$id = $result->id; 
//HVIS DEN IKKE ER TOM SKAL DET BILLEDE + RATING DIVS SENDES SOM JSON 
$imgSrc = "assets/img/" . $id . ".png"; 
$arr = array('imgSrc' => $imgSrc, 'id' => $id); 

echo json_encode($arr); 

のJavascript/Ajaxの

var vote = document.getElementsByClassName('vote'); 
var voteL = vote.length; 
for (let i = 0; i < voteL; i++) { 
    //SKAL VÆRE LET VALUE 
    let voteValue = vote[i].value; 

    vote[i].addEventListener('click', function() { 
     var imgValue = document.getElementById("imgValue").value; 
     newImage(voteValue, imgValue); 
     console.log(vote[i].value); 
    }); 
} 

function newImage(voteValue, imgValue) { 
    var http = new XMLHttpRequest(); 
    var url = "pages/newImage.php"; 
    var params = "voteValue=" + voteValue + "&imgValue=" + imgValue; 
    http.open("POST", url, true); 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.onreadystatechange = function() { //KALDER FUNKTIONEN NÅR DNE ER KLAR 
     if (http.readyState == 4 && http.status == 200) { 

      var Data = JSON.parse(this.responseText); 
      console.log(this.responseText); 

      var imgSrc = document.getElementById('imgSrc'); 
      imgSrc.src = Data.imgSrc; 
      var imgValue = document.getElementById('imgValue'); 
      imgValue.value = Data.id; 

      var ratingValue = Data.rating; 
      var starWrapper = document.getElementById('starWrapper'); 
      //HVIS IPEN HAR STEMT PÅ BILLEDET BLIVER HANS VOTES RETURNERET TIL VISNING OG IKKE MULIGT AT STEMME 
      if (Data.rating) { 

       // OPRETTER VOTED/EMPTY STARS HVIS DER ER VOTET 
       var string = ""; 
       for (i = 1; i <= ratingValue; i++) { 
        string = string + "<div class=\"voteFull\"></div>"; 
       } 
       for (i = ratingValue; i < 5; i++) { 
        string = string + "<div class=\"voteEmpty\"></div>"; 
       } 
       starWrapper.innerHTML = string; 

      } else { 
       console.log('Data.rating er ikke sat'); 
      } 

     } 
    }; 
    http.send(params); 
} 

var testId = document.getElementById('testid'); 
testId.addEventListener('click', function() { 
    console.log('Clicked'); 
}); 
+0

4つのスペースまたは自動的にそれを行う「{}」ボタンを使用してコードを試して、フォーマットしてみてください。プレゼンテーションの問題。 – tadman

+0

申し訳ありません私はこれを次回に行うことを申し訳ありません – Heine

+1

あなたは 'あなたが誰のuser_ip =? '人から評価して(*)からSELECT COUNT(*)して前に投票していないことを確認できるときに、あなたのスキーマはちょっと変わっているようです。通常、あなたが評価できるものの表と、ユーザーによって実行された評価の表があります。 – tadman

答えて

0

sがユーザー以来列user_sourceにT2上で一意制約をすることができている必要があります1データの要求であります一度投票するだけでなく、一意の制約にipを追加して、1人の票を1人に制限することができます。

SELECT * 
FROM rating 
INNER JOIN rating_users 
    ON rating_users.user_source = rating.id 
WHERE rating_users.user_source= $user_source 
AND (rating_users.user_id= $user_id OR rating_user.ip= $ip) 
私は現在の写真にUSER_ID/user_ipは、セグメントに制限するようにクエリを変更(USER_SOURCE:ユーザーまたはIPは現在の写真

EDITためまだ投票していない場合

上記のクエリは、ゼロを返すべき)。 $user_source$user_id$ip

+0

これは本当に良いことです: ')私は素早い風呂に入って、戻ってきたらこれをテストします...もしこの仕事があなたに報われるなら! – Heine

+0

しかし、それはイメージ/ ipごとに1票でなければなりません – Heine

+0

ユーザイメージの列は何ですか?それはrating_user.user_voteですか?rating.categoryですか? – Jpsh