我一直在使用名为FeedAPI De-Dupe的Drupal模块从我的站点(MySQL)数据库中删除重复记录。该模块做得很好,但是当URL有时包含“www”时,我仍然留下一些“重复”,有时则不然。 code handling the duplicate detection是:
case 0: //url-based
$sql = "SELECT n.nid
FROM {node} n
INNER JOIN {feedapi_node_item} i ON i.nid=n.nid
WHERE type='%s' AND url = '%s'
LIMIT 1";
$dnid = db_result(db_query($sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
$url));
break;
有没有办法修改SQL以处理www / no-www案例?如果没有,是否有办法在单独的SQL查询中处理它?</ p>
答案 0 :(得分:2)
也许:
case 0: //url-based
$sql = "SELECT n.nid
FROM {node} n
INNER JOIN {feedapi_node_item} i ON i.nid=n.nid
WHERE type='%s' AND (url = '%s' OR url = '%s')
LIMIT 1";
$dnid = db_result(
db_query(
$sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
$url,
preg_replace('@//www.@', '//' $url)));
break;
但是,我现在无法自己测试。
答案 1 :(得分:1)
假设$url
包含完整的网址(包括http://
部分),以下代码应该按照您的要求执行:
preg_match('@^(?:http://)?([^/]+)@i', $url, $matches);
$sql = "SELECT n.nid
FROM {node} n
INNER JOIN {feedapi_node_item} i ON i.nid=n.nid
WHERE type='%s' AND (url = '%s' OR url = '%s')";
$dnid = db_result(db_query_range($sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
'http://www.' . $matches[1], 'http://' . $matches[1], 0, 1)
);
如果数据库中包含的URL包含“http://example.com/directory之类的值,那么您可以使用以下代码:
preg_match('@^(?:http://)?([^/]+)@i', $url, $matches);
$sql = "SELECT n.nid
FROM {node} n
INNER JOIN {feedapi_node_item} i ON i.nid=n.nid
WHERE type='%s' AND (url LIKE '%s' OR url LIKE '%s')";
$dnid = db_result(db_query_range($sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
'http://www.' . $matches[1] . '/%', 'http://' . $matches[1] . '/%', 0, 1)
);
在Drupal中,如果要限制从查询中获取的行数,则需要使用db_query_range()
。