#php #mysql
#php #mysql
Вопрос:
HTML:
<form>
<input type="radio" name="grade" value=95 /> A<br />
<input type="radio" name="grade" value=85 /> B<br />
<input type="radio" name="grade" value=75 /> C<br />
<input type="radio" name="grade" value=65 /> D<br />
<input type="radio" name="grade" value=50 /> F
</form>
PHP:
if (isset($_POST['grade'])) {
$name = $_POST['name'];
$grade = $_POST['grade'];
$sql = "UPDATE grade SET
total=total '$grade',
numvotes=numvotes 1 WHERE
name='$name'";
Всем привет… Я работаю над проектом по добавлению оценок, связанных с именами в меню. Мой HTML-код для радиального меню для оценки приведен выше, и мой соответствующий SQL также показан. Я хочу добавить ЧИСЛОВОЕ ЗНАЧЕНИЕ из оценки к «итогу» в моей базе данных SQL и увеличить количество голосов на 1. Я не уверен, что мой синтаксис правильный, потому что база данных не получает добавку к своим голосам или общей оценке.
Спасибо!
РЕДАКТИРОВАТЬ: Одна из причин, по которой я смущен тем, что это не работает, заключается в том, что, когда я захожу в консоль MySQL, я могу выполнить почти идентичную команду (где вместо ‘$ grade’ это число), и это работает. По крайней мере, я должен получить сообщение об ошибке или, возможно, numvotes должны увеличиться, но ничего.
ПРАВКА2: Спасибо Radu за то, что уловил это. Мое меню имен не функционирует должным образом. После использования $die после моей инструкции SQL я обнаружил, что имена, выбранные из выпадающего меню, интерпретировались как целые числа, а не имена. Оно должно быть заполнено именами SQL в базе данных. Вот мой код.
<?php
$query = mysql_query("SELECT name, id FROM grade");
echo "<select name='name'>";
while ($temp = mysql_fetch_assoc($query)) {
echo "<option value='".$temp['name']."'>".$temp['name']." </option>";
}
echo "</select>";
?>
EDIT3: После изменения $temp['id']
на $temp['name']
, я обнаружил, что мой die($sql)
теперь читает:
UPDATE grade SET total=total '95', numvotes=numvotes 1 WHERE name='charlie'
Итак, имя вводится, но оно ВСЕ еще не обновляется. Идеи?
Комментарии:
1. С этим кодом у вашего класса будут одни пятерки.
2. Почему бы не сохранять каждую отправку с именем и оценкой, тогда вы можете подсчитать, сколько баллов было отправлено по имени, и суммировать оценки с помощью одного простого запроса.
3. Небольшое замечание — атрибут value в ваших
<input>
тегах должен быть заключен в кавычки. Фактически, все атрибуты HTML заключаются в кавычки.4. @ryan: Хороший момент, но тогда в моей базе данных было бы МНОГО избыточности. По мере накопления будут существовать тысячи оценок, связанных с одним и тем же именем.
5. @Tory Waterman это не избыточность, это данные 🙂
Ответ №1:
Вы используете имена в качестве строк в SQL-запросе. Поэтому измените следующее:
echo "<option value='".$temp['id']."'>".$temp['name']."</option>";
Для:
echo "<option>".htmlspecialchars($temp['name'])."</option>";
Для живых проектов всегда используйте htmlspecialchars()
при echo()
вводе чего-либо в браузер и всегда используйте mysql_real_escape_string()
при составлении SQL-запросов на основе пользовательского ввода.
Например, в реальном проекте вы всегда должны использовать $name = mysql_real_escape_string($_POST['name'])
вместо просто $name = $_POST['name']
.
Комментарии:
1. Пожалуйста. Просто не забывайте использовать
htmlspecialchars()
иmysql_real_escape_string()
в реальных проектах. От этого будут только выгоды.2. @Tory @Radu: На самом деле в реальных, действующих проектах вы вообще не должны объединять строки SQL; вместо этого вы должны использовать подготовленные инструкции . Тогда нет шансов, что вы случайно забудете экранировать строку.
Ответ №2:
удалить ,
после
numvotes=numvotes 1
в вашем запросе
Комментарии:
1. Кажется, что это должно сработать, но я все еще получаю то же поведение. Однако я изменил это. Спасибо.
Ответ №3:
USERS
-----
id AUTO_INCREMENT
name
VOTES
-----
id AUTO_INCREMENT
user_id
grade
INSERT INTO votes (user_id, grade) VALUES (1, 95);
INSERT INTO votes (user_id, grade) VALUES (1, 85);
INSERT INTO votes (user_id, grade) VALUES (2, 75);
Затем, чтобы получить подсчет голосов за первого пользователя:
SELECT count(*) total_votes FROM votes WHERE user_id = 1;
И чтобы получить балл:
SELECT sum(grade) total_score FROM votes WHERE user_id = 1;
Это непроверено, но должно вывести вас на правильный путь.
Комментарии:
1. В основном он хранит информацию о пользователе. Тогда, если что-либо когда-либо изменится в отношении пользователя, например, имя, ваши запросы по-прежнему будут действительными, и вы получите все голоса от этого пользователя. Это предотвращает аномалии данных.
2. Возможно, это может быть лучшим способом хранения данных; к сожалению, это не решает проблему OP, заключающуюся в том, что его SQL, похоже, не выполняется в базе данных.
3. @Phoenix true, но сохранение его таким образом в конечном итоге дает мне те результаты, которые он хочет.
4. Код, который я первоначально опубликовал, работает, хотя способ, которым я работаю с выпадающим меню, имеет недостатки. Пожалуйста, смотрите выше.
Ответ №4:
возможно, это просто ошибка в вашем примере, но тег должен быть
<form method="post">
в противном случае это условие никогда не сработает, поскольку формы по умолчанию используют метод GET
if (isset($_POST['grade'])) {