DenIT

Рейтинг
123
Регистрация
03.01.2007

А что в поле page_referal у родителей? Пусто? Тогда в запрос добавить WHERE


SELECT page_url, page_referal FROM pages WHERE page_referal<>'' ORDER BY page_referal

Если другая какая-то одинаковая инфа - то по ней исключить.

PS: Это все свелось к примитивному дереву, интересно, кто сможет угадать задачу по исходному сообщению?

думаю:
Есть страница 1.html у неё родитель index.html грубо говоря, мне нужно вывести весь список страниц что бы не одна страница не повторялась, но в списке было видно - какие страницы под какими

Понятней не стало - могут ли быть разные родители у какой-то одной страницы?

Если в базе просто куча одинаковых записей, то

SELECT page_url, page_referal

меняем на

SELECT DISTINCT page_url, page_referal

HelpixSapex, может и страницы из индекса повылетали. В последние пару недель тут таких тем много, раскидывается гугл своим индексом направо и налево.

AndreM:
Вы уверены???

Вполне вероятно, что ошибся:) Теорией этого вопроса никогда не увлекался, зато на практике не раз сталкивался с проблемами именно такого написания. Если конструкция будет чуть более сложной, будут else и другие if - то можно запросто получить ошибку интерпретирования. С тех пор четко следую правилу - или на одной строке, или ставить фигурные скобки.

А то, что в теории так, как Вы написали - согласен, я некорректно написал.

весь мозг сломал, особенно с ошибками и без запятых:)

Задача какая? О чем все же речь? Тут родители или рефералы?

Изначально я понял, что нужна статистика, по которой видно, на какие страницы переходят люди с конкретных страниц, которые выступают в роли реферала. Это так?

PS: если глюк только в дублировании страниц, то

думаю:
if ($cur_page!=$row[page_referal])
echo '<h1>'.$row[page_referal].'</h1><br>';

Этот код у меня в исходнике не просто так на одной строке был - т.к. if без фигурных скобок выполняет только то, что стоит на той же строке. А в текущем виде этот if вообще ни на что не влияет. Верни все обратно:)

зачем такие простые вещи делать рекурсивно? Нужно экономить ресурсы, если только на этот блок потратится 10-30 запросов, а таких блоков на странице 10-20? Вот так и появляется новая статья расходов "оперативная память сервера", вместо оптимизации запроса.

Обычно, если вложенность неограниченна, проще вытащить нужные данные одним запросом, разложить их по массивам, и с ними уже работать. В одном массиве - информация о parent'e вида $Array[$pid][$id], получая id разделов - из другого массива получаем остальные данные по $id и рисуем карту ($Pages[$id]['name'], $Pages[$id]['url'] и т.п.).

Если карта строго двухуровневая (по примерам, которые приводятся авторами в подобных темах, нихрена не угадать, что же он конкретно имел в виду), а с массивами возиться не хочется - то можно просто вытащить информацию о втором уровне (WHERE pid<>0 ORDER BY pid,id), а название родителя подцепить в тот же запрос через LEFT JOIN, и вывести так, как я предлагал в соседнем топике.


$res=mysql_query("SELECT page_url, page_referal FROM pages ORDER BY page_referal");
while ($row=mysql_fetch_array($res))
{
if ($cur_page!=$row[page_referal]) echo '<b>'.$row[page_referal].'</b><br>';
echo '- '.$row[page_url].'<br>';
$cur_page = $row[page_referal];
}

PS: не проверял

netwind:
одна проблема - некоторые старые документы представляют из себя неправильный XML и приходится прибегать к ухищрениям.

Я бы сказал, подавляющее большинство html-страниц, особенно эволюционирующих в процессе жизни (навешивание всякой фигни в макеты и т.п.) - представляют из себя абсолютно неправильный XML. И Xpath (имхо, конечно же) тут будет смотреться совсем не к месту, html и xml - это разные вещи.

Раньше я такое делал с помощью substr и strstr (отрезаешь 200 символов, ищешь первое вхождение '. ', заменяешь на '.<br> ', идешь дальше по циклу, склеивая за собой куски) :)

Регуляркой никогда не пробовал, поэтому смогу сделать только экспериментальным путем, но времени нет столько сейчас... Смысл где-то рядом:

preg_replace($pattern, $replacement, $string);

$pattern = "/(.+?){200,}\.\s/is";
$replacement = "\${1}.<br> ";

Т.е. ищем после 200-го любого символа точку с пробелом и заменяем найденное + точка с <br> и пробелом.

За синтаксис совершенно не ручаюсь, пытался передать смысл, а не работающую регулярку ;)

zhidronsss, если нужно только одно значение, то будет работать и без промежуточных тегов:

<a>.*?<b>(.+?)<\/b>

Все, как только <b> закрылся - срабатывает жадность и регулярка заканчивается.

Всего: 872