我为我们的一个客户构建了一个简单的抓取工具。我在数据库中遇到重复条目的问题。
基本上我正在做的是寻找一个有很多待售房屋的网站,然后从那里拉出地址,邮政编码,城镇,价格和状态。
稍后插入数据库时,我也会生成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
所以是的,我花了太多时间查看这段代码,我无法弄清楚为什么我的过滤器无效。我希望它与我如何管理时间有关,但不完全确定。
请指教!
答案 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