我正在尝试更新数据库中的一些记录,此代码之前一直有效,但现在无效了。将 id 变量更改为固定数字后,代码仍然不会影响数据库。没有发出错误。
<?php
header('Access-Control-Allow-Origin: *');
error_reporting(E_ALL);
ini_set("display_errors", 1);
$db = new PDO('mysql:host=localhost;dbname=xxx;charset=utf8', 'xxx', 'xxx');
$party = ($_POST['party']);
$id = ($_POST['id']); // $id is a string with ids separated by commas (1,2,3,4 e.t.c.)
$state = ($_POST['state']); // $state is either 1 or 0.
$code = ($_POST['fetchCode']);
$stmt = $db->prepare("UPDATE wishes SET state = $state WHERE fetchCode = '$code' AND partyID = '$party' AND id IN ($id); ");
$stmt->execute();
echo json_encode("Done");
?>
我用于数据库连接的用户只有更新状态列的权限,因此我看不到 SQL 注入(inject)的风险。我对此是否正确,我的代码有什么问题?
最佳答案
至于你问题的第二部分...
...I don't see the risk for SQL injections. Am I right about this...
- 用户权限往往会随着时间的推移而改变,并且并不总是记得需要更新哪些使用这些权限的代码。
- 仅仅因为您在技术上可能不会明显容易受到 SQL 注入(inject)攻击,所以仍然存在可能给您的最终用户带来有害体验的问题。举个例子,在未来的某一天,一个新的
fetchCode
被添加到你的表中,它可能包含一个'
字符,比如"9focuspoints's New Code"
未转义的内容会破坏这一点,导致客户感到沮丧,甚至可能会接到不受欢迎的深夜客户服务电话,具体取决于操作的严重程度。
这只是一种糟糕的形式,您已经完成了大部分语法工作来实际准备语句,所以您不妨完成这项工作。
至于你问题的前一部分,我是,你应该对事件周围的变化抱有极大的怀疑:
...this code have been working previously but isn't anymore...
自从这个工作以来发生了什么变化?如果此代码没有更改,那么我怀疑您将它发布在这里会得到很多帮助。要检查的一些问题:
- SQL 语句在独立客户端中运行时是否有效?
- 当您在故障排除过程中
var_dump
变量时,它们是否包含您期望的值?
关于php - UPDATE 根本不影响记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37260531/