【问题标题】:SQL and PHP Batch UpdateSQL 和 PHP 批量更新
【发布时间】:2013-01-29 22:36:02
【问题描述】:

我有下表包含以下值:

                        id   name  farmid   amount    cycleid   totalprice  quantity  month     year
                        1    DAP     1      2400        1         24000      10       DECEMBER  2012
                        2    UREA    1      2500        1         5000        2       DECEMBER  2012
                        3    SENCOR  1      1200        1         2400        2       DECEMBER  2012
                        4    DAP     2      2400        1         2400        1       DECEMBER  2012
                        5    UREA    2      2500        1         2400        1       DECEMBER  2012
                        6    SENCOR  3      2000        2         4000        2       DECEMBER  2012
                        7    DAP     1      3000        2         3000        1       JANUARY   2013
                        8    UREA    2      3000        2         6000        2       JANUARY   2013
                        9    SENCOR  3      3000        2         6000        2       JANUARY   2013

我在制定正确的 SQL 语句以进行批量更新时遇到问题,例如更新行的月份为 DECEMBER 年份为 2012 并且仅使用农场 ID 1 注意:农场行不能有多个cycleid 在同一个月,例如在 12 月。请帮助为上述问题提出正确的sql语句。这是我在code-igniter中尝试的:

     $chemicalarray = array(
            1=>array('name'=>$B41,'farmid'=>$farmname_id,'amount'=>$D41,'cycleid'=>$cycleid,'totalprice'=>$E41,'quantity'=>$C41,'year'=>$E4,'month'=>$E5),
            2=>array('name'=>$B42,'farmid'=>$farmname_id,'amount'=>$D42,'cycleid'=>$cycleid,'totalprice'=>$E42,'quantity'=>$C42,'year'=>$E4,'month'=>$E5),
            3=>array('name'=>$B43,'farmid'=>$farmname_id,'amount'=>$D43,'cycleid'=>$cycleid,'totalprice'=>$E43,'quantity'=>$C43,'year'=>$E4,'month'=>$E5),
            4=>array('name'=>$B44,'farmid'=>$farmname_id,'amount'=>$D44,'cycleid'=>$cycleid,'totalprice'=>$E44,'quantity'=>$C44,'year'=>$E4,'month'=>$E5),
            5=>array('name'=>$B45,'farmid'=>$farmname_id,'amount'=>$D45,'cycleid'=>$cycleid,'totalprice'=>$E45,'quantity'=>$C45,'year'=>$E4,'month'=>$E5),
                              );
                    foreach ($chemicalarray as $key) {
                        $unitsql = "UPDATE chemical SET name = '{$key['name']}', farmid = '{$key['farmid']}' , 
                                        amount = '{$key['amount']}' , cycleid = '{$key['cycleid']}' , 
                                        totalprice = '{$key['totalprice']}', quantity = '{$key['quantity']}' 
                                    WHERE year = '{$key['year']}'
                                        AND month = '{$key['month']}'"; 
                        $q = mysql_query($unitsql); 
                        echo $key['name']; 
                        echo $key['amount']; 
                        if($q==true){ }else{ echo mysql_error(); }
                    }


Output of var_dump is :
array(8) { ["name"]=> string(8) "Round Up" ["farmid"]=> string(1) "1" ["amount"]=> float(1300) ["cycleid"]=> string(1) "1" ["totalprice"]=> float(15600) ["quantity"]=> float(12) ["year"]=> float(2012) ["month"]=> string(8) "DECEMBER" } Done11array(8) { ["name"]=> string(7) "Krismat" ["farmid"]=> string(1) "1" ["amount"]=> float(1500) ["cycleid"]=> string(1) "1" ["totalprice"]=> float(15000) ["quantity"]=> float(10) ["year"]=> float(2012) ["month"]=> string(8) "DECEMBER" } Done11array(8) { ["name"]=> string(3) "DAP" ["farmid"]=> string(1) "1" ["amount"]=> float(2500) ["cycleid"]=> string(1) "1" ["totalprice"]=> float(75000) ["quantity"]=> float(30) ["year"]=> float(2012) ["month"]=> string(8) "DECEMBER" } Done11array(8) { ["name"]=> string(4) "Urea" ["farmid"]=> string(1) "1" ["amount"]=> float(2000) ["cycleid"]=> string(1) "1" ["totalprice"]=> float(50000) ["quantity"]=> float(25) ["year"]=> float(2012) ["month"]=> string(8) "DECEMBER" } Done11array(8) { ["name"]=> string(9) "Dual Gold" ["farmid"]=> string(1) "1" ["amount"]=> float(2500) ["cycleid"]=> string(1) "1" ["totalprice"]=> float(75000) ["quantity"]=> float(30) ["year"]=> float(2012) ["month"]=> string(8) "DECEMBER" }

【问题讨论】:

  • 你尝试了什么?你的 SQL 在哪里?
  • 这是我在代码点火器中尝试的: foreach ($chemicalarray as $key) {$unitsql = "UPDATE chemical SET name = '{$key['name']}', farmid = '{$key['farmid']}' , 金额 = '{$key['amount']}' , cycleid = '{$key['cycleid']}' , totalprice = '{$key['totalprice' ]}', 数量 = '{$key['quantity']}' WHERE year = '{$key['year']}' AND month = '{$key['month']}'"; $q = mysql_query($unitsql);回声 $key['name'];回声 $key['数量']; if($q==true){ }else{ echo mysql_error(); } }
  • 请使用该信息编辑您的原始问题,以便正确显示。您遇到了什么错误或意外行为?
  • 我只将数组的第一个值保存在数组的所有行中,而忽略应该更新其他行的其他值
  • Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDO 或MySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial.

标签: php mysql sql codeigniter


【解决方案1】:

您只是为每个月-年组合重复更新相同的确切行。如果您需要将更新限制为仅某些 year-month-farmid 组合,则需要在 WHERE 子句中添加 farmid。

【讨论】:

  • 我试过了,还是不行。它仅使用循环的最后一个值更新行。还有其他建议吗?
  • 很难说不知道 $chemicalarray 持有什么,您可能想将该数组的 var_dump 添加到您的问题中。
  • 我刚刚重新编辑了代码并包含了$chemicalarray的内容
  • 您的数组中的所有值都具有相同的年-月-farmid 变量,因此您只需在每次通过时对数据库的这些相同的行集进行更新,因此所有内容都会更新到最后一组值。在我看来,也许还应该添加“名称”作为 WHERE 条件。通过它真的很奇怪,您将构建将像这样更新每个文件的数组。如果 name、farmid、month 和 year 是静态的,而其他字段是正在更新的字段,则甚至不需要将静态字段放入数组中。
  • 那么我应该删除它们再试一次吗?
猜你喜欢
  • 2012-01-10
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
相关资源
最近更新 更多