Увеличить значение в базе данных с помощью PHP и AJAX

Я пытаюсь сделать значение +1 в базе данных каждый раз, когда нажимаю кнопку использования. моя функция в HTML:

function onClick(arg){
             alert("thx fo click");
              $.ajax({
                  type: 'POST',
                  url: 'data.php',
                  data: {
                     'arg': arg,
                  },
                  success: function(response) {
                  }
              });
         }

arg означает значение кнопки, и это идентификатор строки в базе данных и PHP:

<?php
$link = mysql_connect($servername, $username, $password);

$id = $_POST['arg'];

$sql = "UPDATE Buttons(SUMA) SET SUMA = SUMA + 1 WHERE ID = '$id'";
$conn->query($sql);

mysql_close($link);
?>

И это ничего не дает. Как я могу это исправить?

Что если arg = "' OR 1 --"

ArtisticPhoenix 10.12.2018 22:43

Прекратите использовать mysql_stackoverflow.com/questions/60174/… а что вообще такое $conn ???

AbraCadaver 10.12.2018 22:45

@AbraCadaver Может быть, $conn - это mysqli :)

user3783243 10.12.2018 22:46

Для чего вам нужны «Кнопки (СУМА)»? Почему бы не оставить только «Кнопки»? Кроме того, где определение для $ conn?

Vlad Vladimir Hercules 10.12.2018 22:46

arg всегда имеет значение, присвоенное одной кнопке

J. Day 10.12.2018 22:47

Что такое 1 + NULL, он по-прежнему NULL. ЕСЛИ вы не установили для столбца значение «0» по умолчанию, вы не сможете увеличить его.

ArtisticPhoenix 10.12.2018 22:48

Пожалуйста, сузьте проблему. Связан ли JS? Откройте консоль разработчика и посмотрите, успешно ли отправляется AJAX.

user3783243 10.12.2018 22:48

@ user3783243 его js выглядит нормально, а код php - нет.

Vlad Vladimir Hercules 10.12.2018 22:50

Базовое значение @ArtisticPhoenix равно 0

J. Day 10.12.2018 22:51

@ user3402600 Да, в таком случае нам даже не нужен ни JS, ни тег JS. Это усложняет вопрос, в котором нет необходимости. Вероятно, тегами должны быть PHP, mysql и mysqli (предположим, это может быть PDO или какой-то другой драйвер).

user3783243 10.12.2018 22:51

Не могли бы вы установить $ id вручную и запустить data.php. Вы можете обнаружить, что php покажет сообщение об ошибке

Vlad Vladimir Hercules 10.12.2018 22:52

Buttons(SUMA) действительно имя вашего стола? dev.mysql.com/doc/refman/8.0/en/identifiers.html

user3783243 10.12.2018 22:54

Что вы имеете в виду под это ничего не делает ?. Не могли бы вы также показать свой html-код?

ktaro 11.12.2018 04:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
13
222
2

Ответы 2

Что равно 1 + NULL, это все равно NULL.

ЕСЛИ вы не установили для столбца значение «0» по умолчанию, вы не сможете его увеличить.

Лучше всего это можно показать на простой скрипке БД.

Начальный нуль:

CREATE TABLE t(
  id INT(10),
   v INT(10) 
);

INSERT INTO t (id)VALUES(1);

SELECT * FROM t;

UPDATE t SET v = v+1 WHERE id=1;

SELECT * FROM t;

В обоих вариантах вы получите значение null для v, как показано ниже в скрипте:

https://www.db-fiddle.com/f/m1vgKpov1oiRJEfZEgmk1j/0

Проще говоря, вы не можете прибавить 1 (или любое число) к значению NULL. Что ж, вы можете, но это все равно ноль. null + 1 = null

Начиная с 0:

CREATE TABLE t(
  id INT(10),
   v INT(10) default 0 
);

INSERT INTO t (id)VALUES(1);

SELECT * FROM t;

UPDATE t SET v = v+1 WHERE id=1;

SELECT * FROM t;

В этом случае первый Select возвращает 0 для v, а второй возвращает 1 для v. Как видно в модифицированном файле fiddle.

https://www.db-fiddle.com/f/m1vgKpov1oiRJEfZEgmk1j/1

Также (SQLInjection)

Как я уже сказал в комментариях:

What if arg = "' OR 1 --"

Или, другими словами, не вводите пользовательские переменные (или какие-либо данные на стороне клиента) в свой SQL, иначе он будет выглядеть так:

 UPDATE `Buttons(SUMA)` SET SUMA = SUMA + 1 WHERE ID = '' OR 1 --'"

Это увеличит каждую строку в вашей БД, которая не равна нулю. Обычно ' закрывает другую цитату, тогда ИЛИ 1 всегда истинно (для каждой строки). К сожалению, я не могу показать часть комментария -- в скрипте (он комментирует второй выбор), но вот конечный результат.

https://www.db-fiddle.com/f/m1vgKpov1oiRJEfZEgmk1j/3

Вот почему мы используем подготовленные операторы. Этот пример несколько тривиален, но я видел здесь код входа в систему, и я смог обойти его, просто вставив "' OR 1 LIMIT 1 --'", и со смещением вы могли итерировать через каждого пользователя. Они искали, чтобы 1 строка возвращалась при совпадении имени пользователя и пароля.

Еще несколько вещей:

  • Имя таблицы Buttons(SUMA) - это на самом деле имя, так как оно будет работать, только если оно будет экранировано с помощью backtic. Как я сделал в приведенном выше примере SQLInjection.
  • $link = mysql_connect($servername, $username, $password); определены, открытый тег находится прямо над ними. Я обычно использую упрощенный пример кода. Но стоит спросить. Очевидно, вы не можете подключиться к БД, если они не определены.

Ваше здоровье!

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

user3783243 10.12.2018 22:49

Базовое значение в ячейке - 0

J. Day 10.12.2018 22:53

@ J.Day - нет возможности узнать это на основании того, что опубликовано. Таким образом, либо в коде есть ошибка (например, неопределенные переменные соединения, ошибка sql, например, орфографические ошибки), либо вы ее не вызываете.

ArtisticPhoenix 10.12.2018 23:00

@ArtisticPhoenix Buttons(SUMA) в качестве имени таблицы может вызвать некоторые проблемы.

user3783243 10.12.2018 23:01

Я могу заставить его работать с Buttons(SUMA), см. рабочий пример ... :-p

ArtisticPhoenix 10.12.2018 23:03

Здесь есть несколько синтаксических ошибок. Прежде всего, проверьте mysqli_ (или PDO) и начните использовать его вместо mysql_ Зачем использовать mysqli_ - MySQL против MySQLi при использовании PHP Сравнение mysqli_ и PDO - https://websitebeaver.com/php-pdo-vs-mysqli

С этим в сторону ....

Вы определяете соединение с базой данных, не выбирая схему, но не ссылаетесь на свою схему в запросе, то есть mysql не знает, что обновлять. Ссылайтесь на свою схему в соединении или в каждом запросе. Также проверьте имя своей таблицы, это действительно кнопки (SUMA)?

Вы определили соединение с базой данных как $ link, но используете $ conn для попытки запроса. Вероятно, опечатка при копировании и вставке. Остерегайтесь этого ...

Как упоминалось в Artistic Phoenix, вы должны убедиться, что столбец не может быть установлен в NULL и начинается с 0 для начала. Пока вы занимаетесь этим, убедитесь, что ваш тип данных установлен на int для счетчика приращения.

После внесения этих изменений, если у вас не получилось, я бы попробовал выполнить ваш запрос вне вашего кода в диспетчере БД, чтобы убедиться, что эта часть оказывает предполагаемое влияние на ваши данные, прежде чем смотреть на ошибки в вашем коде.

Я предполагаю, что проблема правильно передается в ваш скрипт, но для подтверждения вы всегда можете повторить ее на бэкэнде и, чтобы быть вдвойне уверен, alert () в JS до того, как она пройдет.

Найдите время, чтобы прочитать это, обновить свой скрипт, чтобы использовать mysqli_ или PDO, и если у вас все еще есть проблемы, я более чем счастлив вернуться сюда и помочь вам в дальнейшем.

Я не голосовал, но, возможно, 1. $link не будет объектом 2. $conn выглядит как соединение pdo или mysqli 3. defining your database connection without selecting a table не уверен, что вы имеете в виду под этим

user3783243 10.12.2018 23:00

правда, я полагаю, что вещи, которые я упомянул, бесполезны, пока он не использует mysqli_ или PDO ... Будучи новым постером, я предположил, что он имел в виду использовать $ link вместо $ conn, хотя я думаю, что это не имеет значения и все еще неверно в mysql_ -и в mysqli Я думал, вы определяете таблицу, а также базу данных (схему) в соединении? Я определенно думал о схеме, когда напечатал это - отредактирую.

TCooper 10.12.2018 23:04

В соединениях есть только базы данных, а не таблицы. Вам не нужно различное соединение для каждой таблицы.

user3783243 10.12.2018 23:05

да, я просто проверил документацию, чтобы убедиться - в любом случае ему нужно ссылаться на свою базу данных либо в соединении, либо в каждом запросе.

TCooper 10.12.2018 23:07

Я обнаружил, что ошибка data.php: 1 Не удалось загрузить ресурс: сервер ответил статусом 500 (внутренняя ошибка сервера), что я могу с этим сделать?

J. Day 10.12.2018 23:14

Другие вопросы по теме