希望有人能指出我正确的方向,因为我无法让它工作。 发生的情况是这样的: 我的客户端将(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 .'');
感谢您抽出宝贵的时间,非常感谢!
最佳答案
一些注意事项:
foreach ($rmdata[$key] as $field=>$value)
与foreach ($properties as $field=>$value)
相同这个上下文- 整个
if(isset($value))
事情可以通过使用if(!$value) continue; 启动循环来避免
- 当您选择 propid 时,您将选择表中的每一行,这当然不是您想要做的,因为您循环遍历所有行,并且只有每个行都使用最后一行。
- 构建更新部分的部分在几个方面存在缺陷。最简单的修复方法是认识到可以通过在循环后重新组合 $fields 和 $values 数组来获得正确的结果(如下所示)
- 我无法轻易看出哪里会出现键冲突,除非 $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 .'');
}
请注意,此技术要求数据中的某些内容具有冲突的 key ,以便触发 ON DUPLICATE KEY。如果数据数组中有某个值可以唯一地标识这些行,则该字段应该是数据库中的唯一键,这将导致这种冲突很好地发生。
关于php - 插入到 else 中从数组更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11498536/