2012-08-03 44 views
0

我正在嘗試使用MySQLI和PHP更新表格中的信息。我知道數據正在進入更新部分,因爲我在很多地方都使用print_r()var_dump()來驗證某些內容,但表格中沒有任何變化。以下是我對我的更新:使用MySQLi和PHP更新表格

$conn->query("update inventory set cost = $cost, csmt = $csmt, 
    hold = {$data[$n]['hold']}, commission_level = " . $cLvl .", 
    date_process = '$today' where sku = {$data[$n]['sku']}"); 

如果我只加成本則該表將更新,但如果我改變csmthold領域,沒有得到更新。

如果我硬編碼MySQL查詢中的值,它工作正常。所以看起來PHP代碼存在一些問題。

任何人都可以看到我在哪裏出錯嗎?

$today = date('Y-m-d'); 
$data = json_decode($_POST['data'], true); 

foreach ($data as $value) { 
    // check to see if it was taken off hold 
    if ($data[$n]['cost']> 0 || $data[$n]['csmt'] !== 0) { 

     //update commission information 
     //gather data 
     $result = $conn->query("SELECT book_code FROM book_type WHERE book_type_id = {$data[$n]['booktype']}"); 
     if ($result) { $bookType = $result->fetch_assoc(); } 

     $result = $conn->query("SELECT book_type_3 FROM feature WHERE feature_id = {$data[$n]['featureid']}"); 
     if ($result) { $bookType3 = $result->fetch_assoc(); } 

     $result = $conn->query("SELECT condition_id FROM defect WHERE defect_id = {$data[$n]['defect']}"); 
     if ($result) { $cId = $result->fetch_assoc(); } 

     $result = $conn->query("select source_id from inventory where sku = {$data[$n]['sku']}"); 
     if ($result) { $buyer = $result->fetch_assoc(); } 

     $result = $conn->query("SELECT class_code, notes, price, usedbuying_price FROM follette_title WHERE isbn13 = {$data[$n]['isbn']}"); 
     if ($result) { 
      $follett = $result->fetch_assoc(); 
      $follett_price = $follett['usedbuying_price']; 
     } 

     if ($data[$n]['cost'] == 0 || $bookType3['book_type_3'] == "DMG") 
     { 
      $cLvl = null; 
     } 
     elseif ($bookType['book_code'] == "IE" || $bookType['book_code'] == "AIE") 
     { 
      $cLvl = 3; 
     } 
     elseif ($cId['condition_id'] == 1 || $cId['condition_id'] == 2 || $cId['condition_id'] == 3 || $cId['condition_id'] == 4 || $follett['class_code'] == "D" || strpos($follett['notes'],"(T)") == true) 
     { 
      $cLvl = 2; 
     } 
     elseif ($cId['condition_id'] == 5) 
     { 
      $cLvl = 1; 
     } 

     if ($data[$n]['csmt'] == 0) { 
      //get buyer commission rate 
      if (!empty($cLvl)) 
      { 
       $result = $conn->query("SELECT lvl" . $cLvl . " FROM buyers WHERE buyer_id = {$buyer['source_id']}"); 
       //echo"SELECT lvl" . $cLvl . " FROM buyers WHERE buyer_id = {$buyer['source_id']}"; die; 
       if ($result) { $comRate = $result->fetch_assoc(); } //print_r($comRate); die; 
      } 

      //calculate final cost 
      if (!empty($comRate['lvl'.$cLvl])) 
      { 
       $cost = ($data[$n]['cost']) + (($data[$n]['cost']) * $comRate['lvl'.$cLvl]); 
      } 

     } 

     $csmt = $data[$n]['csmt']; 
     $conn->query("update inventory set cost = $cost, csmt = $csmt, 
      hold = {$data[$n]['hold']}, commission_level = " . $cLvl .", 
      date_process = '$today' where sku = {$data[$n]['sku']}"); 
+0

這一切都取決於這些變量的值(類型)是什麼,以及mysql期望它們是什麼。 – Matt 2012-08-03 17:50:33

+0

@Matt傳遞給mysql的所有值都是整數(例如,10.00代價,1代表csmt,0代表hold),並且mysql正在尋找double(cost)tinyint(csmt)和int(hold) – Jim 2012-08-03 17:55:12

回答

0

經過大量的試驗和錯誤,這裏是更好的修正代碼。

$today = date('Y-m-d'); 
$data =json_decode($_POST['data'], true); 

foreach($data as $value){ 
// check to see if it was taken off hold 
if($data[$n]['cost']> 1 || $data[$n]['csmt'] == 1) { 

    //update commission information 
     //gather data 
$result = $conn->query("SELECT book_code FROM book_type WHERE book_type_id = {$data[$n]['booktype']}"); 
if($result){$bookType = $result->fetch_assoc();} 

$result = $conn->query("SELECT book_type_3 FROM feature WHERE feature_id = {$data[$n]['featureid']}"); 
if($result){$bookType3 = $result->fetch_assoc();} 

$result = $conn->query("SELECT condition_id FROM defect WHERE defect_id = {$data[$n]['defect']}"); 
if($result){$cId = $result->fetch_assoc();} 

    $result = $conn->query("select source_id from inventory where sku = {$data[$n]['sku']}"); 
    if($result) {$buyer = $result->fetch_assoc();} 

$result = $conn->query("SELECT class_code, notes, price, usedbuying_price FROM follette_title WHERE isbn13 = {$data[$n]['isbn']}"); 
if($result){ 
      $follett = $result->fetch_assoc(); 
      $follett_price = $follett['usedbuying_price']; 
      } 
      if($data[$n]['cost'] == 0 || $bookType3['book_type_3'] == "DMG") 
    { 
     $cLvl = null; 
    } 
    elseif($bookType['book_code'] == "IE" || $bookType['book_code'] == "AIE") 
    { 
     $cLvl = 3; 
    } 
    elseif($cId['condition_id'] == 1 || $cId['condition_id'] == 2 || $cId['condition_id'] == 3 || $cId['condition_id'] == 4 || $follett['class_code'] == "D" || strpos($follett['notes'],"(T)") == true) 
    { 
     $cLvl = 2; 
    } 
    elseif($cId['condition_id'] == 5) 
    { 
     $cLvl = 1; 
    } 

    if($data[$n]['csmt'] == 0){ 
    //get buyer commission rate 
    if(!empty($cLvl)) 
    { 
     $result = $conn->query("SELECT lvl" . $cLvl . " FROM buyers WHERE buyer_id = {$buyer['source_id']}");// 
        //echo"SELECT lvl" . $cLvl . " FROM buyers WHERE buyer_id = {$buyer['source_id']}"; die; 
     if($result) {$comRate = $result->fetch_assoc();}//print_r($comRate); die; 
    } 

    //calculate final cost 
    if(!empty($comRate['lvl'.$cLvl])) 
    { 
     $cost = ($data[$n]['cost']) + (($data[$n]['cost']) * $comRate['lvl'.$cLvl]); 
    } 

} 
// update inventory table 
$conn->query("update inventory set cost = $cost, csmt = {$data[$n]['csmt']}, hold = {$data[$n]['hold']}, commission_level = " . $cLvl .", 
     date_process = '$today' where sku = {$data[$n]['sku']}"); 


$holdList[$n] = array('buyer' => $data[$n]['buyer'], 
      'process date' => $today, 
       ); 
$n++; 
} else { 
    $n++; }// end of if statement 

}

我只是想給的情況下,別人最後的答案有同樣的問題。

1
$conn->query("update inventory set cost = ?, csmt = ?, hold = ?, commission_level = ?, date_process = ? where sku = ?"); 
$conn->bindParam("ssssss", $cost, $csmt, $data[$n]['hold'], $clvl, $today, $data[$n]['sku']); 
$conn->execute(); 

你需要改變s(在bindParam)到每個變量

-1

的根據數據類型根據數據的你想更新的類型,(INT ,STRING,VARCHAR或其他),某些數據在發送到數據庫之前可能需要進行格式化。

如果$ csmt引用來自用戶或項目OR的TEXT或VARCHAR,則文本可能包含需要在發送到數據庫之前正確格式化的引號或其他字符。如果發送到數據庫的命令的一部分是無效的,那麼數據庫將不接受數據。

這將是很好確切地知道什麼樣的數據類型的變量表示的,但假設你的$ CSMT是某種形式的測試,你將需要使用

這串碼值 - >

$value = mysql_real_escape_string($csmt); // Formats the string for database storage 

和$值應該被用來代替$ CSMT

這將解碼的字符串值 - >

$todisplay = htmlspecialchars($csmt, ENT_QUOTES); // $csmt from database 
// $todisplay = the value to display on your page. 
+1

您需要爲onlu進行此操作正在折舊的'mysql_query'。他使用'mysqli',那裏'mysql_escape_string'是不相關的 – mlishn 2012-08-03 18:07:03