POST без формы + HTTP-аутентификация

ThyBzi

Новичок
POST без формы + HTTP-аутентификация

Поискал в форуме и факах, ничего подобного не нашёл.

Написал в этот раздел, так как считаю, что тема напрямую касается cURL (а ведь это, насколько я понял, одна из библиотек PECL).

Значится, суть проблемы такая. Имеем админку к сайту, в ней есть (в т.ч.) два файла: index.php, через который работает весь юзерский интерфейс (в т.ч. удаления/изменения/добавления событий в БД), и dbrw.php, который напрямую работает с БД, в зависимости от того, какие action и id (и другие данные) ему пришли по POSTу от index.php, а затем отсылает страницу обратно к index.php.

С добавлением нового события и удалением имеющегося проблем не возникает, нужные данные передаются постом от index к dbrw, выполняется соответствующий запрос, и всё путём.

Проблема возникает, когда событие нужно редактировать. Т.е.:

1) передать странице dbrw.php постом переменные action = edit и id = нужный_id (на самом деле передаётся ещё и section, которое соответствует типу записи в БД — из какой таблицы и какие поля вытащить);
2) составить запрос на выборку имеющихся данных (полей много, и в зависимости от section их число и имена меняются);
3) и то, что собственно не получается: передать эти данные обратно index.php.

Возможные варианты решения, которые я рассматривал:

1) Передать данные GETом.
Чем плохо. Далеко не любые данные можно безопасно передать через адресную строку (особенно касается длинных текстов, в т.ч. содержащих переносы строк и др. — эти переносы потеряются, и думаю, не только они)

2) Создать форму с методом POST, в ней все значения вписать hidden-ами, а затем отправить форму средствами JavaScript.
Чем плохо. Неэлегантое решение, ибо это «выкрутасы» (или выкручивание :). К тому же, в HTML-код страницы, которая заведомо ничего не должна показывать юзеру, выводится огромная форма. А ещё я считаю плохим стилем доверять JS выполнение важных операций.

3) Сохранить данные в сессию.
Чем плохо. Во-первых, захламление сессии огромными объёмами данных. Если я ничего не путаю, данные сессии хранятся на сервере в специальных файлах, а объёмы текстов, вытащенных из базы, могут быть весьма и весьма велики. Также возникают сложности с тем, как затем интерпретировать приходящие данные. Либо нужно писать все данные в одну переменную (типа $_SESSION["form_data"]), разбивая их по образу и подобию GETовой строки: var1=12&var2=345=var3=gdfgd и т.д. (или ещё каким-то образом отделять переменные друг от друга), — либо нужно каким-то образом узнавать, из каких переменных читать данные. Как-то это всё коряво. :(

4) Отправить данные POSTом без использования форм. Это был бы идеальный вариант. Пошарил в инете на эту тему и выяснил, что подобные вещи позволяет делать cURL…

Если вы не забыли, речь идёт об админке, соответственно там используется аутентификация (в данном случае — HTTPшная, через 401 «ошибку»). Т.е. если тупо передать нужные данные POSTом, скрипту ответят этой самой 401-й ошибкой.

Попытался совместить примеры передачи данных POSTом и HTTP-аутентификации из мануала по cURL (http://www.zend.com/pecl/tutorials/curl.php), всё равно выдаётся ошибка 401.

Вот код:
PHP:
$ch = curl_init();    // initialize curl handle
curl_setopt($ch, CURLOPT_URL, $referer); // set url to post to
curl_setopt($ch, CURLOPT_USERPWD, "{$_SESSION["username"]}:{$_SESSION["password"]}");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // times out after 4s
curl_setopt($ch, CURLOPT_POST, 1); // set POST method
curl_setopt($ch, CURLOPT_POSTFIELDS, BuildVarStr($data2post)); // add POST fields
$result = curl_exec($ch); // run the whole process
curl_close($ch);
echo $result;
где:
$referer — это http-реферер :)) т.е. index.php?section=имя_раздела

$_SESSION["username"] и $_SESSION["password"] — хранящиеся в сессии данные, введённые авторизованным юзером (для чистоты эксперимента пока отключил их шифрование перед записью в переменные сессии).

BuildVarStr($data2post) — это строка «GET-вида» (var1=12&var2=345=var3=gdfgd). Самописная функция BuildVarStr() формирует такую строку из массива ("var1" => 12, "var2" => 345...). В мануале по cURL в примере используется строка именно такого вида.

Пробовал комментировать параметры, лишние на моё взгляд. Пробовал не эхить $result, а редиректить на $referer… Результат один — 401 ошибка и хоть ты тресни.

Уважаемые члены сообщества! Буду весьма признателен, если укажите мне на местонахождение и суть моей ошибки в ДНК. :)) А особенно — путей исправления оной и путей решение данной задачи. Заранее благодарен.

P.S. cURL включен, разумеется. :)))
 

Фанат

oncle terrible
Команда форума
бред какой-то.
а чем не устраивает сделать include dbrw в индексе по нужным условиям, и получить от него нужные переменные, и вывести?
 

Кром

Новичок
Сделай в index.php include для dbrw.php по условию. Если нужно редактировать и т.д. подключай его.
Потом если, данные отсылаются постом, ложи их в сессию, редактируй что нужно в базе и делай редирект. А потом делай выборку из базы и выводи данные на страницу. После этого чисти сессионные переменные.
 

Фанат

oncle terrible
Команда форума
нафига в его задаче хранить данные из формы после редиректа?
 

_vampiro_

Новичок
PHP:
index.php:
...
...
..
$save_POST = $_POST;
$_POST['action']=$something;
$_POST['section']=1;
include('./dbrw.php');
$_POST = $save_post;
...
...
Как порой можно пяткой спину почесть.. просто удивительно.

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

Кром

Новичок
Фанат Чтобы вывести из базы нужную информацию на основе полученных данных. По твоему все обстоит по другому?

-~{}~ 29.06.06 10:36:

_vampiro_ это совершенно бессмысленный код.
 

Фанат

oncle terrible
Команда форума
Но это только лишь выход из сложившейся ситуации
КАКОЙ ситуации?
объясните мне. я, молжет, правда не догоняю?
чем таким его ситуация отличается от обычного приложения форма/таблица?

-~{}~ 29.06.06 11:39:

Кром
Этого горе-кулибина надо научить передавать данные для запроса в бд ГЕТ-ом.
а не потакать его извращениям.
 

_vampiro_

Новичок
Фанат
Он хочет отделить работу с интерфейсами пользователя (с шаблонами всякими) от работы с БД. Для этого и 2 файлика. Видимо, просто прогулял лекцию по инклудам, осюда и пихание в пост всего результата выборки из БД.
 

Кром

Новичок
Фанат
У него action = edit . Лично я принципиально против передачи данных через get, когда идет изменение данных. На самом деле от этого будут одни глюки.
 

Фанат

oncle terrible
Команда форума
_vampiro_
что он ХОЧЕТ - я в курсе. его желания надо в музей выставлять. курл через жопу автогеном для решения задачи, в которой требуется один инклюд.
я спрашиваю - почему задачу надо решить именно так, как он написал, а не по-человечески?!

-~{}~ 29.06.06 11:49:

Кром
ты тормоз.
запросы на изменение данных у него идут постом на дбрв.
и проблем у него с ними нет.
а проблему у него с
составить запрос на выборку имеющихся данных
ЗАПРОС
НА ВЫБОРКУ.

где ты тут увидел изменение?
 

Кром

Новичок
Изменение идет сразу перед выборкой.
Спорить тут пока смысла нет. Подождем реакцию автора топика.
 

Фанат

oncle terrible
Команда форума
Изменение идет сразу перед выборкой.
тебе голову не напекло?

-~{}~ 29.06.06 13:41:

короче.
резюме для аффтара.

переменные action = edit и id = нужный_id передаются
1. ИНДЕКСУ.
2. ГЕТом.
индекс инклюдит дбрв, тот лезет в базу, возвращает значения, индекс их выводит.

ВСЁ.
задачка в полтора действия.
если знать, для чего нужны какие методы.
 

ThyBzi

Новичок
Спасибо всем за ответы! Я на самом деле либо проинклудаю dbrw в index, либо вообще файлы объединю. :)

-~{}~ 02.07.06 21:10:

Автор оригинала: Кром
Изменение идет сразу перед выборкой.
Спорить тут пока смысла нет. Подождем реакцию автора топика.
Нет, выборка нужна для получения текущего состояния записи. Этим состоянием забиваются поля формы (ну и сказанул :)), и если что-то было отредактировано, то по только отправлению формы вносятся изменения. :)
 
Сверху