А что в поле page_referal у родителей? Пусто? Тогда в запрос добавить WHERE
SELECT page_url, page_referal FROM pages WHERE page_referal<>'' ORDER BY page_referal
Если другая какая-то одинаковая инфа - то по ней исключить.
PS: Это все свелось к примитивному дереву, интересно, кто сможет угадать задачу по исходному сообщению?
Понятней не стало - могут ли быть разные родители у какой-то одной страницы?
Если в базе просто куча одинаковых записей, то
SELECT page_url, page_referal
меняем на
SELECT DISTINCT page_url, page_referal
HelpixSapex, может и страницы из индекса повылетали. В последние пару недель тут таких тем много, раскидывается гугл своим индексом направо и налево.
Вполне вероятно, что ошибся:) Теорией этого вопроса никогда не увлекался, зато на практике не раз сталкивался с проблемами именно такого написания. Если конструкция будет чуть более сложной, будут else и другие if - то можно запросто получить ошибку интерпретирования. С тех пор четко следую правилу - или на одной строке, или ставить фигурные скобки.
А то, что в теории так, как Вы написали - согласен, я некорректно написал.
весь мозг сломал, особенно с ошибками и без запятых:)
Задача какая? О чем все же речь? Тут родители или рефералы?
Изначально я понял, что нужна статистика, по которой видно, на какие страницы переходят люди с конкретных страниц, которые выступают в роли реферала. Это так?
PS: если глюк только в дублировании страниц, то
Этот код у меня в исходнике не просто так на одной строке был - т.к. 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: не проверял
Я бы сказал, подавляющее большинство 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> закрылся - срабатывает жадность и регулярка заканчивается.