Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Добавление параметров
 
 автор: Лена   (17.06.2010 в 22:14)   письмо автору
 
 

Есть ссылки:
print "<a href='?a=1'>Ссылка 1</a><br />";
print "<a href='?a=2'>Ссылка 2</a><br />";
print "<a href='?a=3'>Ссылка 3</a>";
Подскажите, пожалуйста, как сделать так, чтобы при нажатии на первую ссылку, ее гет-параметр писался во все остальные ссылки?
А в первой ссылке - не писался:
print "<a href='?a=1'>Ссылка 1</a><br />";
print "<a href='?a=2&par=1'>Ссылка 2</a><br />";
print "<a href='?a=3&par=1'>Ссылка 3</a>";
При нажатии на вторую - опять параметр добавлялся, но во второй ссылке - все по прежнему:
print "<a href='?a=1&par=2'>Ссылка 1</a><br />";
print "<a href='?a=2&par=1'>Ссылка 2</a><br />";
print "<a href='?a=3&par=1&par2=2'>Ссылка 3</a>";


Есть вариант в каждой ссылке прописать $par = $par1 . $par2 . $par3 . $par4; - и если не пустое, выводить. но пока ни так, ни так не получается.
И третий вариант - записать в сессию, только сессия у меня получается внутри рекурсии. Опять ерунда...

  Ответить  
 
 автор: psychomc   (17.06.2010 в 23:35)   письмо автору
 
   для: Лена   (17.06.2010 в 22:14)
 

помнится, вы в одной из ранних тем упрекали кого-то что он создаем глупые (или в таком роде) темы :)

  Ответить  
 
 автор: Лена   (17.06.2010 в 23:40)   письмо автору
 
   для: psychomc   (17.06.2010 в 23:35)
 

помнится, вы в одной из ранних тем говорили, что не надо втупую умничать и если не знаешь, чем помочь - проходи мимо.
Скатертью дорожкой :)

  Ответить  
 
 автор: psychomc   (17.06.2010 в 23:42)   письмо автору
 
   для: Лена   (17.06.2010 в 23:40)
 

знаю чем помочь - видимо форумом ошиблись ))

да и сама задача настолько некорректна, что плакать хочется

  Ответить  
 
 автор: neadekvat   (17.06.2010 в 23:38)   письмо автору
 
   для: Лена   (17.06.2010 в 22:14)
 

Может, вы лучше задачу опишите? Ну, какое-то сомнительное решение, право..

  Ответить  
 
 автор: Лена   (17.06.2010 в 23:45)   письмо автору
 
   для: neadekvat   (17.06.2010 в 23:38)
 

Решение действительно не очень хорошее.
Но как сделать - не знаю, варианты многие перепробовала.
Задача такая. На страницу рекурсивно выводится дерево ссылок.
При нажатии на одну ссылку - id ее категории должен прописываться в других ссылках как гет-параметр.
Зайдите сюда -http://hotline.ua/gd/72/7216-7217-1016/. Здесь товары ищутся по фильтру. В адресной строке 7216-7217-1016 - это ид категорий, которые пользователь выбрал для поиска.
Мне надо сделать аналогичный фильтр.

  Ответить  
 
 автор: Рома   (17.06.2010 в 23:53)   письмо автору
 
   для: Лена   (17.06.2010 в 23:45)
 

http://www.softtime.ru/forum/addpost.php?id_forum=1&id_theme=74526&id_post=439041

http://www.softtime.ru/forum/addpost/1-74526-439041/

rewrite, implode

кажется так

  Ответить  
 
 автор: Лена   (18.06.2010 в 00:08)   письмо автору
 
   для: Рома   (17.06.2010 в 23:53)
 

не понятно, как через implode.

  Ответить  
 
 автор: Рома   (18.06.2010 в 00:34)   письмо автору
 
   для: Лена   (18.06.2010 в 00:08)
 

очепятка по невнимательности, explode конечно же имелся в виду.

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 00:09)   письмо автору
 
   для: Рома   (17.06.2010 в 23:53)
 

Такое чувство, что вы сейчас про реализацию ЧПУ говорите.

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 00:08)   письмо автору
 
   для: Лена   (17.06.2010 в 23:45)
 

Хм...а вам обязательно ссылками? можно расставить чекбоксы, например, и при добавлении чекбокса отправлять форму с id включеных чекбоксов. Ну, расставить чекбосы по местам после перезагрузки страницы - уже дело техники.

А если делать точь в точь, как на показанном сайте..
Создать функицю, которая в качестве аргумента принимает id категории (т.е. она будет формировать ссылки для категорий). Допустим, что исходный адрес (в вашем случаи это http://hotline.ua/gd/72 ) известен, значит, все то, что дальше - это уже пункты фильтра. Ищем (обычным strpos, в условии ставим "-%номер%-" тогда накладок не будет) переданный id - если его нет, то возвращаем весь кусман-фильтр + этот id.

Что-то такое:
<?php
function do_link($id)
{
    
$url substr($_SERVER['REQUEST_URI'], strlen('/gd/72/'));
    
$pos strpos($url'-' $id '-');
    if (
$pos === false)
        return 
$url '-' $id;
    else
        return 
$url;
}

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

Ну и формироваться ссылки так будут:
<a href="http://hotline.ua/gd/72/<?php echo do_link(123); ?>">Пункт</a>


Да, и еще.
Вот сейчас добавил "-" в функцию и думаю.
Если БЕЗ них - то может быть накладка. То есть проверяем каталог с id 123, а он его находит в каталоге с id 1234.
Если с ними - то очевидно, если id будет стоять в начале или в конце (или и там и там :) ), то его не найдет и добавит к ссылке.
Так что, наверное, лучше проверять регуляркой - просто чтобы с обеих сторон не было цифер.

  Ответить  
 
 автор: Лена   (18.06.2010 в 00:19)   письмо автору
 
   для: neadekvat   (18.06.2010 в 00:08)
 

neadekvat, спасибо, сейчас буду пробовать на своем, отпишусь, что получится.

  Ответить  
 
 автор: Лена   (18.06.2010 в 00:55)   письмо автору
 
   для: neadekvat   (18.06.2010 в 00:08)
 

Я делаю так:
Скрипт par.php

<?php

function do_link($id)
{
    
$url substr($_SERVER['REQUEST_URI'], strlen('par/cat/72/id/'));
    
$pos strpos($url'-' $id '-');
    if (
$pos === false)
        return 
$url '-' $id;
    else
        return 
$url;
}
?>
<a href="par/cat/72/id/<?php echo do_link(123); ?>">Пункт</a><br />
<a href="par/cat/72/id/<?php echo do_link(34); ?>">Пункт2</a><br />
<a href="par/cat/72/id/<?php echo do_link(12); ?>">Пункт3</a>


И условие для модреврайта:

RewriteEngine on
RewriteBase /
RewriteRule ^par/cat/([0-9]+)/id/([0-9]+)$ par.php?cat=$1&id=$2 [L]


Ссылки нерабочие получаются.

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 01:01)   письмо автору
 
   для: Лена   (18.06.2010 в 00:55)
 

^par/cat/([0-9]+)/id/([0-9]+)$
Там ведь не только цифры могут быть.
А еще в $_SERVER['REQUEST_URI'] попадает строка, начиная с /, по-моему, то есть по идее должно быть так:
substr($_SERVER['REQUEST_URI'], strlen('/par/cat/72/id/'))

И вообще странно, что вы не можете найти, в какой момент скрипт перестает работать как запланировано :)

И прочитайте мой пост - я два раза его дополнял.

  Ответить  
 
 автор: Лена   (18.06.2010 в 01:24)   письмо автору
 
   для: neadekvat   (18.06.2010 в 01:01)
 

RewriteRule ^par/cat/([0-9]+)/id/([0-9\-]+)$ par.php?cat=$1&id=$2 [L]

$_SERVER['REQUEST_URI'] у меня выдает /par.php

Я наверное, уже спать пойду, завтра проверку через регулярку напишу.

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 01:35)   письмо автору
 
   для: Лена   (18.06.2010 в 01:24)
 

> RewriteRule ^par/cat/([0-9]+)/id/([0-9\-]+)$ par.php?cat=$1&id=$2 [L]
Тут обратный слэш не нужен, насколько я помню рег.выражения. То есть "-" воспринимается как "-", если он не является перечислением. А вот прямой слэш скорее всего надо добавить, т.к. браузеры любят в конце добавлять его.

> $_SERVER['REQUEST_URI'] у меня выдает /par.php
http://www.softtime.ru/info/articlephp.php?id_article=69
Попробуйте разные индексы (нужный вам будет ближе к концу страницы), вы должны иметь всю строку, кроме адреса. Но именно ту, что видит пользователь, то есть ДО того, как включается ваш реврайт.

> Я наверное, уже спать пойду
Я благословляю вас.

> проверку через регулярку напишу
"/[^\d]$id[^\d]/"
По-моему, так :) Разве что в конце строки в любом случаи должен быть хотя бы прямой слэш (можно $url = rtrim($url, '/') . '/' и проверять).
Можно было бы "заглядывания", но по-моему [^\d] в заглядывании не работает :) Хотя пробуйте, не рискну больше за парсер выступать.

P.S. у меня почему столько "неуверенности" (скорее всего, по-моему) - я пишу, не тестируя, но вы проверьте все варианты, а то потом на мелочи будет скрипт запарываться - хрен найдете, мягко говоря.

  Ответить  
 
 автор: Лена   (18.06.2010 в 11:10)   письмо автору
 
   для: neadekvat   (18.06.2010 в 01:35)
 

Сделала пока без модреврайт. Попробовала вывести весь список из базы, вроде как нормально работает.
Но с проверкой по паттерну не проходит. Я ее пока закомментила.

<?
function do_link($id){
    
$url substr($_SERVER['REQUEST_URI'], strlen('/prop.php?id='));
    
$pos strpos($url'-' $id '-');

    
//if (preg_match("/[^\d]" . $id . "[^\d]/u", $url)){
    //$url = rtrim($url, '/');
    
if ($pos === false){
        if(
$url == '')
        return 
$id;
        else
        return 
$url '-' $id;
    }else
        return 
$url;
    
//}
}

?>
<a href="par.php?id=<?php echo do_link(123); ?>">Пункт</a><br />
<a href="par.php?id=<?php echo do_link(34); ?>">Пункт2</a><br />
<a href="par.php?id=<?php echo do_link(12); ?>">Пункт3</a>

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 11:54)   письмо автору
 
   для: Лена   (18.06.2010 в 11:10)
 

<?php
if (preg_match("/[^\d]" $id "[^\d]/u"$url)){ 
$url rtrim($url'/');


Это надо местами поменять :)

<?php
$url 
rtrim($url'/');
if (
preg_match("/[^\d]" $id "[^\d]/u"$url)){ 

  Ответить  
 
 автор: sim5   (18.06.2010 в 10:18)   письмо автору
 
   для: neadekvat   (18.06.2010 в 00:08)
 

$url = substr($_SERVER['REQUEST_URI'], strlen('/gd/72/'));
$pos = strpos($url, '-' . $id . '-');
..............

есть parse_str.

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 11:56)   письмо автору
 
   для: sim5   (18.06.2010 в 10:18)
 

А она(функция) разве не строку вида ?par1=value1&par2=value2 разбивает? А тут я предлагаю работать и формировать ссылки, которые будет видеть пользователь.

  Ответить  
 
 автор: sim5   (18.06.2010 в 12:11)   письмо автору
 
   для: neadekvat   (18.06.2010 в 11:56)
 

<?
$a 
parse_url('?a=3&par=1&par2=2');
print_r($a);
parse_str($a['query']);
echo 
'<br>'.$a.'<br>'.$par.'<br>'.$par2;

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 12:15)   письмо автору
 
   для: sim5   (18.06.2010 в 12:11)
 

<?php
$a 
parse_url('/par/value/par2/value2'); 
print_r($a); // Array ( [path] => /par/value/par2/value2 );

Я же говорю - предложил работать с исходной строкой в виде ЧПУ, а не с рабочими параметрами, которые пользователь видеть не должен.

В принципе, таки Лена исполнитель, и, я думаю, она уже сама решит, применять эту функцию или нет.

  Ответить  
 
 автор: sim5   (18.06.2010 в 12:22)   письмо автору
 
   для: neadekvat   (18.06.2010 в 12:15)
 

Я вашего ЧПУ вообще не касаюсь, я вижу как в РНР разбирается строка запроса. К тому же, ЧПУ перенаправит на скрипт и опять таки отдаст скрипту не '/par/value/par2/value2', а иное, не так ли?
Не мутите воду.

  Ответить  
 
 автор: neadekvat   (18.06.2010 в 12:27)   письмо автору
 
   для: sim5   (18.06.2010 в 12:22)
 

Скрипту, да, отдаст.
Но нам-то надо ссылку сформировать для пользователя, именно в виду ЧПУ.
И чем гонять параметры из ЧПУ обратно и снова в ЧПУ - проще работать с одной строкой. Ну, мне было бы проще.

  Ответить  
 
 автор: sim5   (18.06.2010 в 12:35)   письмо автору
 
   для: neadekvat   (18.06.2010 в 12:27)
 

Да формируйте на здоровье, я запрещаю что-ли?
Я вижу разбор url запроса, есть для этого функции, вот и все.

  Ответить  
 
 автор: Лена   (19.06.2010 в 16:55)   письмо автору
 
   для: neadekvat   (18.06.2010 в 12:15)
 

Спасибо большое, что помогли. Только что закончила, вывесила пока что сюда - http://zubadan.inexbuild.com/prop.php, заказ шел без дизайна, поэтому выглядит все просто.

Единственное, что пришлось добавить в вашу функцию, так это еще и привязку к постраничной навигации:

<?php
$page1 
$_GET['page_num'];
function 
do_link($id,$page1){
    if(
$page1)
        
$page_num 'page_num=' $page1 '&';
    
$url substr($_SERVER['REQUEST_URI'], strlen('/prop.php?' $page_num 'id='));
    
$pos strpos($url'-' $id '-');
//ну и так дальше....



А вот с if (preg_match("/[^\d]" . $id . "[^\d]/u", $url)) так и не получилось ничего, но мне кажется, что оно на результат не влияет.

  Ответить  
 
 автор: neadekvat   (19.06.2010 в 17:00)   письмо автору
189.6 Кб
 
   для: Лена   (19.06.2010 в 16:55)
 

Увы, к ссылкам таки добавляется уже выбранное (аттач)
(мышка на пункте LESSAR)


Это то, о чем я говорил: если id в начале или в конце, то не сработает, ибо там нет "-". Потому заставляйте работать регулярку.

  Ответить  
 
 автор: Trianon   (19.06.2010 в 17:33)   письмо автору
 
   для: neadekvat   (19.06.2010 в 17:00)
 

LESSAR - такая гадость, не дай шайтан..
Кондиционеры, я имею в виду.

  Ответить  
 
 автор: neadekvat   (19.06.2010 в 18:02)   письмо автору
 
   для: Trianon   (19.06.2010 в 17:33)
 

Ок, товар марки LESSAR покупать не буду :)

  Ответить  
 
 автор: Лена   (19.06.2010 в 20:45)   письмо автору
 
   для: neadekvat   (19.06.2010 в 17:00)
 

Ну не хочет у меня регулярка работать. Извратилась :))


<?php
function do_link($id,$page1){
if(
strpos($_GET['id'],"-"))
     
$arr explode('-',$_GET['id']);
if(
$page1)
        
$page_num 'page_num=' $page1 '&';

    
$url substr($_SERVER['REQUEST_URI'], strlen('/prop.php?' $page_num 'id='));
    
$pos strpos($url'-' $id '-');
    
$url rtrim($url'/');

     if(!
in_array($id,$arr)){
    
//if (preg_match("/[^\d]" . $id . "[^\d]/u", $url)){

        
if ($pos === false){
            if(
$url == '')
                return 
$id;
            else
                return 
$url '-' $id;
        }else
        return 
$url;
    
//}
    
}else{
        return 
$url;
    }
}
?>


Я на хосте не меняла, там все по старому.

  Ответить  
 
 автор: neadekvat   (19.06.2010 в 21:07)   письмо автору
 
   для: Лена   (19.06.2010 в 20:45)
 

Так, два вопроса по регулярке:
1. Зачем модификаор u, если вы с цифрами работаете?
2. у вас как-то условие странно..то есть, если вхождения есть - то участок надо _пропустить_, НЕ выполнять, а у вас все наоборот, если вхождения есть, то к ссылке добавлялся кусок, а если нет - то ничего не добавлялось)

Хотя решение с массивом неплохой. Вот только..если в _GET['id'] нет "-", то как работает in_array, ведь $arr не будет существовать.

Ну, или меня глючит уже, - этим можно завершить оба абзаца :)

  Ответить  
 
 автор: Лена   (20.06.2010 в 16:43)   письмо автору
 
   для: neadekvat   (19.06.2010 в 21:07)
 

>1. Зачем модификаор u, если вы с цифрами работаете?

Думала, что если utf, то 1 символ == переменное число байтов, в том числе и цифры. А сейчас посмотрела, это касается, как я поняла, только русских букв.
Я регвыражениями пользуюсь в самых крайних случаях :) поэтому и сноровки еще нет.

>2. у вас как-то условие странно..то есть, если вхождения есть - то участок надо _пропустить_, НЕ >выполнять, а у вас все наоборот, если вхождения есть, то к ссылке добавлялся кусок, а если нет - то >ничего не добавлялось)

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

>Хотя решение с массивом неплохой. Вот только..если в _GET['id'] нет "-", то как работает in_array, ведь >$arr не будет существовать.

Добавила проверку на существование $arr

  Ответить  
 
 автор: neadekvat   (20.06.2010 в 17:26)   письмо автору
 
   для: Лена   (20.06.2010 в 16:43)
 

Так-с. По идее, если фильтр выбран, то мне нужна возможность убрать этот фильтр - у вас это возможности не предусмотрено) Имеется в виду, что, возможно, я захочу убрать конкретную категорию, а не только все фильтры.

А про массив - лучше не существование проверять, а просто объявить пустой массив где-нибудь повыше и все.

  Ответить  
 
 автор: Лена   (21.06.2010 в 12:36)   письмо автору
 
   для: neadekvat   (20.06.2010 в 17:26)
 

>Так-с. По идее, если фильтр выбран, то мне нужна возможность убрать этот фильтр - у вас это возможности не предусмотрено) Имеется в виду, что, возможно, я захочу убрать конкретную категорию, а не только все фильтры.
>

Убрать фильтр - напротив каждого названия фильтра можно было бы крестик какой-нибудь поставить.Кликаем по крестику - в пришедших гет-параметрах удаляем элемент с id == id нажатого фильтра.

Мне тут дополнительных задач столько надавали по этому скрипту, что хорошо, что им в голову еще это удаление не пришло...

  Ответить  
 
 автор: neadekvat   (21.06.2010 в 14:23)   письмо автору
 
   для: Лена   (21.06.2010 в 12:36)
 

Тогда фильтр не должен быть ссылкой, если крестик.

Вы как фрилансер или каг бэ в офисе? Я, если доработки по стоимоти больше 50$ уже дорабатываю с доплатой (если, конечно, крупный проект - то там иначе, но у вас, насколько я понял, только этот фильтр, даже без дизайна)

  Ответить  
 
 автор: Лена   (21.06.2010 в 22:16)   письмо автору
 
   для: neadekvat   (21.06.2010 в 14:23)
 

вы как в воду глядели. Сказали удаление фильтра делать при клике на ссылке.
звери! :)

  Ответить  
 
 автор: neadekvat   (21.06.2010 в 22:47)   письмо автору
 
   для: Лена   (21.06.2010 в 22:16)
 

Просто, судя по всему, вам надо было сделать по данному примеру, а в примере именно так и было реализовано :)

  Ответить  
 
 автор: Trianon   (20.06.2010 в 19:17)   письмо автору
 
   для: Лена   (20.06.2010 в 16:43)
 

>Думала, что если utf, то 1 символ == переменное число байтов, в том числе и цифры. А сейчас посмотрела, это касается, как я поняла, только русских букв.

Не только.
Всё за пределами latin0 уходит в u .
Так что чтобы не думать, я б оставил модификатор на месте.

  Ответить  
 
 автор: neadekvat   (20.06.2010 в 19:21)   письмо автору
 
   для: Trianon   (20.06.2010 в 19:17)
 

Все так серьезно.. Возьму на заметку.
Лена, пардон :)

  Ответить  
 
 автор: Рома   (17.06.2010 в 23:47)   письмо автору
 
   для: Лена   (17.06.2010 в 22:14)
 

.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования