0

私はこれを機能させることができないので、誰かがこれで私を正しい方向に向けることができることを願っています。クライアントが (Rightmove) .blm ファイルをサーバーにアップロードし、スクリプトが zip ファイルを解凍し、パーサーを使用してプロパティを配列に取得します。ここからデータベースに INSERT を実行できますが、問題はありません。存在する場合はデータベース内の情報を更新するためにこれが必要です。それ以外の場合は、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 にプロピッドが含まれていない限り、または他のキーがあり、それがコード、これで問題ありません。

以下は、あなたのコードから直接コピーし、これらの問題に対処するために修正したコードです。

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 をトリガーするために、データ内の何かが競合するキーを持つ必要があることに注意してください。これらの行を一意に識別できる値がデータ配列にある場合、そのフィールドはデータベース内の UNIQUE KEY である必要があります。これにより、この競合が非常にうまく発生します。

于 2012-07-16T06:04:17.337 に答える