Скрипт PHP / SQL для увеличения значения поля записи не обновляет запись

#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'])) {