用于插入DB的日期过滤器

时间:2014-09-19 11:08:02

标签: php mysql sql database

我为我们的一个客户构建了一个简单的抓取工具。我在数据库中遇到重复条目的问题。

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

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

原因是,如果名称至少在2年前被INSERTED,则该名称可以重复。因此,只要创建日期在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

所以是的,我花了太多时间查看这段代码,我无法弄清楚为什么我的过滤器无效。我希望它与我如何管理时间有关,但不完全确定。

请指教!

1 个答案:

答案 0 :(得分:0)

您应该在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