2017-03-29 182 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」;

由於標題和描述是字符串,它需要雙引號內的單引號換行。