У меня есть сайт комиксов, где я бы хотел, чтобы пользователи голосовали один раз за комикс и один раз за произведение.
Кажется, есть два проблемы с моим кодом:
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