根据更改列名称将静态SQL更新更改为动态

时间:2011-09-01 19:13:16

标签: php mysql dynamic

好的,昨晚我问了一个问题并收到了一些非常好的回复。由于这是我第一次使用StackOverflow,我真的很高兴。

我希望你们可以帮助一个新的。希望在未来的路上,我能够回报一些新手的新宠。

我在php文件中有以下代码:

  $sql = "";
  $now=date("Y-m-d h:i:s");
  $updatedRecords = $json1->{'updatedRecords'};
  foreach ($updatedRecords as $value){
     $sql = "update `acea` set ".
      "`ACEA_A1`='".$value->ACEA_A1 . "', ".
      "`ACEA_A2`='".$value->ACEA_A2 . "', ".
      "`ACEA_A3`='".$value->ACEA_A3 . "', ".
      "`ACEA_A4`='".$value->ACEA_A4 . "', ".
      "`ACEA_A5`='".$value->ACEA_A5 . "', ".
      "`ACEA_B1`='".$value->ACEA_B1 . "', ".
      "`ACEA_B2`='".$value->ACEA_B2 . "', ".
      "`ACEA_B3`='".$value->ACEA_B3 . "', ".
      "`ACEA_B4`='".$value->ACEA_B4 . "', ".
      "`ACEA_B5`='".$value->ACEA_B5 . "', ".
      "`ACEA_E1`='".$value->ACEA_E1 . "', ".
      "`ACEA_E2`='".$value->ACEA_E2 . "', ".
      "`ACEA_E3`='".$value->ACEA_E3 . "', ".
      "`ACEA_E4`='".$value->ACEA_E4 . "', ".
      "`ACEA_E5`='".$value->ACEA_E5 . "', ".
      "`ACEA_E7`='".$value->ACEA_E7 . "' ".
      "where `acea_id`=".$value->acea_id;
      if(mysql_query($sql)==FALSE){

        $errors .= mysql_error();
      }
  }

“ACEA_XX”部分与“acea”数据库表中的列(显然)相关,但程序员静态地设置它们。不幸的是,需要定期添加这些列,并创建与引入的新ACEA规范相关的新列。

因此,此代码已过时。

每次添加新列时都不必进入并更新此代码,如何重新设计此代码以便动态更新以包含新列?我整个上午都在尝试使其工作,我可以设置它以便我可以动态地将实际的列名插入到update语句中,但是,我似乎无法动态地动态获取关联的值(我认为我抓取和插入列名的方法有点复杂。

我的实际数据库表列目前是:

acea_id ACEA_A1 ACEA_A2 ACEA_A3 ACEA_A4 ACEA_A5 ACEA_B1 ACEA_B2 ACEA_B3 ACEA_B4 ACEA_B5 ACEA_E1 ACEA_E2 ACEA_E3 ACEA_E4 ACEA_E5 ACEA_E6 ACEA_E7 ACEA_E9 oil_data_id

第一列和最后一列永远不会改变,并将继续作为第一列和最后一列。任何新列都将添加到介于两者之间,但不一定紧接在“oil_data_id”列之前。

为了正确获取值,我尝试了多种方式修改代码,但却无法使其正常工作。

任何人都对代码进行了简洁的修改,以实现我的目标吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

首先,我强烈建议将其放入一个单独的表格中(如果愿意的话,将数据转向“横向”)。假设这不可行:

$sql = "";
$updatedRecords = $json1->{'updatedRecords'};
foreach ($updatedRecords as $values){
    $flist = array();
    $params = array();
    foreach ($values as $key => $value) {
        if (preg_match('/^ACEA_[A-Z]+\d+$/', $key)) {
            $flist[] = $key .'="%s"';
            $params[] = mysql_real_escape_string($value);
        }
    }

    $sql = "update `acea` set ". implode(', ', $flist) .
        "WHERE `acea_id`='%s'";
    $params[] = mysql_real_escape_string($value->acea_id);
    $sql = sprintf($sql, $params);

    if(mysql_query($sql)==FALSE){
        $errors .= mysql_error();
    }
}

答案 1 :(得分:0)

看起来像Doug Kress的方法吐出一些错误所以这是我的镜头:

$errors = array();
foreach($json1->updatedRecords as $record)
{
    $fields = array();

    foreach($record as $field => $value)
    {
        if(substr($field, 0, 5) === 'ACEA_')
        {
            $fields[] = $field.' = '.mysql_real_escape_string($value);
        }
    }

    // Check if there are any fields set to be updated.
    if(isset($fields[0]))
    {
        // I'm assuming $record->acea_id is an integer. If not,
        // replace '%d' with '%s'.
        $sql = "UPDATE `acea` SET %s WHERE `acea_id` = '%d';";
        $sql = sprintf($sql, implode(',', $fields), $record->acea_id);

        if(mysql_query($sql) === false)
        {
            $errors[] = mysql_error();
        }
    }
}