2017-03-29 92 views
1

编辑:谢谢大家的非常快速的答案!我一直在这一段时间,试图找出为什么$ id被识别,为什么字符串不是。现在看到明显的答案,我感到有点无聊,但让我感到欣慰的是让它工作。PHP代码无法识别某些值

我很抱歉,如果这已被回答之前,我已经找了几个小时,并找不到类似的东西,帮助我弄清楚这一点。

我想用新信息更新设备数据库中的一行。问题是,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); 
     }) 
} 

回答

2

TL;博士你几乎肯定是由没有使用他们周围适当引号直接把各种变量纳入查询执行对自己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()。例如,如果$connMySQLi对象,则使用$conn->real_escape_string()。见the manual

真正的修复

这里是你如何真的做正确,以及解决方案,你应该尽快实施。也就是说,如果可能的话,在你继续前进之前这样做。 使用准备好的语句。

阅读this entire Q&Athis cheat sheet from OWASP(无隶属关系)了解更多信息。

+0

谢谢你,我会阅读所有这些提醒自己正确的做事方式。我从一个很长的休息时间回到php,我几乎忘记了一切。 –

1

改变这个监守描述和DEVNAME它们串应该被引用

$ sql =“UPDATE devices SET devName = $ name,description = $ desc WHERE devID = $ id”;

$ SQL = “UPDATE SET设备DEVNAME = '” $名。 “ '描述='” $递减。 “' WHERE DEVID = $ ID”;

1

试试这个,$ sql =“UPDATE devices SET devName ='$ name',description ='$ desc'WHERE devID = $ id”;

由于标题和描述是字符串,它需要双引号内的单引号换行。