Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтения POST из PHP

239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Кто знает, как прочитать то, что пришло в посте, причем нужна вся строка, а не разбитая по переменным...
250
15 ноября 2003 года
Joker
1.4K / / 20.02.2000
Цитата:
Originally posted by Dolonet
Кто знает, как прочитать то, что пришло в посте, причем нужна вся строка, а не разбитая по переменным...


ознакомся с

 
Код:
<?php
 phpinfo();
?>
239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by Joker

ознакомся с
 
Код:
<?php
 phpinfo();
?>



Я знаю массив, в котором уже отредактированные переменные хранятся, но мне надо не это, а найти то, что передано было, всю полную строку...

Дело в том, что я передаю двоичные данные, а PHP такое начинает выделывать и забивать в массив, что выть хочется... Что можете посоветовать по передачи двоичной строки?

4.4K
15 ноября 2003 года
penartur
26 / / 08.11.2003
Цитата:
Originally posted by Dolonet
Кто знает, как прочитать то, что пришло в посте, причем нужна вся строка, а не разбитая по переменным...



В смысле - вся строка POST? Насколько я знаю, строкой передаётся только GET (getenv('QUERI_STRING')). У POST вроде какой-то особый формат...

А можно конкретнее раскрыть задачу?
Что именно надо через это сделать?

239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by penartur


В смысле - вся строка POST? Насколько я знаю, строкой передаётся только GET (getenv('QUERI_STRING')). У POST вроде какой-то особый формат...

А можно конкретнее раскрыть задачу?
Что именно надо через это сделать?



В PERL это реализуется так:

 
Код:
if ($ENV{'REQUEST_METHOD'} eq "POST"){
    read(STDIN, $szQ, $ENV{'CONTENT_LENGTH'});
}


Однажды предложили так сделать в PHP:

 
Код:
$stdin = fopen('php://stdin', 'r');
while (!feof($stdin)) {
  $in .= fgets($stdin, 1024);
}


но не работает %(...
239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by penartur

В смысле - вся строка POST? Насколько я знаю, строкой передаётся только GET (getenv('QUERI_STRING')). У POST вроде какой-то особый формат...



POST передается также строкой. По крайней мере контрол Internet Transfer Control пересылает строку vData...

4.4K
15 ноября 2003 года
penartur
26 / / 08.11.2003
А что именно сделать-то надо???
239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by penartur
А что именно сделать-то надо???



Надо прочитать всю строку POST но не через Perl а через PHP... Я уже начинаю думать, какой еще есть метод для посылки и принятия данных со скриптом на сервере?...

4.4K
15 ноября 2003 года
penartur
26 / / 08.11.2003
Цитата:
Originally posted by Dolonet


Надо прочитать всю строку POST но не через Perl а через PHP... Я уже начинаю думать, какой еще есть метод для посылки и принятия данных со скриптом на сервере?...



ЗАЧЕМ ИМЕННО?

Может быть, всё это можно гораздо легче сделать обычными средствами...

239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by penartur


ЗАЧЕМ ИМЕННО?

Может быть, всё это можно гораздо легче сделать обычными средствами...



Начт так. У меня есть программа, написанная на VB, но это сейчас не важно. Сама программа на стадии разработки. Одна из функций этой программы - пересылать на сервер некоторую последовательность двоичных данных (грубо говоря строку с символами от chr(0) до chr(255), то есть любыми. Скорее всего FTP не подходит (поскольку мне не надо создавать файлов на серваке), а как значение переменной в методе GET тоже не послать - размер строки может быть до 500 кб, да еще и неизвестно, какие там символы. Да! эти данные я должен пихнуть потом в поле blob БД MySQL, вот почему еще FTP не подходит.

Я и решил использовать POST не по назначению, т.к. он пересылает данные практически любой длины... Но у меня не получается получить эти данные на скрипте, да и сама конструкция мне очень не нравится...

Не посоветуете, как еще передать такую "строчечку" на скрипт?

4.4K
15 ноября 2003 года
penartur
26 / / 08.11.2003
А какой предполагается метод реализации: куда в форме человек должен запихнуть эту строку? В textarea???
239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by penartur
А какой предполагается метод реализации: куда в форме человек должен запихнуть эту строку? В textarea???



Это не имеет значения. На самом деле строку генерирует программа, поэтому там могут быть и chr(0) и chr(10) и все остальное, что, конечно, GET-ом не передать... да и постом, насколько я знаю, тоже не рекомендуется... В общем вопрос открыт - как передать эту строку с произвольными данными на скрипт?

4.4K
15 ноября 2003 года
penartur
26 / / 08.11.2003
Цитата:
Originally posted by Dolonet


Это не имеет значения. На самом деле строку генерирует программа, поэтому там могут быть и chr(0) и chr(10) и все остальное, что, конечно, GET-ом не передать... да и постом, насколько я знаю, тоже не рекомендуется... В общем вопрос открыт - как передать эту строку с произвольными данными на скрипт?


В смысле?
Какая-то программа на машине клиента обращается к php-скрипту? Тогда, может, это вообще надо не через php реализовывать...
Кстати, можно ещё делать, например, чтобы у клиента при отправке каждый символ заменялся на x+его код, а на сервере это уже разбирать...

239
15 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by penartur

В смысле?
Какая-то программа на машине клиента обращается к php-скрипту? Тогда, может, это вообще надо не через php реализовывать...
Кстати, можно ещё делать, например, чтобы у клиента при отправке каждый символ заменялся на x+его код, а на сервере это уже разбирать...



Во-первых, я уже склоняюсь ко мнению, что буду делать скрипт на Perl-е - там куча функций по работе со строками.

Во-вторых, если я каждый символ заменю тремя символами, то у меня длина запроса местами возрастет до мегабайта! А это недопустимо %(

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

Вот такая у меня беда %(...

250
17 ноября 2003 года
Joker
1.4K / / 20.02.2000
Цитата:
Originally posted by Dolonet


Во-первых, я уже склоняюсь ко мнению, что буду делать скрипт на Perl-е - там куча функций по работе со строками.

Во-вторых, если я каждый символ заменю тремя символами, то у меня длина запроса местами возрастет до мегабайта! А это недопустимо %(

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

Вот такая у меня беда %(...


Так и не понял какие у тебя проблемы были:
массив $_POST всех их решает.

4
18 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Dolonet


Начт так. У меня есть программа, написанная на VB, но это сейчас не важно. Сама программа на стадии разработки. Одна из функций этой программы - пересылать на сервер некоторую последовательность двоичных данных (грубо говоря строку с символами от chr(0) до chr(255), то есть любыми.

....

Не посоветуете, как еще передать такую "строчечку" на скрипт?



Значит так, направление выбрано правильное. Но на PHP не как не получить POST данные одним блоком, так как PHP сам читает из stdin и раскидывает все по массивам.

По этому надо доводить дело до конца, а именно эмулировать закачку файла. А ты это уже почти сделал, осталось только правильные заголовки подставить.

Заголовки узнать тебе поможет снифер.

И на PHP тогда можно будет работать с массивом $_FILES

250
18 ноября 2003 года
Joker
1.4K / / 20.02.2000
Что то не очень понятно зачем все это..
Передается, бинарный фаил ? Метадом Пост ?
Никаких проблем не представляет выдернуть из переменную из массива: $_POST также не каких проблем не состовляет узнакть сколько переменных в масиве $_POST обычным count , и потом склеить если нужно.
4
18 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Joker
Что то не очень понятно зачем все это..
Передается, бинарный фаил ? Метадом Пост ?
Никаких проблем не представляет выдернуть из переменную из массива: $_POST также не каких проблем не состовляет узнакть сколько переменных в масиве $_POST обычным count , и потом склеить если нужно.



Ага, и тут встречается символ + в бинарном файле и автоматически заменяется на пробел. Или последовательность %CC и автоматически делается urldecode.

Никто не дает гарантии, что PHP больше ничего не делает с POST данными.

338
18 ноября 2003 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by mike


Ага, и тут встречается символ + в бинарном файле и автоматически заменяется на пробел. Или последовательность %CC и автоматически делается urldecode.



Mike, а где просвятиться можно на эту тему?

250
18 ноября 2003 года
Joker
1.4K / / 20.02.2000
Когда данные передаются, методом, пост на сколько мне известно с ними ничего не происходит, ситуация описанная тобой характерна для GET /
4
18 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Joker
Когда данные передаются, методом, пост на сколько мне известно с ними ничего не происходит, ситуация описанная тобой характерна для GET /



Если бы только для GET...

239
18 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by mike


Ага, и тут встречается символ + в бинарном файле и автоматически заменяется на пробел. Или последовательность %CC и автоматически делается urldecode.

Никто не дает гарантии, что PHP больше ничего не делает с POST данными.



Вот-вот!... И я о том-же. На Perl у меня получилось получить всю строку данных, но в PHP что в массиве $_POST (php4), что в $HTTP_POST_VARS (php3), выдается каша, чего и следовало ожидать... я решил "кодировать" бинарные данные в безопасные символы, а именно каждый байт представлю как 2 буквы от A до P, по-моему. т.е. разобью байт в 8 бит на 2 по 4 бита... конечно это замедлит скорость передачи данных, но по количествув передаваемых данны можно судить, что это не сильно замедлит скорость работы моей программы. Тем более имеет место автоматическое сжатие пакетов данных. Теперь вопрос в другом - как через функции WIN32 API отослать данные методом пост?

250
19 ноября 2003 года
Joker
1.4K / / 20.02.2000
через сокет.
Поповоу, POST если честно не ожидал, cейчас рук , не хватает все это проверить..
Если уж так плохо, все с пост.., то тогда рекомендую прислушится к майку:
>По этому надо доводить дело до конца, а именно >эмулировать закачку файла. А ты это уже почти >сделал, осталось только правильные заголовки >подставить.
>
>Заголовки узнать тебе поможет снифер.
>
>И на PHP тогда можно будет работать с массивом >$_FILES

А то какое то очень кривое решение у тебя вышло.. , хотя главное работает :)
239
19 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by Joker

>И на PHP тогда можно будет работать с массивом >$_FILES

А то какое то очень кривое решение у тебя вышло.. , хотя главное работает :)



Что главное сейчас, так это то что не работает %((. Тем более приходится учитывать, что обращений к этому скрипту можеь быть очень много (напр. 100 за минуту), а количество передаваемых данных между 50 и 200 кб. Если сервак станет каждый раз в темп писать файл, я его стану открывать и пихать в память (переменную), то есть риск свалить сервак. Тем более по задаче получается что я должен юзать функции Win32 API....


На самом деле, возможно, вы правы по поводу файла. Но как это сделать не через контрол, а через виндовые функции?

4
19 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Dolonet

Если сервак станет каждый раз в темп писать файл, я его стану открывать и пихать в память (переменную), то есть риск свалить сервак. Тем более по задаче получается что я должен юзать функции Win32 API....



Я не понимаю, тебе беспокоит клиентская часть или серверная ??

239
19 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by mike


Я не понимаю, тебе беспокоит клиентская часть или серверная ??



Согласен и извиняюсь - на данный момент попытка убивания 2-х зайцев не актуальна... Тогда вопрос такой - как обратиться к http-скрипту и передать файл? Если у Вас есть сэмпл, буду очень благодарен!

4
20 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Dolonet


Согласен и извиняюсь - на данный момент попытка убивания 2-х зайцев не актуальна... Тогда вопрос такой - как обратиться к http-скрипту и передать файл? Если у Вас есть сэмпл, буду очень благодарен!



Повторюсь :) снифер тебе поможет :)

239
20 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by mike


Повторюсь :) снифер тебе поможет :)



У меня наверное заскок, но я не могу понять, о каком снифере вы говорите?

4
21 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Dolonet
У меня наверное заскок, но я не могу понять, о каком снифере вы говорите?



О любом. Твоя задача посмотреть что передает браузер при закачке файла по HTTP и потом сделать то же самое из своей программы.

5.9K
21 ноября 2003 года
Clio
5 / / 21.11.2003
Цитата:
Originally posted by mike


О любом. Твоя задача посмотреть что передает браузер при закачке файла по HTTP и потом сделать то же самое из своей программы.



Честно говоря, юзать снифер для этого совсем не обязательно, тем более что человек судя по всему не знает что это такое и не умеет пользоваться перехчиками пакетов.

Нужно просто сформировать правильный HTTP-запрос ( формат сего очень легко найти в стандарте протокола HTTP/1.0 [ 1.1 ] порывшись минут десять в RFC 2616 .

Далее, по поводу обработки интерпритатором данных передаваемых методом POST. Практически ничем PHP их не обрабатывает. Как пример:

Отправим их одного файла данные в другой и глянем ...

index.html

 
Код:
<form action="phpinfo.php" method="post">
    <input type="hidden" name="s0" value="lqoi43cp8y9q'34tp98yq3vqp 843">
    <input type="hidden" name="s1" value="*(#P)(*U@UP)(*UEW)(PUP)(WE">
    <input type="hidden" name="s2" value="!@#$%^&*()_+">
    <input type="hidden" name="s3" value="P(*#VP(*Y#VR:OJWRE:LJLNE:OHRQPOJR">
   
    <input type="submit" value="send data">
</form>


phpinfo.php
 
Код:
<?php

print "<pre>";
var_dump($_POST);
print "</pre>";

?>


Результат
 
Код:
array(4) {
  ["s0"]=>
  string(30) "lqoi43cp8y9q\'34tp98yq3vqp 843"
  ["s1"]=>
  string(26) "*(#P)(*U@UP)(*UEW)(PUP)(WE"
  ["s2"]=>
  string(12) "!@#$%^&*()_+"
  ["s3"]=>
  string(33) "P(*#VP(*Y#VR:OJWRE:LJLNE:OHRQPOJR"
}


Как видно, единственное, что сделал PHP так это отремил одинарную кавычку слэшем - это все.

Так что тут особо беспокоится не о чем. Эта проблемка легко решается простым preg_replace().

По поводу трудности определения длинны переданных данных я что-то вообще не понял в чем трудность. Достаточно просто считать пришедший заголовок и посмотреть значение Content-Length - именно для этого придумали переменную $_SERVER["CONTENT_LENGTH"] :)

И напоследок, по поводу клиента на VB - это же идиотизм - если напишешь его на Visual C++ все будет гораздо проще - особенно с отправкой данных по HTTP протоколу методом POST :)
4
21 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Clio
Как видно, единственное, что сделал PHP так это отремил одинарную кавычку слэшем - это все.



Эксперимент нельзя считать полным. Например не известно что будет если встретится 0 в файле. Возможно PHP завершит им строку. А 255 ??

Цитата:

Достаточно просто считать пришедший заголовок и посмотреть значение Content-Length - именно для этого придумали переменную $_SERVER["CONTENT_LENGTH"] :)


При POST запросах поле Content-Length передается далеко не всегда. Но если клиент свой, то такой проблемы нет. А вообще даже у wget есть опция

--ignore-length игнорировать поле заголовка `Content-Length'.

Цитата:

И напоследок, по поводу клиента на VB - это же идиотизм - если напишешь его на Visual C++ все будет гораздо проще.



И напоследок, с каких это пор писать на VC++ стале проще чем на бейсике ??? :D

4
21 ноября 2003 года
mike
3.7K / / 01.10.2002
Ладно, я тут сам проснифирил. Вот так должны передаваться данные:

Код:
POST /upload.php HTTP/1.1
Accept-Language: ru
Content-Type: multipart/form-data; boundary=---------------------------7d3305169f0172
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: server.ru
Content-Length: 1529
Cache-Control: no-cache

-----------------------------7d3305169f0172
Content-Disposition: form-data; name="userfile"; filename="C:\image.gif"
Content-Type: image/gif

GIF89 и тп и тд ...тут код файла, длиной в 1529 байт
-----------------------------7d3305169f0172


О том как работать с файлами на PHP можно прочитать тут:

http://ru3.php.net/manual/ru/features.file-upload.php
5.9K
21 ноября 2003 года
Clio
5 / / 21.11.2003
Цитата:
Originally posted by mike


Эксперимент нельзя считать полным. Например не известно что будет если встретится 0 в файле. Возможно PHP завершит им строку. А 255 ??



Не думаю что PHP может завершить строку чем-то кроме \X0A :) Все-таки PHP на С написан :)

Цитата:
Originally posted by mike

При POST запросах поле Content-Length передается далеко не всегда. Но если клиент свой, то такой проблемы нет. А вообще даже у wget есть опция

--ignore-length игнорировать поле заголовка `Content-Length'.



А причем ту wget? Насколько я понимаю, клиент только свой и заголовок формируется не кем-то со стороны :) А Content-Length не может не присутствовать - хотя бы потому, что иначе нарушается стандарт протокола.

Цитата:
Originally posted by mike

И напоследок, с каких это пор писать на VC++ стале проще чем на бейсике ??? :D



Как по мне, то всегда было :) зависит от того, кто с чего начинал - кто с бейсика а кто с асма и си :)
А в данном случае - си лучше работат с WinApi чем бейсик, да в принципе и всегда лучше работал. Или нет? :)

239
21 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Спасибо за дискуссию и ссылки! Очень им рад! Со стороной PHP (серверной) все ясно... Но есть ли какие-то стандартные стредства посылки файла методом POST на сервер? Ато снифером пользоваться равносильно ковырянию формата...

Да! и мне кажется, что все-таки в VB это реализовывается проще... но если у Вас есть пример, выполняющий эти функции на VC++, то я буду раз сделать из него DLL-ку и пустить ее по рукам кому надо будет...

Еще раз спасибо! %)
4
22 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Dolonet
Спасибо за дискуссию и ссылки! Очень им рад! Со стороной PHP (серверной) все ясно... Но есть ли какие-то стандартные стредства посылки файла методом POST на сервер? Ато снифером пользоваться равносильно ковырянию формата...



Я VB в глаза не видел. Но уверен что есть. Вон в Delphi и в C++ Builder есть Indy HTTP Client да и еще что-нить наверняка.

4
22 ноября 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Clio
Не думаю что PHP может завершить строку чем-то кроме \X0A :) Все-таки PHP на С написан :)



Вот вы начинали с асма и си, и до сих пор не представляете себе как в си хранятся строки.

Вам термин "Null terminated string" о чем нибудь говорит ??? В СИ строка заканчивается кодом "0".

10 и 13 - это перенос строки и возврат картеки. Не надо будать

вот пример:

 
Код:
void main(void) {
    char *str="hello\r\nhello";
    printf("%d\n",strlen(str));
    str[3]=0x0A;
    printf("%d\n",strlen(str));
    str[3]=0;
    printf("%d\n",strlen(str));
    }


на выходе мы имеем:

 
Код:
12
12
3


Подробнее читаем тут:
http://www.codenet.ru/progr/cpp/spru/strlen.php

Цитата:

А причем ту wget? Насколько я понимаю, клиент только свой и заголовок формируется не кем-то со стороны :)


Перечитываем мой предыдущий пост

Цитата:

А Content-Length не может не присутствовать - хотя бы потому, что иначе нарушается стандарт протокола.


В HTTP 1.1 не написано что это поле должно присутсвовать, там написано что оно может быть.

239
22 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
пасиба гляну... и скажу что получилось...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог