编辑:谢谢大家的快速回答!我已经在这一段时间了,试图找出为什么$ id被识别以及为什么字符串不被识别。我觉得现在看到明显的答案有点傻了,但我很放心让它发挥作用。
如果之前已经回答过,我道歉,我已经找了好几个小时,找不到类似的东西来帮助我解决这个问题。
我正在尝试使用新信息更新设备数据库中的一行。问题是,php文件只识别$data->devID;
而没有别的。
如果我有类似的东西
$sql = "UPDATE devices SET devName = 'static test string', description = 'static test string' WHERE devID = $id";
具有正确ID的条目将在我的数据库表中更新。
如果我试试
$sql = "UPDATE devices SET devName = $name, description = $desc WHERE devID = $id";
它不起作用。
我哪里错了?
HTML:
<div data-ng-repeat="info in deviceInfo">
<form class="deviceInfo">
<h2>Device ID: {{info.devID}}</h2>
<p>Device Name:</p>
<input type="text" data-ng-model="info.devName">
<p>Device Description:</p>
<textarea data-ng-model="info.description"></textarea>
<p>Device Available: {{info.isAvailable}}</p>
<input type="submit" name="Update" value="Update" data-ng-click="updateInfo(info.devID, info.devName, info.description)">
</form>
</div>
updateDeviceInfo.php:
<?php
$data = json_decode(file_get_contents("php://input"));
include('config.php');
$id = $data->devID;
$name = $data->devName;
$desc = $data->description;
$sql = "UPDATE devices SET devName = $name, description = $desc WHERE devID = $id";
$qry = $conn->query($sql);
$data = $qry;
$sql = "SELECT * FROM devices";
$qry = $conn->query($sql);
$data = array();
if($qry->num_rows > 0){
while($row = $qry->fetch_object()){
$data[] = $row;
}
}else {
$data[] = null;
}
$conn->close();
echo json_encode($data);
controller.js:
$scope.updateInfo = function($paramID, $paramName, $paramDesc){
console.log($paramID);
console.log($paramName);
console.log($paramDesc);
$scope.dataOneTest = {
devID: $paramID,
devName: $paramName,
description: $paramDesc
};
console.log($scope.dataOneTest.devID);
$http.post('./js/updateDeviceInfo.php', {'devID': $paramID, 'devName': $paramName, 'description': $paramDesc})
.success(function(data){
$scope.results = data;
})
.error(function(err){
$log.error(err);
})
}
答案 0 :(得分:2)
tl; dr 您几乎可以肯定通过将变量直接插入查询和而失败,从而 对您自己执行SQL injection在他们周围使用适当的引号。
您需要使用预准备语句,而不是将变量直接连接到查询中。例如,如果$data->devName
包含像NULL --
那样邪恶的东西,那就会干掉整个桌子。这是一个非常温和的例子,说明事情会发生多么糟糕。准备好的陈述会使这个例子(以及几乎所有其他例子)变得无害。
作为短期修复,请在查询中加上引号并转义数据,如下所示:
$id = your_database_escape_function($data->devID);
$name = your_database_escape_function($data->devName);
$desc = your_database_escape_function($data->description);
$sql = "UPDATE devices SET devName = '$name', description = '$desc' WHERE devID = $id";
用your_database_escape_function()
替换数据库的相应转义函数。例如,如果$conn->real_escape_string()
是$conn
对象,请使用MySQLi
。请参阅the manual。
以下是您真正正确执行此操作的方法,以及您应尽快实施的解决方案。也就是说,如果可能的话,在你再进一步之前这样做。 使用准备好的陈述。
阅读this entire Q&A和this cheat sheet from OWASP(无关联)以获取更多信息。
答案 1 :(得分:1)
更改此描述和应该引用字符串的devName
$ sql =“UPDATE devices SET devName = $ name,description = $ desc WHERE devID = $ id”;
到
$ sql =“UPDATE devices SET devName ='”。$ name。“',description ='”。$ desc。“'WHERE devID = $ id”;
答案 2 :(得分:1)
试试这个,$ sql =“UPDATE devices SET devName ='$ name',description ='$ desc'WHERE devID = $ id”;
由于标题和描述是字符串,因此需要在双引号内包装单引号。