Я пытаюсь сделать значение +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);
?>
И это ничего не дает. Как я могу это исправить?
Прекратите использовать mysql_stackoverflow.com/questions/60174/… а что вообще такое $conn ???
@AbraCadaver Может быть, $conn - это mysqli :)
Для чего вам нужны «Кнопки (СУМА)»? Почему бы не оставить только «Кнопки»? Кроме того, где определение для $ conn?
arg всегда имеет значение, присвоенное одной кнопке
Что такое 1 + NULL, он по-прежнему NULL. ЕСЛИ вы не установили для столбца значение «0» по умолчанию, вы не сможете увеличить его.
Пожалуйста, сузьте проблему. Связан ли JS? Откройте консоль разработчика и посмотрите, успешно ли отправляется AJAX.
@ user3783243 его js выглядит нормально, а код php - нет.
Базовое значение @ArtisticPhoenix равно 0
@ user3402600 Да, в таком случае нам даже не нужен ни JS, ни тег JS. Это усложняет вопрос, в котором нет необходимости. Вероятно, тегами должны быть PHP, mysql и mysqli (предположим, это может быть PDO или какой-то другой драйвер).
Не могли бы вы установить $ id вручную и запустить data.php. Вы можете обнаружить, что php покажет сообщение об ошибке
Buttons(SUMA) действительно имя вашего стола? dev.mysql.com/doc/refman/8.0/en/identifiers.html
Что вы имеете в виду под это ничего не делает ?. Не могли бы вы также показать свой html-код?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что равно 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); определены, открытый тег находится прямо над ними. Я обычно использую упрощенный пример кода. Но стоит спросить. Очевидно, вы не можете подключиться к БД, если они не определены.Ваше здоровье!
Вероятно, это одна из по крайней мере четырех проблем здесь.
Базовое значение в ячейке - 0
@ J.Day - нет возможности узнать это на основании того, что опубликовано. Таким образом, либо в коде есть ошибка (например, неопределенные переменные соединения, ошибка sql, например, орфографические ошибки), либо вы ее не вызываете.
@ArtisticPhoenix Buttons(SUMA) в качестве имени таблицы может вызвать некоторые проблемы.
Я могу заставить его работать с Buttons(SUMA), см. рабочий пример ... :-p
Здесь есть несколько синтаксических ошибок. Прежде всего, проверьте 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 не уверен, что вы имеете в виду под этим
правда, я полагаю, что вещи, которые я упомянул, бесполезны, пока он не использует mysqli_ или PDO ... Будучи новым постером, я предположил, что он имел в виду использовать $ link вместо $ conn, хотя я думаю, что это не имеет значения и все еще неверно в mysql_ -и в mysqli Я думал, вы определяете таблицу, а также базу данных (схему) в соединении? Я определенно думал о схеме, когда напечатал это - отредактирую.
В соединениях есть только базы данных, а не таблицы. Вам не нужно различное соединение для каждой таблицы.
да, я просто проверил документацию, чтобы убедиться - в любом случае ему нужно ссылаться на свою базу данных либо в соединении, либо в каждом запросе.
Я обнаружил, что ошибка data.php: 1 Не удалось загрузить ресурс: сервер ответил статусом 500 (внутренняя ошибка сервера), что я могу с этим сделать?
Что если
arg = "' OR 1 --"