0

私はコミックの Web サイトを運営しており、1 つのコミック ID に対して「いいね」と「いいね」をクリックした人数を追跡したいと考えています。値をデータベースに保存し、ブラウザ。

これは私の機能しないソリューションです:

viewcomic.php:

    <script type="text/javascript">
    function likeCounter(choice) {    
       var site = $("#site").val();
       var imgid = $("#imgid").val();
       $.get("./scripts/likecounter.php", {_choice : choice, _site : site, _id : imgid},
            function(returned_data) {
                $("#choice").html(returned_data);
            }
        );
}
</script>
       //Changed to try and work with buttons
   <button id="like" onClick="likeCounter(this.id)">Like</button>
   <button id="dislike" onClick="likeCounter(this.id)">Dislike</button>
   <input id="site" type="hidden" value="<?php echo $site; ?>">
   <input id="imgid" type="hidden" value="<?php echo $imgid; ?>">

<br />
Likes: <span id="choice"></span>

likecounter.php

<?php 
include 'dbconnect.php';

$site = $_GET['_site'];
$imgid = $_GET['_id'];
$input = $_GET['_choice'];

if ($site == "artwork") {
   $table = "comics";
}
else {
   $table = "artwork";
}

$likes = $mysqli->query("SELECT like FROM $table WHERE id = $imgid");
$dislikes = $mysqli->query("SELECT dislike FROM $table WHERE id = $imgid");


if ($input == "like") {
   $sql = "UPDATE $table SET like = like + 1 WHERE id = $imgid";
   $mysqli->query($sql);
   $likes++;

else if ($input == "dislike") {
   $sql = "UPDATE $table SET like = dislike + 1 WHERE id = $imgid";
   $mysqli->query($sql);
   $dislikes++;
}   
mysqli_close($mysqli);

echo "Likes: " . $likes . ", Dislikes: " . $dislikes;

?>

データベースの値を増やしたり、ブラウザに値を報告したりしていません。助言がありますか?

ありがとう!

4

3 に答える 3

1

おもう

$site = $_GET['site'];`

する必要があります

$site = $_GET['_site'];` 

あなたも送信していませんid-$imgid = $_GET['id'];

コードが安全でないため、PDO または MySQLi を調べてください (SQL インジェクションを調べてください)。

于 2012-11-16T00:00:25.520 に答える
1

その単語はSQLで予約されているため、列名「like」を別の名前に変更する必要があると思います ここに予約語のリストがあります

「好き」などに変更するだけです。

もう1つの小さなことは、単一のクエリで両方の値を取得できることです

Select likes,dislikes from $table where id = $ImgID
于 2012-11-16T00:32:21.920 に答える
1

技術的な問題は次の行です。

$.get("./scripts/likecounter.php", {_choice : choice, _site : site, _id : id}...

サイトとIDが定義されていないため、JavaScriptエラーが発生しますReferenceError: site is not defined

試す:

$.get("./scripts/likecounter.php", {_choice : choice, _site : "<?php echo $site; ?>", _id : "<?php echo $imgid; ?>"}...

非表示の入力は必要ありませonClickonclick

その他の簡単な提案:

$imgid が実際に整数であることを確認します。

$imgid = intval($_GET['_id']);
if($imgid == 0) exit('Invalid id');

以下は分離する必要はありません。

$likes = $mysqli->query("SELECT like FROM $table WHERE id = $imgid");
$dislikes = $mysqli->query("SELECT dislike FROM $table WHERE id = $imgid");

$result = $mysqli->query("SELECT like_count, dislike_count FROM $table WHERE id = $imgid");

$mysqli->querymysqli_result のみを返します。つまり、単にエコーすることはできず、フェッチを行う必要があります。単一の結果しか取得していないことがわかっているため、そのまま使用できます。list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);

ドキュメントを読んで、私が何をしようとしているのかを理解してください。

あなたが言ったように、人々は好きなだけ/嫌いを押し続けることができるので、何らかのIPログでこれを制限する必要があります. たとえば、次のフィールドを持つ新しいデータベース テーブルをセットアップします。IP、テーブル、imgid. 次に、誰かが「いいね」をすると、自分の IP をログに記録します。

$sql = "INSERT INTO xxx (ip, table_name, imgid) VALUES(\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)";
$mysqli->query($sql);

次に、次のような新しいものを追加する前に、レコードがあるかどうかを確認します。

$sql = "SELECT ip FROM xxx WHERE ip = \"".$_SERVER['REMOTE_ADDR']."\" AND table_name = "$table" AND imgid = $imgid";
$result = $mysqli->query($sql);
if($result->num_rows == 0) { ...if($input ==... }
于 2012-11-16T00:38:24.613 に答える