【问题标题】:insert or update mysql records with phprets使用 phprets 插入或更新 mysql 记录
【发布时间】:2015-04-28 18:37:56
【问题描述】:

我有一些使用 php 库 phprets 将当前属性同步到 MySQL 数据库的 php 代码。我在将记录放入其中时使用 REPLACE INTO 效果很好,我将 MLS 编号设置为 UNIQUE。问题是我必须更改它,因为我在事实之后向表中添加了带有两个额外列 lat 和 long 的地理编码,而 REPLACE 将删除地理编码。所以我改用 INSERT ON DUPLICATE UPDATE 语句。 Not is 似乎没有插入新记录。更新似乎工作正常。

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";

}

【问题讨论】:

  • 警告:如果您只是学习 PHP,请不要学习过时的 mysql_query 接口。这很糟糕,并且在 PHP 的未来版本中被删除。像PDO is not hard to learn 这样的现代替代品。像PHP The Right Way 这样的指南可以帮助解释最佳实践。始终绝对确定您的用户参数是properly escaped,否则您将遇到严重的SQL injection bugs
  • @tadman Jay Blanchard 通常会进来发帖,但我想他参加这个聚会有点晚了哈哈。
  • 是的,我意识到它的旧代码我正在使用来自 phprets 示例的同步代码。我会尽快更新。关于我在哪里插入错误的任何想法?
  • 尝试回显$query 看看它是什么样子的。可能是引用有问题。
  • 我做的似乎是正确的。我不能在这里发布它太长了

标签: php mysql rets


【解决方案1】:

这并不能回答您的直接问题,但如果您改回 REPLACE INTO 流程,您可以从数据库中提取现有的纬度/经度值并将其放入数组中,这样您的流程的其余部分就好像它们确实来自 RETS 服务器(而不是吹走您可能已经在那里拥有的任何值)。这也让您有机会确定您是否已经拥有地理编码(如果没有,可以在那时完成并以相同的方式进行输入)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2014-02-27
    • 2020-07-19
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多