2010-11-12 64 views
0

這是我的PHP代碼:MySQL的更新設置的所有字段相同

if (isset($_POST['data']) && is_array($_POST['data'])) { 
       foreach ($_POST['data'] as $row => $data) { 
        $result = mysql_query("UPDATE orders SET project_ref='".$data['project_ref']."' where order_id = '".$data['order_id']."'") or die(mysql_error()); 
        $result1 = mysql_query("UPDATE orders SET supp_short_code='".$data['supp_short_code']."' where order_id = '".$data['order_id']."'") or die(mysql_error()); 
        $result2 = mysql_query("UPDATE orders SET om_part_no='".$data['om_part_no']."' where order_id = '".$data['order_id']."'") or die(mysql_error()); 
        $result3 = mysql_query("UPDATE orders SET description='".$data['description']."' where order_id = '".$data['order_id']."'") or die(mysql_error()); 
        $result4 = mysql_query("UPDATE orders SET quantity='".$data['quantity_input']."' where order_id = '".$data['order_id']."'") or die(mysql_error()); 
        $result5 = mysql_query("UPDATE orders SET cost_of_items='".$data['cost_of_items']."' where order_id = '".$data['order_id']."'") or die(mysql_error()); 
        $result6 = mysql_query("UPDATE orders SET cost_total='".$data['cost_total_td']."' where order_id = '".$data['order_id']."'") or die(mysql_error()); 
       } 
      } 

因此,當用戶希望編輯訂單ID:1,我希望這將更新所有行的order_id爲1,但什麼這段代碼正在將所有字段設置爲「1」?

編輯:

這是如何我發送數據到PHP:

$('#submit').live('click',function(){    
        var postData = {}; 
        postData['data[order_id]'] = $('#order_id').text(); 
        $('#items tr').not(':first').each(function(index, value) { 
         var keyPrefix = 'data[' + index + ']'; 
         postData[keyPrefix + '[supp_short_code]'] = $(this).closest('tr').find('.supp_short_code').text(); 
         postData[keyPrefix + '[project_ref]'] = $(this).closest('tr').find('.project_ref').text(); 
         postData[keyPrefix + '[om_part_no]'] = $(this).closest('tr').find('.om_part_no').text(); 
         postData[keyPrefix + '[description]'] = $(this).closest('tr').find('.description').text(); 
         postData[keyPrefix + '[quantity_input]'] = $(this).closest('tr').find('.quantity_input').val(); 
         postData[keyPrefix + '[cost_of_items]'] = $(this).closest('tr').find('.cost_of_items').text(); 
         postData[keyPrefix + '[cost_total_td]'] = $(this).closest('tr').find('.cost_total_td').text(); 
        }); 

       $.ajax 
        ({ 
        type: "POST", 
        url: "updateorder.php", 
        dataType: "json", 
        data: postData, 
        cache: false, 
        success: function() 
         { 
          alert("Order Updated"); 
         } 
        }); 
      }); 

回答

1

那麼首先,$ _POST ['data']是一個數組數組?對我來說似乎有點奇怪。一個foreach循環遍歷數組中的每個項目,並在as之後檢索鍵和值。那麼這是你的意思?

if (isset($_POST['data']) && is_array($_POST['data'])) { 
    foreach ($_POST['data'] as $row => $data) { 
    $result = mysql_query("UPDATE orders SET $row='$data' WHERE order_id = '" . $_POST['data']['order_id'] . "';"); 
    } 
} 

第二點是你不應該爲每個字段創建一個新的SQL查詢。試試這個:

if (isset($_POST['data']) && is_array($_POST['data'])) { 
    $sql = "UPDATE orders SET "; 
    foreach ($_POST['data'] as $row => $data) { 
    $sql .= "$row = '$data'"; 
    } 
} 
$sql .= " WHERE order_id = '" . $_POST['data']['order_id'] . "'"; 
$result = mysql_query($sql); 

第三,閱讀SQL注入。最起碼,把mysql_real_escape_string()放在$ row和$ data變量以及$ _POST ['data'] ['order_id']周圍。所以:

if (isset($_POST['data']) && is_array($_POST['data'])) { 
    $sql = "UPDATE orders SET "; 
    foreach ($_POST['data'] as $row => $data) { 
    $sql .= "mysql_real_escape_string($row) = 'mysql_real_escape_string($data)'"; 
    } 
} 
$sql .= " WHERE order_id = '" . mysql_real_escape_string($_POST['data']['order_id']) . "'"; 
$result = mysql_query($sql); 
+0

好了一些進展。它現在不會將所有字段設置爲「1」或者order_id是什麼,但它不會更改字段中的任何值?我可以用什麼其他代碼來使這更容易? – benhowdle89 2010-11-12 10:10:28

+0

你確定'$ POST ['data']'實際上是一個數組嗎?嘗試'var_dump($ _POST ['data']);',甚至是'var_dump($ _ POST);'。 – 2010-11-12 10:20:25

+0

這是PHP響應:陣列(2){ [ 「ORDER_ID」] => 串(1) 「2」 [0] => 陣列(7){ [ 「supp_short_code」] => 串(0) 「」 [ 「project_ref」] => 串(0) 「」 [ 「om_part_no」] => 串(8) 「16511316」 [ 「描述」] => 串(16)「 EarthTerminal6mm」 [ 「quantity_input」] => 串(1) 「2」 [ 「cost_of_items」] => 串(4) 「2.34」 [ 「cost_total_td」] => 串(4) 「2.34」 } } – benhowdle89 2010-11-12 10:26:48

1

你就可以開始通過閱讀this這將節省你很多麻煩的未來。

此外,您不需要爲每個需要更新的字段創建查詢。 忽視安全問題,你可以這樣做:

$q = " 
    UPDATE orders 
    SET project_ref='".$data['project_ref']."' , 
     supp_short_code='".$data['supp_short_code']."' , 
     om_part_no='".$data['om_part_no']."' , 
     description='".$data['description']."' , 
    // .... remaining fields here, don't forget ^the coma 
    WHERE order_id = '".$data['order_id']."' 
"; 

mysql_query($q) or die(mysql_error()); 

這段代碼做的是設置你的表字段project_ref, supp_short_code, om_part_no, ...的東西(它來自$_POST['data'])到任何order_id來自$_POST['data']['order_id']

如果您的所有字段都變爲1,那麼您從表單發送的數據可能會遇到一些問題。試試print_r($_POST)以幫助您解決問題。

1

$_POST數據通常由用戶提供,因此除非您自己製作($_POST['data'] = array()),否則它不可能是原生的PHP陣列。

消毒您的輸入,並在運行任何查詢之前記錄它... print_r($_POST['data']) ...確保它包含您實際需要的數據。

1

也許可以查看MySQL中order_id的數據庫類型。我認爲它被定義爲一個INT。如果是這樣,請刪除這裏的單引號:

where order_id = ".$data['order_id']."