Вставьте или обновите записи MySQL с помощью phprets

У меня есть некоторый код php, который использует phpre библиотеки php для синхронизации текущих свойств с базой данных MySQL. Я использовал REPLACE INTO, когда помещал записи, в которых работал отлично, у меня номер MLS установлен на UNIQUE. Проблема в том, что мне пришлось изменить это, потому что я добавляю геокодирование с двумя дополнительными столбцами lat и long в таблицу после того, как факт и REPLACE удалят геокодирование. Поэтому я перешел на оператор INSERT ON DUPLICATE UPDATE. Кажется, не вставлять новые записи. Обновление работает нормально.

foreach ($property_classes as $class) {

    echo "+ Property:{$class}<br>\n";

    //[][=$file_name = strtolower("property_{$class}.csv");
    //$fh = fopen($file_name, "w+");

    $maxrows = true;
    $offset = 1;
    $limit = 1000;
    $fields_order = array();

    while ($maxrows) {

        $query = "(Status=S,A,P,B,H),({$rets_modtimestamp_field}={$previous_start_time}+)";
        // run RETS search
        echo "   + Query: {$query}  Limit: {$limit}  Offset: {$offset}<br>\n";
        $search = $rets->SearchQuery("Property", $class, $query, array('Limit' => $limit, 'Offset' => $offset, 'Format' => 'COMPACT-DECODED', 'Count' => 1));

        if ($rets->NumRows() > 0) {

            if ($offset == 1) {
                // print filename headers as first line
                $fields_order = $rets->SearchGetFields($search);
                //fputcsv($fh, $fields_order);
            }

            // process results
            while ($record = $rets->FetchRow($search)) {
                $this_record = array();
                foreach ($fields_order as $fo) {
                    $this_record[] = $record[$fo];
                }
                //fputcsv($fh, $this_record);
                $clean_records = str_replace('"', '', $this_record);
                $astring = implode('", "', $clean_records); 
                $astringTwo = '"'.$astring.'"';
                $fieldsstring = implode(",", $fields_order);
                $upArray = array_combine($fields_order,$clean_records);
                foreach ($upArray as $key => $value) {
                    $upArray[$key] = $key . "='" . $value."'";
                }
                $upStr=implode(", ", $upArray);
                $query="INSERT INTO CRMLS_property_residential ($fieldsstring) VALUES ($astringTwo) ON DUPLICATE KEY UPDATE $upStr";
                mysql_query($query);
                //echo $query;
            }

            $offset = ($offset + $rets->NumRows());

        }

        $maxrows = $rets->IsMaxrowsReached();
        echo "    + Total found: {$rets->TotalRecordsFound()}<br>\n";

        $rets->FreeResult($search);
    }

    //fclose($fh);

    echo "  - done<br>\n";

}

1 ответ

Решение

Это не отвечает на ваш прямой вопрос, но если вы вернетесь к процессу REPLACE INTO, вы могли бы извлечь существующие значения lat/lon из вашей базы данных и поместить их в массив, чтобы остальная часть вашего процесса действовала так, как если бы они пришли с сервера RETS (вместо того, чтобы удалять любые значения, которые вы, возможно, уже имели там). Это также дает вам возможность определить, есть ли у вас уже геокоды (и если нет, то это можно сделать в то время и поставить таким же образом).

Другие вопросы по тегам