PHP: нравится / не нравится счетчик

У меня есть сайт комиксов, где я бы хотел, чтобы пользователи голосовали один раз за комикс и один раз за произведение.

Кажется, есть два проблемы с моим кодом:

1) Я хочу, чтобы один пользователь голосовал один раз за изображение … поэтому я хочу захватить их информацию и сохранить ее в базе данных. У меня есть ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ КОДА DUPLICATE, но он дает мне следующую синтаксическую ошибку, хотя я не нашел НИЧЕГО НЕПОСРЕДСТВЕННО:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table = VALUES(table), imgid = VALUES(imgid)' at line 7 

Пример этого, позволяющий несколько записей в базе данных для одного и того же IP:

введите описание изображения здесь

2) Он по-прежнему позволяет одному пользователю голосовать несколько раз.

  $sql = "SELECT ip FROM votes WHERE ip = \"".$_SERVER['REMOTE_ADDR']."\" AND table_name = $table AND imgid = $imgid"; $result = $mysqli->query($sql); var_dump($result); 

Полный код:

 <?php 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 = VALUES(table), imgid = VALUES(imgid)"; $mysqli->query($sql); echo $mysqli->error; echo "<br/>"; $sql = "SELECT ip FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND table_name = '$table' AND imgid = $imgid"; $result = $mysqli->query($sql); echo $mysqli->error; 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"; } mysqli_close($mysqli); ?> 

Повторение эскиза sql:

 echo "sql: ". $sql; 

Производит:

 sql: INSERT INTO votes (ip, table_name, imgid) VALUES ("127.0.0.1", "comics", 34) ON DUPLICATE KEY UPDATE ip = VALUES(ip), table = VALUES(table), imgid = VALUES(imgid) 

Любая помощь будет принята с благодарностью!

То, что вы видите, является table является одним из зарезервированных слов MySQL, но вы пытаетесь использовать ее в качестве имени столбца. Однако ваш столбец на самом деле называется table_name на основе вашего вопроса.

Запрос с заполнителями выглядит так:

 INSERT INTO votes (ip, table_name, imgid) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE ip=VALUES(ip), table_name= VALUES(table_name), imgid=VALUES(imgid) 

Помните, что с помощью mysqli вы можете выполнить этот запрос, выполнив следующие действия:

 $sth = $mysqli->prepare("..."); $sth->bind_param("sss", $_SERVER['REMOTE_ADDR'], $table, $imgid); $sth->execute(); 

Документация описывает этот процесс более подробно, но вещь "sss" относится к трем строкам, а три значения передаются как параметры.

Вероятно, вы должны использовать PDO, так как это намного менее суетливо, чем mysqli . Еще лучше было бы использовать базу данных, такую ​​как Doctrine, чтобы сделать для вас большую часть грязной работы SQL. Еще лучше было бы использовать инфраструктуру, такую ​​как CodeIgnighter , CakePHP или FuelPHP, чтобы дать вам основание для развития. Построение приложений вручную с нуля чрезвычайно трудоемкое и значительно более подверженное ошибкам.

Еще одно замечание – вы должны попробовать и использовать последовательное именование в своем коде. Вы ссылаетесь на $table как значение для table_name , поэтому для начала должно быть $table_name .

Вы выполняете запрос, но вы не проверяете это и пытаетесь использовать $ result, но это не ошибка объекта false . И это терпит неудачу, потому что вы должны быть такими:

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

(строковые значения цитируются с одинарной кавычкой)

Эта ссылка может решить вашу проблему

http://wcetdesigns.com/view.php?dtype=tutorials&category=php&id=22

вы можете выбрать только один ответ (например, не нравится) не более того, см. ссылку на мой код ниже

Кнопка Php – Ajax like / dislike