希望有人可以指出我正确的方向,因为我无法让这个工作。 这是发生的事情: 我的客户端将一个(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 .'');
感谢您的时间,非常感谢!
答案 0 :(得分:1)
几点说明:
foreach ($rmdata[$key] as $field=>$value)
与此上下文中的foreach ($properties as $field=>$value)
相同if(isset($value))
if(!$value) continue;
事件
以下是我直接从您的代码中复制并修改以解决这些问题的代码:
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。如果数据数组中有一些值可以唯一标识这些行,那么该字段应该是数据库中的唯一键,这将导致这种冲突发生得非常好。