从数组插入else update

时间:2012-07-16 05:27:33

标签: php mysql arrays

希望有人可以指出我正确的方向,因为我无法让这个工作。 这是发生的事情: 我的客户端将一个(Rightmove).blm文件上传到服务器,脚本解压缩zip文件并使用解析器将属性转换为数组..从这里我能够插入数据库没有问题但是,我需要更新数据库中的信息(如果存在),否则插入为blm文件可能包含新属性或编辑的现有属性。 blm文件只包含属性信息,没有id等等,所以一旦插入到数据库中,我就通过自动生成给它一个id(propid)。

请查看下面的代码,希望您可能有一个建议,我可以用它来做我需要它做的事情:)

foreach ($rmdata as $key => $properties) {    

$fields = array();   
$values = array();

foreach ($rmdata[$key] as $field=>$value) { 
if (!isset($value)) {       

}

if (isset($value)) {

$sql_props = mysql_query("SELECT propid FROM epsales");
 while($row = mysql_fetch_array($sql_props)){
     $propid = $row["propid"];
}

$fields[] = $field; 
$values[] = "'".$value."'";

$array1 = array($field);
$array2 = array($value);

$sqlupdate = array_combine($array1, $array2);

foreach ($sqlupdate as $field=>$value) {
        $sql_update = "$field='$value', "; 
}
}   
}

$sql_fields = implode(', ', $fields);   
$sql_values = implode(', ', $values);


$sqlPropInsert = mysql_query('INSERT INTO epsales ('. $sql_fields .') VALUES ('.    $sql_values .') ON DUPLICATE KEY UPDATE SET '. $sql_update .'');

感谢您的时间,非常感谢!

1 个答案:

答案 0 :(得分:1)

几点说明:

  1. foreach ($rmdata[$key] as $field=>$value)与此上下文中的foreach ($properties as $field=>$value)相同
  2. 使用if(isset($value))
  3. 启动该循环可以避免整个if(!$value) continue;事件
  4. 当您选择propid时,您正在选择表中的每一行,当然这不是您打算做的事情,因为您遍历它们并且只有每一个都使用最后一个。
  5. 构建更新部分的部分在某些方面存在缺陷。最简单的解决方法是通过在循环后重新组合$ fields和$ values数组来实现正确的结果(如后所示)
  6. 我不知道你会在哪里得到密钥的冲突,除非$ rmdata包含一个propid,如果它是一个更新而不是一个插入,否则如果有一些其他的密钥,它只是在没有明确看到的情况下处理它在代码中,没问题。
  7. 以下是我直接从您的代码中复制并修改以解决这些问题的代码:

    foreach ($rmdata as $properties) {     
      $fields = array();   
      $values = array();
      $updates = array();
      foreach ($properties as $field=>$value) { 
        if (!$value) continue;
        $fields[] = $field; 
        $values[] = "'".$value."'";
        $updates[] = $field . '="'.$value.'"';
      }     
      $sql_fields = implode(', ', $fields);   
      $sql_values = implode(', ', $values);
      $sql_updates = implode(', ', $updates);
      $sqlPropInsert = mysql_query('INSERT INTO epsales ('. $sql_fields .') VALUES ('.    $sql_values .') ON DUPLICATE KEY UPDATE SET '. $sql_updates .'');
    }
    

    注意这项技术要求数据中的某些具有冲突的密钥才能触发ON DUPLICATE KEY。如果数据数组中有一些值可以唯一标识这些行,那么该字段应该是数据库中的唯一键,这将导致这种冲突发生得非常好。