Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  05:16[Войти] | [Зарегистрироваться]
Ответ на вопрос № 38145

28-11-2005 03:25
Я отлаживаю программу для отправки данных по методу Post через TWebBrowser на локальном сервере Apache (из пакета Денвер). Я пытаюсь переслать данные по методу Post в PHP скрипт. Посылаю данные так:

function Str2Variant(S:string):OleVariant;
var Data:Pointer;
begin
Result:=VarArrayCreate([0,Length(S)],varByte);
Data:=VarArrayLock(Result);
try
  Move(S[1],Data^,Length(S));
finally
  VarArrayUnlock(Result);
end;
Result[Length(S)]:=0;
end;


По нажатию кнопки выполняется код:

var URL,Flags,TargetFrameName,PostData,Headers:OleVariant;
begin
PostData:=Str2Variant('Name=Python&Surname=SmiSoft&EMail=email@site.ru&Comment=Comment');
URL:='http://www.smisoft.test1.ru/HandleForm.php';
Flags:=EmptyParam;
TargetFrameName:=EmptyParam;
Headers:=EmptyParam;
WebBrowser1.Navigate(URL, Flags, TargetFrameName, PostData, Headers);
end;


PHP скрипт отвечает, что все переданные переменные не определены! Я проверил, что данные передаются правильно и в BeforeNavigate2 вставил такую строчку:

Memo1.Lines.Text:=PostData;


У меня высвечиваются только куча знаков вопроса. Я написал такую функцию:

function Variant2Str(V:OleVariant):string;
var Data:pointer;
begin
SetLength(Result,Length(V)*2);
Data:=VarArrayLock(V);
Move(Data^,Result[1],Length(V)*2);
VarArrayUnlock(V);
end;


И вывожу таким образом:

Memo1.Lines.Text:=Variant2Str(PostData);


Данные PostData выводятся правильно! Но переменные в PHP скрипте все равно не определены! Если заполнить форму, то данные передаются правильно! Где я грабли поймал? Форма:

<Form Action="HandleForm.php" METHOD=POST>
Имя: <br><Input Type=Text Name="Name" Value="Безымянный" size=40><br>
Фамилия: <br><Input Type=Text Name="Surname" Value="Безымянный" size=20><br>
Электронная почта: <br><Input Type=Text Name="EMail" Value="email@site.ru" size=60><br>
Комментарий: <br><TextArea Name="Comment" Rows=5 Cols=40></TextArea><br>
<center>
<input type=Submit Name="Submit" Value="Послать">
<input type=Reset Name="Reset" Value="Сброс">
</center>
</form>


Принимающий данные PHP скрипт (HandleForm.php):

<HTML>
<?php
print("Имя: $Name.<br>");
print("Фамилия: $Surname.<br>\n");
print("E-Mail: $EMail.<br>\n");
print("Комментарий:<br>\n<kbd>$Comment</kbd>");
?>
</BODY>
</HTML>


Искал по КС, но похоже, никто не отлаживает программы для работы с интернет на локальном апаче.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

29-11-2006 10:31 | Сообщение от автора вопроса
To SATANA:
>>> добавь для POST
Проблема уже решена. Повторяю: я использую метод, предложенный в посте 13-01-2006 15:09. А предложенный тобой подход уже обсуждался в посте 29-11-2005 06:12 и не дает необходимого/ожидаемого результата.

28-11-2006 21:17
в самом скрипте добавь для POST:
echo $_POST['Name'];
echo $_POST['Surname'];
echo $_POST['EMail'];
echo $_POST['Comment'];
Для GET:
echo $_GET['Name'];
echo $_GET['Surname'];
echo $_GET['EMail'];
echo $_GET['Comment'];

Должно работать если ты конечно в делфи не накосячил

03-04-2006 11:24 | Сообщение от автора вопроса
>>> не выходит на методе POST компонента TWebBrowser. Надо все-таки использовать Indy
Да нет, можно работать и с WebBrowser, только если отправляешь данные на сервер с кодировкой не Windows, то надо производить перекодировку, а то русские буквы исчезают :(

22-03-2006 06:19
Да, как оказалось не хватало такой мелочи как:


>Джентльмены, не хватает самой мелочи :)
>Headers:='Content-Type: application/x-www-form-urlencoded'#10#13;
>WebBrowser1.Navigate(URL, Flags, TargetFrameName, PostData, Headers);

>С наилучшими пожеланиями,
>December at vingrad.ru

20-03-2006 07:05 | Комментарий к предыдущим ответам
Аналогичная проблема, не выходит на методе POST компонента TWebBrowser. Надо все-таки использовать Indy?

20-03-2006 01:15 | Сообщение от автора вопроса
Знаки + не отправлялись на сервер, это глюк, поэтому пишу поправленную функцию:

function UrlEncode(const S:string;NeedUTF8:boolean=false):string;
var I:integer;
    W:UTF8String;
begin
Result:='';
if NeedUTF8 then W:=Utf8Encode(S) else W:=S;
For I:=1 to Length(W) do case W[I] of
  '%',' ','&','=','@','.',#13,#10,'+',#128..#255:Result:=Result+'%'+inttohex(ord(W[I]),2);
  else Result:=Result+W[I];
end;
end;


15-03-2006 01:25 | Сообщение от автора вопроса
Проблема с отсылкой данных решена.
Для этого пришлось написать собственную версию функции UrlEncode:

function UrlEncode(const S:string;NeedUTF8:boolean=false):string;
var I:integer;
    W:UTF8String;
begin
Result:='';
if NeedUTF8 then W:=Utf8Encode(S) else W:=S;
For I:=1 to Length(W) do case W[I] of
  '%',' ','&','=','@','.',#13,#10,#128..#255:Result:=Result '%' inttohex(ord(W[I]),2);
  else Result:=Result W[I];
end;
end;


Дело в том, что стандартная функция UrlEncode из Indy 8 (устанавливается вместе с Delphi 6.0) не поддерживает Utf-8 (в котором надо отправлять данные на Королевство), а чем пользоваться в Indy 10 для кодировки я не понял (функции UrlEncode в явном виде там нет). Если у кого есть поправки по поводу вида функции, прошу написать в этом вопросе. Также хотелось бы узнать нормальное "цивилизованное" решение этой проблемы (ни за что не поверю, что в Indy 10 нет уже реализованного метода кодирования передаваемых данных в Utf-8).

05-03-2006 11:23 | Сообщение от автора вопроса
Очередная попытка отправки данных. Теперь установил Indy 10. Раньше была 8 версия. Еще написал новую версию функции UrlEncode. Теперь она поддерживает UTF8. Надеюсь, что теперь все заработает.

24-02-2006 13:05
>>> Вопрос в том, почему такой глюк при передаче данных на сервер?

На этот вопрос может ответить только Елена Филиппова, а она вряд ли сюда заглянет. Попытайтесь связаться с ней напрямую или через "Книгу жалоб и предложений".

09-02-2006 04:59 | Сообщение от автора вопроса
Опа! Два предыдущих ответа я отправил с помощью своей программы (чтобы не мусорить в чужих вопросах) и получились глюки. Код для отправки такой:

var Source:TStringStream;
    Fin:TFileStream;
begin
....
with Query do begin
  Http.Request.ExtraHeaders.Text:=Cookies;
  Http.Request.Connection:='Keep-Alive';
  Http.Request.ContentType:='application/x-www-form-urlencoded';
    Source:=TStringStream.Create(Format('Send=on&IDAnswer=%d&LevelID=%d&body=%s',
    [FieldByName('Question').AsInteger,FieldByName('Kind').AsInteger,UrlEncode(FieldByName('Answer').AsString)]));
  Fin:=TFileStream.Create('temp.htm',fmCreate);
  try
    Http.Post('http://www.delphikingdom.com/asp/answer.asp?IDAnswer='+FieldByName('Question').AsString,Source,Fin);


Информация берется из БД, надеюсь, имена полей говорящие. Query - TADOQuery, в котором содержатся данные(там все правильно, проверено). В переменной Cookies хранятся ранее полученные кукиши с login.asp (данные о регистрации). Режим Keep-Alive задан для того, чтобы можно было постить сразу несколько вопросов, потом соединение закрывается. Если что непонятно - спрашивайте. Вопрос в том, почему такой глюк при передаче данных на сервер? Неправильно кодируютя данные функцией UrlEncode? Но при передаче на локальном Апаче данные передаются корректно!


13-01-2006 15:09
Джентльмены, не хватает самой мелочи :)

Headers:='Content-Type: application/x-www-form-urlencoded'#10#13;
WebBrowser1.Navigate(URL, Flags, TargetFrameName, PostData, Headers);


С наилучшими пожеланиями,
December at vingrad.ru

29-11-2005 10:28 | Сообщение от автора вопроса
To Monach:
Не работает. Может быть, проблема в Apache? Дело в том, что я попытался использовать для той же задачи другие компоненты, такие как NMHTTP (это демка, каталог $(Delphi)\Demos\NetMaster\HTTP, Indy - тот же эффект. Есть ли где в Интернете сайт, на котором можно безбоязненно потренироваться? Дело в том, что я написал программу - оффлайн клиент для работыы с вопросами Королевства. Оплата интернета у меня повременная, поэтому я загружаю вопросы себе на диск, отвечаю, отключившись от сети а затем загружаю их на сервер. Проблема в том, что приходится загружать вручную, а это очень неэффективно. Использование метода Get невозможно, из-за большого объема ответов. Еще требуется сохранить полученную после передачи страницу на диск, но с этим проблем нет. Просто я хочу показать, что должно получиться в итоге, чтобы Вы не гадали на кофейной гуще. Может, у кого то есть подобные разработки. Ведь пример, приведенный в вопросе взят из статьи "Использование функциональности IE или заметки о WebBrowser" с Королевства (не помню раздел)! Неужели там ошибка?

29-11-2005 06:12 | Комментарий к предыдущим ответам
Уважаймые такая же проблема. Данные на сервер уходят, но php скрипт их не выводит:
echo $_POST['param1'];
Просмотрел весь круглый стол, тема явно не раскрыта. Неужели никто не занимался эти вопросом ?

28-11-2005 23:41
Попробуй-ка вот эту строчку завершить вопросительным знаком, что в php и html является признаком наличия параметров

у тебя:
URL:='http://www.smisoft.test1.ru/HandleForm.php';

надо:

URL:='http://www.smisoft.test1.ru/HandleForm.php?';



Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Раз дощечка, два дощечка будет лесенка. Раз словечко, два словечко, будет ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования