【发布时间】: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
是的,我花了太多时间查看此代码,但我无法弄清楚为什么我的过滤器无法正常工作。我认为这与我如何管理时间有关,但并不完全确定。
请指教!
【问题讨论】:
-
在打开
<?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->add(new DateInterval('P2Y'));是否效果更好