【问题标题】:Date filter for inserting into DB用于插入数据库的日期过滤器
【发布时间】:2014-09-19 11:08:02
【问题描述】:

我为我们的一个客户构建了一个简单的爬虫。我正面临数据库中重复条目的问题。

基本上我正在做的是查看一个有很多待售房屋的网站,然后从那里提取地址、邮政编码、城镇、价格和状态。

稍后插入数据库时​​,我还会生成 creation_date

这样做的原因是名称可以重复,以防它至少在 2 年前被插入。所以一所房子可以在数据库中出现两次,只要创建日期在至少 2 年的范围内。

<?php 
    //Comparison to current houses

    $query = mysql_query("SELECT street, postcode, town, price, status, creation_time, print_status FROM house"); // Selecting the table

    if (!$query) {
        die('Invalid query: ' . mysql_error()); // checking for errors
    }

    while ($row = mysql_fetch_array($query)) {
        // $row['street'];
        // $row['postcode'];
        // $row['town'];
        // $row['price'];
        // $row['status'];

        $creation_time = $row['creation_time'];
        $print_status = $row['print_status'];

        $c = 0;
        foreach ($houses as $house) {
            $creation_time_u = strtotime($creation_time); // Makes creation time into Unix
            $life_time = strtotime('+2 years', $creation_time_u); // Calculates +2 years from creation time
            if (($row['street'] == $house[0]) && ($row['postcode'] == $house[1]) && ($row['town'] == $house[2]) && ($life_time >= $now)) {
                    unset($houses[$c]); // maybe use implode? When i do unset its leaving the array but the values are gone, so we get an empty row
            }   
        }
        $c++;
        $houses = array_values($houses); // FIXES BROKEN INDEX AFTER USING UNSET
    }
?>

完成后, 我将新的 $houses 数组插入到数据库中,然后打印,这是下一步,但在这种情况下有点无关紧要。

所以,我不知道到底出了什么问题。如果我连续运行两次,它不会输入重复的条目,但如果我在第二天运行它或其他什么。

它输入相同但双倍。这是我在数据库中找到的示例:
screenshot

是的,我花了太多时间查看此代码,但我无法弄清楚为什么我的过滤器无法正常工作。我认为这与我如何管理时间有关,但并不完全确定。

请指教!

【问题讨论】:

  • 在打开 &lt;?php 标签 error_reporting(E_ALL); ini_set('display_errors', 1); 后立即将错误报告添加到文件顶部,看看它是否产生任何结果。还有or die(mysql_error())mysql_query()
  • 在插入任何数据之前以小写或大写形式保存数据。修剪多余的空格。这将帮助您检查数据。以后你可以展示你想要的任何方式。
  • 您可以使用新数组来存储要插入的值,而不是在行上使用 unset。调试也会更容易,因为您可以比较两个数组
  • @Fred-ii- 没有错误由此产生。但是,我确实尝试检查存储我的时间的变量,然后出现错误。我添加了echo $creation_time_u; echo $life_time; 行,然后我得到一个错误Notice: Undefined variable: creation_time_u in /home/whale/domains/whale-agency.com/public_html/svd_qa/crawl.php on line 78,这很奇怪,考虑到这些变量是在$houses 数组的foreach 循环中定义的。
  • @mikeyq6 好主意,伙计。我会试着看看我能不能弄清楚。我目前认为这是因为我格式化日期和创建 $life_time 变量的方式。现在测试使用$date-&gt;add(new DateInterval('P2Y')); 是否效果更好

标签: php mysql sql database


【解决方案1】:

您应该在 SQL 查询中选择相关房屋,而不是在 php 中计算时间间隔(参见 DATE_ADD here):

 SELECT 
      street, postcode, town, price, status, creation_time, print_status 
 FROM house AS a
 JOIN house AS b
      ON a.street = b.street
      AND a.postcode = b.postcode
      AND a.town = b.town
 WHERE
      a.creation_time <= DATE_ADD(creation_time, INTERVAL 2 YEARS) -- select duplicates

【讨论】:

  • 谢谢伙计。我将实施这种方法。我可以想象它也会使过程更快,因为我不必每次都查看完整的数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2010-11-08
  • 2011-04-06
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多