0

希望有人能指出我正确的方向,因为我无法让它工作。这就是发生的情况:我的客户端将(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 .'');

感谢您抽出宝贵的时间,非常感谢!

4

1 回答 1

1

几个注意事项:

  1. foreach ($rmdata[$key] as $field=>$value)foreach ($properties as $field=>$value)与此上下文中的相同
  2. if(isset($value))通过启动该循环可以避免整个事情if(!$value) continue;
  3. 当您选择 propid 时,您正在选择表格中的每一行,这肯定不是您打算做的,因为您循环遍历它们并且每次都使用最后一个。
  4. 构建更新部分的部分在几个方面存在缺陷。最简单的解决方法是意识到您可以通过在循环后重新组合 $fields 和 $values 数组来获得正确的结果(如下所示)
  5. 我不能轻易看出你会在哪里得到键冲突,除非 $rmdata 将包含一个 propid,如果它是更新而不是插入,或者如果有其他键并且它只是被处理而没有在代码,这很好。

下面是我直接从你那里复制的代码,只是为了解决这些问题而进行了修改:

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。如果数据数组中有一些值可以唯一标识这些行,则该字段应该是数据库中的唯一键,这将导致这种冲突很好地发生。

于 2012-07-16T06:04:17.337 回答