【问题标题】:PHP batch update $_POST valuesPHP 批量更新 $_POST 值
【发布时间】:2016-01-28 03:45:14
【问题描述】:

我得到一个 $_POST 参数如下:

Array ( [qty-1] => 1 [uniprice-1] => 22.00 [qty-2] => 2 [uniprice-2] => 12.00 ) 

用于在 db 中更新的 SQL:

foreach($_POST as $key => $value) {

    $q  = "UPDATE `table` SET ";
    $q .= "stock=stock + '".$value."', ";
    $q .= "price='".$value."' ";
    $q .= "WHERE fid='".$fid."' AND vid='".$key."'";

    echo $q.'<br />';

}

但是它的输出:

UPDATE `stock` SET stock=stock + '1', price='1' WHERE fid='9' AND vid='1'
UPDATE `stock` SET stock=stock + '22.00', price='22.00' WHERE fid='9' AND vid='1'
UPDATE `stock` SET stock=stock + '2', price='2' WHERE fid='9' AND vid='2'
UPDATE `stock` SET stock=stock + '12.00', price='12.00' WHERE fid='9' AND vid='2'

以如下形式更新查询的正确方法是什么?

UPDATE `stock` SET stock=stock + '1', price='22.00' WHERE fid='9' AND vid='1'
UPDATE `stock` SET stock=stock + '2', price='12.00' WHERE fid='9' AND vid='2'

【问题讨论】:

  • 修复循环,最好选择一种更明智的方法来传递 POST 参数。
  • @Jon,你能举个例子吗?
  • 添加html表单代码。或者尝试实现输入数组
  • 这很容易发生 SQL 注入。此外,您可以使用输入数组语法来循环输入。 stackoverflow.com/a/20184680/3714134

标签: php mysql batch-updates


【解决方案1】:

试试这个

<?php
// Input
$_POST['qty-1']=1;$_POST['uniprice-1']=22.00;$_POST['qty-2']=2;$_POST['uniprice-2']=12.00;


$x=0;$fid=9;
foreach($_POST as $key => $value) {


    $q  = "UPDATE `table` SET ";
    $key=str_replace("qty-","",$key);
    $value2=str_replace("uniprice-","",$key);
    $q .= "stock=stock + '".$value2."', ";
    if($x%2!=0)
    {
    $q .= "price='".$value."' ";
    $q .= "WHERE fid='".$fid."' AND vid='".$fkey."'";
    echo $q.'<br />';
    }
    $fkey=$key;
    $x++;
}
?>

【讨论】:

    【解决方案2】:
    $i = 1;
    while(isset($_POST['qty-'.$i]) && isset($_POST['uniprice-'.$i])) {
        $qty = $_POST['qty-'.$i];
        $price = $_POST['uniprice-'.$i];
    
        // query here..
    
        $i++;
    }
    

    更好的方法是以这种格式发送数据:

    Array
    (
        [0] => Array
            (
                [qty] => 1
                [uniprice] => 22
            )
    
        [1] => Array
            (
                [qty] => 2
                [uniprice] => 12
            )
    
    )
    

    您可以重命名表单的输入:

    qty1: <input type="text" name="data[0][qty]">
    price1: <input type="text" name="data[0][uniprice]">
    
    qty2: <input type="text" name="data[1][qty]">
    price2: <input type="text" name="data[1][uniprice]">
    

    这样你就可以循环使用:

    foreach ($_POST['data'] as $data) {
        echo 'qty: ', $data['qty'], "\n";
        echo 'uniprice: ', $data['uniprice'], "\n";
    }
    

    【讨论】:

      【解决方案3】:
      $test = array( "qty-1" => 1, "uniprice-1" => 22.00, "qty-2" => 2, "uniprice-2" => 12.00 );
      
      ///Make 2 Array
      
      $odd = array();
      $even = array();
      $i=0;
      foreach( $test as $key => $value ) {
      
          if( $i%2==0) { //Even
              $even[] = $value;
          }
          else {
              $odd[] = $value;
          }
      
          $i++;   
      }
      
      //then 
      
      $fid = 9;
      foreach($odd as $key => $value) {
      
      
          $q  = "UPDATE `table` SET ";
          $q .= "stock=stock + '".$even[$key]."', ";
          $q .= "price='".$value."' ";
          $q .= "WHERE fid='".$fid."' AND vid='".$even[$key]."'"; 
          echo $q.'<br />';   
      
      }
      

      【讨论】:

        【解决方案4】:

        最好这样使用数组;

        $array = Array ( array("qty" => 1, "uniprice" => 22.00) , array("qty" => 2, "uniprice" => 12.00) ) ;
        
            foreach ($array as $arr) {
        
                $q  = "UPDATE `table` SET ";
                $q .= "stock=stock + '".$arr['qty']."', ";
                $q .= "price='".$arr['uniprice']."' ";
                $q .= "WHERE fid=9 AND vid='".$arr['qty']."'";
        
                echo $q.'<br />';
        
        
            }
        

        【讨论】:

          猜你喜欢
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-16
          相关资源
          最近更新 更多