更新id=$id的记录。

4

我有一个将数据提交到数据库的查询:

$sql = "UPDATE table SET user='$user', name='$name' where id ='$id'";

通过url获取id,例如 localhost/index.php?id=123

$id=$_GET['id']

查询将无法正确工作;数据将无法更新。 如果我写:

$sql = "UPDATE table SET user='$user', name='$name' where id ='123'";

它正常工作。

如果我回显ID,它将显示正确的结果,123

问题在哪里?


3
请回显完整的 SQL 查询,这样我们就可以看到实际问题。 - LostMohican
6
这段代码很可能存在SQL注入攻击的风险!你应该学习如何识别和防范它们。 - Gazler
阅读一下这个问题/回答,它解释了避免 SQL 注入的方法: https://dev59.com/oHVD5IYBdhLWcg3wL4cA - Manse
1
我非常确定你的表名和某些列名是关键字,将它们放在反引号中:UPDATE \table` SET `user`='$user', `name`='$name' WHERE `id` = $id` - user254875486
6个回答

12

以能获取错误信息的方式运行所有查询,这样至少可以得到错误信息及有误查询。

















$sql = "UPDATE table SET user='$user', name='$name' where id ='$id'";
$res = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);

它将告诉你问题出在哪里。

这比在这里提问要方便、精确和更快。


5
我猜测你的问题是由于未转义数据插值而导致SQL格式错误 - 这是一个SQL注入漏洞。
你实际生成的查询语句是什么样子?不是创建SQL的代码(如上所述),而是变量插入后的实际SQL。
我猜它看起来会像这样:
UPDATE table SET user='fred', name='O'Brien' where id='123';
                                     ^--unescaped quote

导致语法错误。
如果您像这样运行查询:
$result = mysql_query($sql);

然后将其更改为
$result = mysql_query($sql) or die(mysql_error());

如果查询出现问题,您将立即收到反馈。

然后阅读有关SQL注入漏洞的内容 (SQL injection)


我的评论针对原始问题。 - user254875486
更新表格 SET 用户='罗伯特',姓名='鲍勃' WHERE ID=" - Geme

1
$id = $_GET['id']

<form action="#.php" method="POST">
      <input type="hidden" name="id" value="<?php echo $id?>">
</form>

然后,在 PHP 代码块内部,

$id = $_POST['id'];
$sql = "UPDATE table SET user='$user', name='$name' where id ='$id'"

0

应该有TableName……您在查询中没有使用表名。请打印出 $sql 并尝试在 phpmyadmin 中执行。


0
首先,如果你像这样做,你就会面临 SQL 注入攻击的风险。任何人都可以轻易地修改 id= 后面的部分,并用它修改你的数据库。
其次,我看到你将一个id传递给脚本,但它在哪里确定了 $user 和 $name 的值?看起来你的代码是不完整的。

0

不谈从GET数组中直接提取数据的问题,我首先建议你正确转义变量。我假设ID是一个整数,所以不需要在它周围加单引号。

$sql = "UPDATE table SET user='".$user."', name='".$name."' where id=".$id;

看看这是否有效。


1
这不会改变任何东西。$x = "x $a x" 在 PHP 中与 $x ='x '. $a . ' x'; 的处理方式完全相同。你所做的只是在一艘正在下沉的船上重新排列甲板椅子。 - Marc B
1
@MarcB 他在谈论将单引号传递给数据库引擎的问题。 - HaLeiVi
@HaLeiVi:无关紧要。'"引用的字符串内部,所以它们不是引号,对PHP来说只是一些随机字符。 - Marc B
@MarcB 这个错误不是 PHP 错误,而是数据库错误。这个 $sql 被传递到数据库中,数据库不会读取双引号 ("),但会读取单引号 (')。正如 nageeb 所建议的那样,被引号包围的值是一个字符串,但 id 字段需要一个数字。 - HaLeiVi
它是mysql。它会自动将数字转换为适当的格式。在mysql中,1 = '1'是true(假设strict mode已关闭)。 - Marc B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接