Как устранить «дублирующиеся» URL строки MySQL, которые могут начинаться или не начинаться с www? - PullRequest
1 голос
/ 30 июля 2010

Я использовал модуль Drupal под названием FeedAPI De-Dupe для удаления дублирующихся записей из базы данных моего сайта (MySQL). Модуль отлично работает, но у меня все еще остаются некоторые «дубликаты», когда URL-адреса иногда содержат «www», а иногда нет. Код , обрабатывающий обнаружение дубликатов :

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?

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Может быть:

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 голос
/ 31 июля 2010

Предположим, что $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-адрес, содержащийся в базе данных, содержит такие значения, как `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().

...