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

  • Автор темы Автор темы ThyBzi
  • Дата начала Дата начала

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 включен, разумеется. :)))
 
бред какой-то.
а чем не устраивает сделать include dbrw в индексе по нужным условиям, и получить от него нужные переменные, и вывести?
 
Сделай в index.php include для dbrw.php по условию. Если нужно редактировать и т.д. подключай его.
Потом если, данные отсылаются постом, ложи их в сессию, редактируй что нужно в базе и делай редирект. А потом делай выборку из базы и выводи данные на страницу. После этого чисти сессионные переменные.
 
нафига в его задаче хранить данные из формы после редиректа?
 
PHP:
index.php:
...
...
..
$save_POST = $_POST;
$_POST['action']=$something;
$_POST['section']=1;
include('./dbrw.php');
$_POST = $save_post;
...
...
Как порой можно пяткой спину почесть.. просто удивительно.

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

-~{}~ 29.06.06 10:36:

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

-~{}~ 29.06.06 11:39:

Кром
Этого горе-кулибина надо научить передавать данные для запроса в бд ГЕТ-ом.
а не потакать его извращениям.
 
Фанат
Он хочет отделить работу с интерфейсами пользователя (с шаблонами всякими) от работы с БД. Для этого и 2 файлика. Видимо, просто прогулял лекцию по инклудам, осюда и пихание в пост всего результата выборки из БД.
 
Фанат
У него action = edit . Лично я принципиально против передачи данных через get, когда идет изменение данных. На самом деле от этого будут одни глюки.
 
_vampiro_
что он ХОЧЕТ - я в курсе. его желания надо в музей выставлять. курл через жопу автогеном для решения задачи, в которой требуется один инклюд.
я спрашиваю - почему задачу надо решить именно так, как он написал, а не по-человечески?!

-~{}~ 29.06.06 11:49:

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

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

-~{}~ 29.06.06 13:41:

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

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

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

-~{}~ 02.07.06 21:10:

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