我每次使用use按钮时都试图在数据库中使值+1。 我在HTML中的功能:
function onClick(arg){
alert("thx fo click");
$.ajax({
type: 'POST',
url: 'data.php',
data: {
'arg': arg,
},
success: function(response) {
}
});
}
arg表示button的值,它是数据库中一行的ID 和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);
?>
那什么也没做。我该如何解决?
答案 0 :(得分:-1)
什么是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
的{{1}}值,如下面的小提琴所示:
https://www.db-fiddle.com/f/m1vgKpov1oiRJEfZEgmk1j/0
简单来说,不能将1(或任何数字)添加到NULL值。可以,但是仍然为空。 v
从0开始:
null + 1 = null
在这种情况下,第一个Select返回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;
的{{1}},第二个Select返回0
的{{1}}。如修改过的小提琴中所示。
https://www.db-fiddle.com/f/m1vgKpov1oiRJEfZEgmk1j/1
也(SQLInjection)
正如我在评论中所说的:
如果arg =“'OR 1-”
或者换句话说,不要将用户变量(或任何客户端数据)注入您的SQL中,否则它看起来像这样:
v
这将递增数据库中不为空的每一行。基本上1
关闭另一个引号,然后OR 1始终为true(对于每一行)。不幸的是,我无法在小提琴中显示v
注释部分(它注释掉了第二个选择),但这是最终结果。
https://www.db-fiddle.com/f/m1vgKpov1oiRJEfZEgmk1j/3
这就是为什么我们使用准备好的语句。这个示例有些琐碎,但是我在这里看到了登录代码,我可以通过放入 UPDATE `Buttons(SUMA)` SET SUMA = SUMA + 1 WHERE ID = '' OR 1 --'"
来绕过简单的操作,并使用偏移量可以遍历每个用户。他们正在寻找要根据用户名和密码返回的第一行。
其他一些事情:
'
确实是该名称,因为只有在与反义词一起转义时它才起作用。就像我在上面的SQLInjection示例中所做的一样。--
已定义,打开标签在它们上方。我通常会将其简化为简化的示例代码。但这值得问。显然,如果这些未定义,则无法连接到数据库。干杯!
答案 1 :(得分:-1)
您在这里有一些语法错误。 不过,最重要的是,先检查mysqli_(或PDO),然后开始使用它代替mysql_ 为什么要使用mysqli_-MySQL vs MySQLi when using PHP 比较mysqli_和PDO-https://websitebeaver.com/php-pdo-vs-mysqli
将其排除在外......
您在定义数据库连接时未选择任何模式,但是没有在查询中引用您的模式,这意味着mysql将不知道要更新什么。在连接或每个查询中引用您的架构。还要检查您的表名,真的是Buttons(SUMA)吗?
您将数据库连接定义为$ link,但是正在使用$ conn尝试查询。可能是复制和粘贴的“错别字”。小心这一点...
正如Phoenix艺术提到的那样,您必须确保您的栏不能设置为NULL,并且从0开始。在进行此操作时,请确保将您的数据类型设置为int以作为增量计数。
如果没有成功,则进行了这些更改之后,我将尝试在数据库管理器中的代码外部运行查询,以确保该部分对数据有预期的影响,然后再查看代码中的错误
我猜这是正确的传递给脚本的方法,但是要确认,您总是可以在后端回显它,并且可以确保在传递之前在JS中使用alert()。
花些时间阅读一下,更新脚本以使用mysqli_或PDO,如果仍然遇到问题,我很乐意回到这里为您提供进一步的帮助。