2012-08-03 85 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