Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何消除;“重复”;URL MySQL行可能以www开头,也可能不以www开头?_Php_Sql_Mysql_Drupal_Duplicates - Fatal编程技术网

Php 如何消除;“重复”;URL MySQL行可能以www开头,也可能不以www开头?

Php 如何消除;“重复”;URL MySQL行可能以www开头,也可能不以www开头?,php,sql,mysql,drupal,duplicates,Php,Sql,Mysql,Drupal,Duplicates,我一直在使用一个名为Drupal的模块从我的站点(MySQL)数据库中删除重复记录。这个模块做得很好,但是当URL有时包含“www”,有时不包含时,我仍然会留下一些“副本”。最重要的是: 有没有办法修改SQL以同时处理www/no www情况?如果没有,是否有办法在单独的SQL查询中处理它?可能: case 0: //url-based $sql = "SELECT n.nid FROM {node} n INNER JOIN {feedapi_node_item} i ON i.n

我一直在使用一个名为Drupal的模块从我的站点(MySQL)数据库中删除重复记录。这个模块做得很好,但是当URL有时包含“www”,有时不包含时,我仍然会留下一些“副本”。最重要的是:

有没有办法修改SQL以同时处理www/no www情况?如果没有,是否有办法在单独的SQL查询中处理它?

可能:

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;

但是,我现在不能自己测试它。

假设
$url
包含完整的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包含像`这样的值,则可以使用以下代码:

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\u query\u range()

我认为这行不通,因为url字段包含完整的url(即“not”example.com”)。好的,我根据这一点修改了代码。仍然未经测试,可能需要一些修改,但您知道了。
$url
包含哪些内容?完整的URL,或者仅仅是域?kiamlanu,$URL包含完整的URL,例如:Doh!我发布的代码只是成功的一半。它避免了添加新条目时出现重复。另一个函数删除已添加的重复项:case 0://url-based$sql=“选择GROUP_-CONCAT(i.nid分隔符“,”)作为nid,
title
url
,count(*)作为num从{node}n内部联接{feedapi_-node_-item}i.nid=n.nid上的i,其中type='%s'GROUP BY
url
HAVING
url
不为空,url!=''和num>1 ORDER BY num desc LIMIT%d”;打破我甚至不想问,因为你们俩都非常乐于助人,但如果您对本节有任何想法,我将不胜感激!哇,这些注释中的代码并不是很清晰。让我再试一次。。。啊!我刚刚意识到我发布的代码只是成功的一半。它避免了添加新条目时出现重复。feedapi_deduplicate_clean_duplicates函数用于删除已添加的重复项(请参阅文件底部):我甚至不想问,因为你们都非常有帮助,但如果您想在该函数中添加www/无www检查,也将不胜感激!即使是指向正确方向的指针也会有所帮助。再次感谢!
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)
);