0

私は好き/嫌いなシステムを実装しようとしている漫画のウェブサイトを持っています。各ユーザーは、特定のコミックに 1 回だけ投票できます。コミックは「コミック」テーブルに保存され、アートワークは「アートワーク」に保存され、列 (ip、table_name、imgid) を持つ「投票」テーブルがあります。

誰かが投票すると、そのイメージ ID と「投票」テーブル内のテーブルに対して IP を保存したいと考えています。再度投票しようとすると、そのテーブルをチェックして、投票したかどうかを確認します。

また、そのIPを持つ誰かが再度投票しようとすると、投票テーブルのプライマリキー「ip」を更新するON DUPLICATE KEY UPDATEを実行したいと考えています。

include 'dbconnect.php';
$site = $_GET['_site'];
$imgid = intval($_GET['_id']);
$input = $_GET['_choice'];


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

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

list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);

$sql = "INSERT INTO 
            votes (ip, table_name, imgid) 
        VALUES 
            (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)
        ON DUPLICATE KEY UPDATE
            ip = VALUES(ip),
            table_name = VALUES(table_name),
            imgid = VALUES(imgid)";


if (!$mysqli->query($sql)) printf("Error: %s\n", $mysqli->error); 

$sql = "SELECT ip FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND table_name = '$table' AND imgid = $imgid";

if ($result = $mysqli->query($sql)) {

    if ($result->num_rows == 0) { 
        if ($input == "like") {
            $sql = "UPDATE $table SET like_count = like_count + 1 WHERE id = $imgid";
            $mysqli->query($sql);           
            $likes++;
        }
        else if ($input == "dislike") {
            $sql = "UPDATE $table SET dislike_count = dislike_count + 1 WHERE id = $imgid";
            $mysqli->query($sql);
            $dislikes++;        
        }
    echo "Likes: " . $likes . ", Dislikes: " . $dislikes;
    }
    else {
        echo "You have already voted";
    }
}
else { 
    printf("Error: %s\n", $mysqli->error); 
}
mysqli_close($mysqli);

何かご意見は?

4

2 に答える 2

1

tableMySQL の予約語です。使用する場合は、バッククォートで囲む必要があります。ただし、あなたの場合、table_name代わりに使用するつもりだったと思います:

$sql = "INSERT INTO 
            votes (`ip`, `table_name`, `imgid`) 
        VALUES 
            (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)
        ON DUPLICATE KEY UPDATE
           `ip` = VALUES(`ip`),
           `table_name` = VALUES(`table_name`),
           `imgid` = VALUES(`imgid`)";

クエリの構文から、次の使用を検討する必要がありますREPLACE

REPLACE は INSERT とまったく同じように機能しますが、テーブル内の古い行が PRIMARY KEY または UNIQUE インデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除される点が異なります。

したがって、クエリは次のように解決されます。

$sql = "REPLACE INTO 
            votes (`ip`, `table_name`, `imgid`) 
        VALUES 
            (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)";
于 2012-11-24T17:25:57.407 に答える
1
   $sql = "INSERT INTO 
            votes (ip, table_name, imgid) 
        VALUES 
            (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)
        ON DUPLICATE KEY UPDATE
            ip = VALUES(ip),
            table = VALUES(table),
            imgid = VALUES(imgid)";

列は「ip」、「table_name」、および「imgid」であるため、VALUES() の引数として列名を除いて VALUES を設定すると、「table = VALUES(table)」と記述され、列名は「table_name」になります。 . 列「表」はここに存在しません。「table_name = VALUES(table_name)」に変更するだけです。

于 2012-11-24T17:29:47.257 に答える