Можно ли засунуть несколько переменных в строку браузера? (для выполн. функции)

BeatBox

Guest
Можно ли засунуть несколько переменных в строку браузера? (для выполн. функции)

Сдравствуйте.
У меня такой вопросик (последнее, что не дает запустить сайт :) ):
можно ли в стркоу браузера засунуть перечесление переменных, нескольких?
например чтобы зайдя по ссылке
что-то-там.php?name=cats&cat1&cat2&cat3&or
код РНР приложения получал данные
массив ( cat1,cat2,cat3)
и делал запрос в бд, запрашивая таблицу "test_table" с параметрами cat1="cat1" or cat2='cat1' or cat3='cat1' тоесть разделял бы сразу их словом OR если оно в браузере или AND если в браузере AND.
ОЧень прошу помогите, подскажите как сделать, если вообще такое конечно возможно :confused:
 

BRat

o_0
отправил бы тебя в Самые Основы ..но не буду, ты же всё таки "продвинутый" новичок, авось уже знаешь где они.
 

BeatBox

Guest
знаю но я хот убейте не пойму ничего из мануала по массивам :(
вот что уже придумал:
PHP:
function cats() {
 global $cats, $andor;
$cats_t = explode("?",$cats);
если я правильно понял то при заходе по ссылке
..........&cats=df?cv
у меня будет массив df, cv.
а как теперь мне его разделить значением $andor и впихнкть в запрос, неподскажите?
 

rotoZOOM

ACM maniac
BeatBox забудь о том, чтобы подставлять в запрос GET данные, во избежании SQL инъекций. Если конечно хочешь, чтобы твой сайт прожил некоторое время.
 

XiMiK

Новичок
BeatBox
Нууу... для начала не помешало бы зунать как выглядит URL...
 

BeatBox

Guest
УРЛ:
http://www.com/page.php?name=news&f=cats&cats=df?cv
name=news - отдел новостей
f=cats - вызов функции cats

-~{}~ 16.03.05 05:45:

rotoZOOM
а есть какие-то варианты, может просто я совсем не так делать начал? хотя по идее можно защитить и проверить входящие данные. например я сделаю что каждая переменная не может быть длинне 4ех символов и может содержать только бквы и цифры. или только цифры.. пока что неважно.. мне бы этот код сделать :(
 

XiMiK

Новичок
туго, но все с малого начинали :)

У тя появятся:
$_GET['name'] равное news
$_GET['f'] равное cats
$_GET['cats'] равное df?cv

Ограничение по символам может выглядеть так:
$name = $_GET['name'] ? substr($_GET['name'], 0, 4) : false;
 

BeatBox

Guest
XiMiK
за ограничение спасибо ;) но все же оно непонадобиться если сам код неготов :(
 

rotoZOOM

ACM maniac
BeatBox данные, которые ты берешь от юзера обязательно нужно проверять на валидность, прежде чем засовывать в SQL строку.
И определись, что тебе надо ?
То есть ты от пользователя принимаешь имена котов, и каким образом их искать (либо все вместе либо хотябы один из них).
Сделай 4 поля (имена котов) + radiobutton (AND, OR) передаешь это все на сервер и там анализируешь. Лучше конечно методом POST - его труднее подделать.
 

BeatBox

Guest
rotoZOOM
честно говоря так уже и сделал :) но мне этот способ ненравиться тем что:
1. я его криво сделал. так как в массивах нераззбираюсь, а всего у меня не 4 а 35 категорий, то после того как передал данные методом ПОСТ, чтобы сгенерировать SQL запрос (тоесть выбрать где именно ставить WHERE а где AND или OR я сделал тако тупок код:
PHP:
global $search_type, $cat1, $cat2, $cat3, $cat4, $cat5, $cat6, $cat7, $cat8, $cat9, $cat10, $cat11, $cat12, $cat13,
    $cat14, $cat15, $cat16, $cat17, $cat18, $cat19, $cat20, $cat21, $cat22, $cat23, $cat24, $cat25, $cat26,
    $cat27, $cat28, $cat29, $cat30, $cat31, $cat32, $cat33, $cat34, $cat35; // и ещё несколько нужных для функции переменных(убрал чтоб ненагружать топик.

//а дальше совсем бред сделал, н он работает :)
if ($cat1 == "1") {
   if ($firstvar == 1) { $globalpre = " $search_type "; }
   elseif ($firstvar == 0) { $firstvar = 1;
   $globalpre = " WHERE "; }
   $catsel1 = " $globalpre associated like '1-%' or topic='1' "; }
   
   if ($cat2 == "1") {
   if ($firstvar == 1) { $globalpre = " $search_type "; }
   elseif ($firstvar == 0) { $firstvar = 1;
   $globalpre = " WHERE "; }
   $catsel2 = " $globalpre associated like '%2-%' or topic='2' "; }
//и так далее проверяеться все 35 $cat (полученных из другой функции, там где заполняеться форма и прочее)

qdb = " $catsel1 $catsel2 $catsel3" //и тут опять же все 35 переменных

//далее в запросе примерно так:
$sql = "select table1, tble2 from lala_table $qdb"
пс
я ГУРУ составления громадных кодов которые можно заменить 5-6 строчками :D зато сделал сам и работает.

2. ненравться что что при нажатии "обновить" пишет мол станица устарела, и предлагает заново послать данные.

3. Ненравиться то что немогу корректно разбить результаты по страницам.
 

SelenIT

IT-лунатик :)
Лучше конечно методом POST - его труднее подделать
ИМХО, это заблуждение. А вот неудобств однозначно будет больше. Как определять, когда каким методом отправить данные - написано в PHP FAQ: Самые основы. Способы общения браузера с сервером.

Чтобы избавиться от напоминания о повторной отправке данных, нужно в конце скрипта, обрабатывающего POST-запрос, делать редирект. А кучу переменных вида $catX можно с успехом заменить массивом (давая полям в форме имена вида cat[X] или просто cat[]). Примеры и того, и другого в большом количестве представлены на форуме.
 

BeatBox

Guest
SelenIT
а можно как-то переделать мой конченый код которые использует форму и POST и из-за которого нельзя разбить данные постранично, на хороший код с GET'om? можно сам интерфейс оставить форменный? тоесь выбираються чекбоксами нужные значения + радиобаттном выбор "И" \ "или"?
 

confguru

ExAdmin
Команда форума
я ГУРУ составления громадных кодов которые можно заменить 5-6 строчками
Ужасный код... тебя с таким кодом никуда работать не возьмут :)
Используй [m]switch[/m] и [m]case[/m]
Global - вообще зло и дурной тон.

Разберись в массивах - начни с [m]foreach[/m]
 

rotoZOOM

ACM maniac
SelenIT его на самом деле труднее подделать, а вот с неудобствами я согласен полностью. Правда если данных у человека много, то они просто могут не влезть в строку.

BeatBox учи массивы то, что ты написал - это просто жуть.
 

SelenIT

IT-лунатик :)
BeatBox
Конечно можно. Просто замени имена полей с cat1 на cat[1] и т.д. На входе функции вместо кучи переменных будет один массив $cat, по которому легко пробежаться циклом foreach.

rotoZOOM
В чем конкретно эта трудность выражается? Вот ограниченность строки - это аргумент, тут я полностью согласен.
 

BeatBox

Guest
Спасибо всем что помогаете ;)
Но я уже который раз аж хочу монитор в стену кинуть - просто БЕСИТ то что я немогу даже капельки понять эти массивы :(

и foreach блин на англ.

Там какие-то примеры странные..
Вот я переименую допустим все $cat1, $cat2.. на $cat[1], $cat[2] и т.д а дальше как быть?
в примерах написано:
$arr = array(1, 2, 3, 4);
тоесть потом создать функцию $arr и туда вписать все $cat'ы ?



кстате по поводу ограниченосит строки - тут проблем не будет, мксимум я разрешу если когда-нибудь заработает код - 5 $cat'ов выбрать.
 

SelenIT

IT-лунатик :)
Когда ты отправишь форму с полями cat[1], ... , cat[35], в твой скрипт придет готовый массив $cat(1=>1, 3=>1, ... 28=>1) (к примеру) - там, где были отмеченные чекбоксы, будут единицы, остальные просто не передадутся.

А потом делаешь
PHP:
foreach($cat as $number=>$value) {
    if ($value==1) $catsel2 = " $globalpre associated like '%$number-%' or topic='$number' "; } 
}
А с учетом ограничения строки можно давать полям формы более короткие имена - например, не cat[1], а просто c[1], тогда останется больше места для значений.
 

BeatBox

Guest
SelenIT
я все немогу сделать форму с гетом :(:(:(
если пишу просто метод-гет - то выбрасывает на главную страницу :(
 

SelenIT

IT-лунатик :)
А ты этот скрипт с нуля писал или нюковский переделывал? Если второе - возможно, там проверяется $REQUEST_METHOD или непустота массива $_POST (либо $HTTP_POST_VARS). Решай проблему поэтапно: сначала заставь работать скрипт с методом POST и на массивах, тогда код уменьшится и потом будет легче искать проверку, мешающую обработать GET-запрос.

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