Передать post параметры php скрипта

Тема в разделе "WASM.NETWORKS", создана пользователем who_know777, 4 апр 2021.

  1. who_know777

    who_know777 Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    36
    Доброго времени суток!

    Скачал архив с php интерпертатором, с официального сайта.

    Передаю через командную строку имя php скрипта
    для выполнения, скрипт выполняется. Передаю get параметры, все ок.

    Не могу понять, как отправлять и получать post параметры.

    Код (Text):
    1.  
    2. var
    3.   s: string;
    4. begin
    5.   s := Path('php\php.exe ');
    6.   s := s + Path('index.php');
    7.   s := s + //передаем параметры get
    8.   TextToWebBrowser(WebBrowser1, GetDosOutput(s));
    9. end.
    10.  
    11. function Path(s: string): string;
    12. begin
    13.   Result := PathAppend(ExtractFilePath(paramstr(0)), s);
    14. end; //Path
    15.  
    16. function PathAppend(path, str: string): string;
    17. begin
    18.   if path[Length(path)] <> '\' then path := path + '\';
    19.   result := path + str;
    20. end; //PathAppend
    21.  
    22. procedure TextToWebBrowser(WB: TWebBrowser; Text: string);
    23. var            
    24.   V: OleVariant;
    25.   Document: IHTMLDocument2;
    26. begin
    27.    if WB.Document = nil then WB.Navigate('about:blank');
    28.    while WB.Document = nil do Application.ProcessMessages;
    29.    Document := WB.Document as IHtmlDocument2;
    30.    V := VarArrayCreate([0, 0], varVariant);
    31.    V[0] := Text;
    32.    Document.Write(PSafeArray(TVarData(v).VArray));
    33.    Document.Close;
    34. end; //TextToWebBrowser
    35.  
    36. function GetDosOutput(DosApp: String): string;
    37. const
    38.   ReadBuffer = 2400;
    39. var
    40.   Buffer: PChar;
    41.   BytesRead: DWord;
    42.   Apprunning: DWord;    
    43.   start: TStartUpInfo;  
    44.   ReadPipe, WritePipe: THandle;
    45.   Security: TSecurityAttributes;
    46.   ProcessInfo: TProcessInformation;
    47. begin
    48.   result := '';
    49.  
    50.   with Security do
    51.   begin
    52.     nlength := SizeOf(TSecurityAttributes);
    53.     binherithandle := true;
    54.     lpsecuritydescriptor := nil;
    55.   end;
    56.  
    57.   if Createpipe(ReadPipe, WritePipe, @Security, 0) then
    58.   begin
    59.     Buffer  := AllocMem(ReadBuffer + 1);
    60.     FillChar(Start,Sizeof(Start),#0);
    61.     start.cb          := SizeOf(start);
    62.     start.hStdOutput  := WritePipe;
    63.     start.hStdInput   := ReadPipe;
    64.     start.dwFlags     := STARTF_USESTDHANDLES +
    65.                          STARTF_USESHOWWINDOW;
    66.     start.wShowWindow := SW_HIDE;
    67.  
    68.     if CreateProcess(nil,
    69.           PChar(DosApp),
    70.           @Security,
    71.           @Security,
    72.           true,
    73.           NORMAL_PRIORITY_CLASS,
    74.           nil,
    75.           nil,
    76.           start,
    77.           ProcessInfo)
    78.     then
    79.     begin
    80.       repeat
    81.         Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
    82.         Application.ProcessMessages;
    83.       until (Apprunning <> WAIT_TIMEOUT);
    84.       repeat
    85.         BytesRead := 0;
    86.         ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
    87.         Buffer[BytesRead]:= #0;
    88.        //OemToAnsi(Buffer,Buffer);
    89.         result := result + String(Buffer);
    90.       until (BytesRead < ReadBuffer);
    91.     end;
    92.     CloseHandle(ProcessInfo.hProcess);
    93.     CloseHandle(ProcessInfo.hThread);
    94.     CloseHandle(ReadPipe);
    95.     CloseHandle(WritePipe);  
    96.     FreeMem(Buffer);
    97.   end;
    98. end;
    99.  
     
  2. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.479
    Надо веб-сервер поднять (или тот, что встроен в РНР), или какой-то апач, или самому создавать сокет и т.д.
    получать через php://input или как там его, либо формировать пост-параметры.
     
  3. asmlamo

    asmlamo Active Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.705
    Ставь на вируталку уже готовую сборку для WEB типа Денвера или XAMPP или Vertrigo.

    Там и Апач уже настроенный и PHP и MySQL.

    http://vertrigo.sourceforge.net/?lang=ru

    И уже там делай отладку.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.812
    Я чет смотрю этот кодец на Дельфи, я понимаю, что ТС пытается сделать, но я не понимаю, зачем это может быть нужно. Может, это возможно передать интерпретатору через _POST переменную окружения, я вполне вероятно путаю что-то, но мне казалось, что так можно было делать. То есть интерпретатор подцеплял переменные окружения, не? И да, стоит наверное объяснить, что это, и для чего нужно, и почему именно из Дельфи?
     
  5. asmlamo

    asmlamo Active Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.705
    Не понял у тебя код на Паскале ? Это Дельфи ???
    --- Сообщение объединено, 5 апр 2021 ---
    Для нормальной работы из Дельфи по http нужно работать через HTTP Client API типа
    TNetHTTPClient и им подобные.

    А не через пайпы. Хотя в дельфях не силен ....
     
    Последнее редактирование: 5 апр 2021
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.812
    Не-не, он зачем то запускает именно пхпшный интерпретатор и пытается туда данные передать, как будто это на сервере запущенно. Может он пытается какой-то скрипт пхпшный тестировать или фаззить или анализировать, пока не понятно. Но для решения задачи, нужно бы понять, что это и для чего, сейчас это кажется очень странным.
     
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.734
    Очень странная задачка. Для пэхопэ разница между параметрами в get и post - то, в каком "ассоциативном массиве данных" они лежат. $_GET и $_POST. Очевидно ключем -B можно сформировать такой массив с нужным содержимым перед обработкой файла:
     
  8. who_know777

    who_know777 Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    36
    >>он зачем то запускает именно пхпшный интерпретатор и пытается туда данные передать, как будто это на сервере запущенно. - Да. Так и есть.

    Попытаюсь объяснить, что это, и для чего нужно.

    У меня есть несколько проектов на php, которые я время от времени
    запускаю на портативном веб сервере Open Server'e, или Denver ( Apache + PHP).

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

    Для того чтобы убедиться, запустил веб сервер на localhost, потом в своем exe загрузил localhost в WebBrowser,
    в интерфейсе добавил несколько новых элементов, которые нельзя сделать на php, и понял что в моем случае must have.

    В php скриптах каждый модуль независим, и вряд ли будут
    проблемы со ссылками(я не использую PhpMyAdmin и СУБД).

    И да, я понимаю что эта задача выглядит немного странно.

    Основная трудность в этом:

    В моем проекте есть форма, которая передает данные методом post:
    Код (Text):
    1. echo '<form class = "page" action = "index.php" method = "post">';
    Когда нажимаем Submit, скрипт принимает эти параметры таким образом:

    Код (Text):
    1. if(isset($_POST['submit']))
    2.     {
    3.         $filename = $_POST['filename'];
    4.         if(!empty($filename))
    5.         {
    6.             $content = trim($_POST['content']);
    7.             if(!empty($content)) file_put_contents($filename, $content);
    8.         }
    9.     }
    10.  
    Вопрос как обработать отправку и принятие данных формы именно в моей программе?

    Технически это 100% возможно.
     
    Последнее редактирование: 6 апр 2021
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.812
    Я на самом деле так и не уловил суть, но что могу предложить попробовать сделать. Вероятно, что через некоторые костыли можно заимбеддить интерпретатор в нативное приложение на Дельфи. Я не знаю насчет самого PHP, но была легковесная версия именно для эмбеддинга, называлась PH7. Может быть ее будет достаточно, или же ты нагуглишь способ заимбеддить сам пхпшный интерпретатор. Сделать это именно за счет эмбеддинга упростит взаимодействие с интерпретатором, ты сможешь создавать произвольные объекты для среды, исполняющей пхпшный код.

    Просто то, как ты сейчас передаешь GET-параметры работает только благодаря твоему везению, вряд ли ты найдешь способ передачи POST-данных каким-нить таким способом. Но если такой способ есть, то про него скорее всего знают на форуме или в мейлинг листе разработчиков интерпретатора PHP, а не тут.
     
  10. asmlamo

    asmlamo Active Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.705
    Вопрос как обработать отправку и принятие данных формы именно в моей программе?

    Твоя прога Дельфях клиент ? Которая шлет GET и POST скрипту на серваке ?
    Если это так то работай по HTTP через HTTP Client API типа
    TNetHTTPClient и им подобные.

    Забудь про пайпы ....

    Компонент TNetHTTPRequest – запрос

    Компонент TNetHTTPRequest предназначен для обработки HTTP-запросов. Для его работы необходимо определить клиент, то есть задать свойство компонента:
    property Client: TNetHTTPClient read GetClient write SetClient;
    Компонент реализует те же HTTP-методы, что и TNetHTTPClient: GET, POST, PUT и так далее. Вместе с этим, TNetHTTPRequest расширяет работу TNetHTTPClient.
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.812
    Да нет там сервака в принципе, что ты заладил?
     
  12. asmlamo

    asmlamo Active Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.705
    Как нет ?
    А это что:
    У меня есть несколько проектов на php, которые я время от времени
    запускаю на портативном веб сервере Open Server'e, или Denver ( Apache + PHP).
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.812
    Читай внимательно.
     
  14. mitroha

    mitroha New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2021
    Сообщения:
    2
    Вот так можно посылать и GET и POST по моему это проще.

    Код (Text):
    1. SendHTTPS proc uses esi edi ebx dwIP:dword, dwPort:dword, inData:dword, sinData:dword, outData:dword, psoutData:dword
    2.  
    3.     LOCAL hsock   : dword
    4.     LOCAL ctx     : dword
    5.     LOCAL ssl     : dword
    6.     LOCAL Retval  : dword
    7.     LOCAL traddr  : sockaddr_in
    8.  
    9.     xor     eax, eax
    10.     mov     hsock, eax
    11.     mov     ctx, eax
    12.     mov     ssl, eax
    13.     invoke  socket, AF_INET, SOCK_STREAM, IPPROTO_TCP
    14.     mov     hsock, eax
    15.     mov     eax, dwIP
    16.     mov     traddr.sin_addr, eax
    17.     mov     traddr.sin_family, AF_INET
    18.     invoke  htons, dwPort
    19.     mov     traddr.sin_port, ax
    20.     invoke  connect, hsock, addr traddr, sizeof sockaddr_in
    21.     .if eax != 0
    22.        jmp  @@Err
    23.     .endif
    24.     invoke TLS_client_method
    25.     .if eax == 0
    26.        jmp  @@Err
    27.     .endif
    28.     invoke SSL_CTX_new, eax
    29.     .if eax == 0
    30.        jmp  @@Err
    31.     .endif
    32.     mov    ctx, eax
    33.     invoke SSL_new, ctx
    34.     .if eax == 0
    35.        jmp  @@Err
    36.     .endif
    37.     mov    ssl, eax
    38.     invoke SSL_set_fd, ssl, hsock
    39.     .if eax == 0
    40.        jmp  @@Err
    41.     .endif
    42.     invoke SSL_connect, ssl
    43.     mov    Retval, eax
    44.     invoke SSL_get_error, ssl, Retval
    45.     .if eax != SSL_ERROR_NONE
    46.        jmp  @@Err
    47.     .endif          
    48.  
    49.     invoke SSL_write, ssl, inData, sinData
    50.     mov    Retval, eax
    51.     invoke SSL_get_error, ssl, Retval
    52.     .if eax != SSL_ERROR_NONE
    53.        jmp  @@Err
    54.     .endif          
    55.     mov    esi, psoutData
    56.     invoke SSL_read, ssl, outData, [esi]
    57.     mov    Retval, eax
    58.     invoke SSL_get_error, ssl, Retval
    59.     .if eax != SSL_ERROR_NONE
    60.        jmp  @@Err
    61.     .endif
    62.     mov     eax, Retval
    63.     mov     [esi], eax
    64.  
    65. @@Err:  
    66.     .if ssl != 0
    67.        invoke SSL_shutdown, ssl
    68.        invoke SSL_free, ssl
    69.     .endif
    70.     .if cxt != 0
    71.        invoke SSL_CTX_free, cxt
    72.     .endif
    73.     .if hsock != 0
    74.        invoke shutdown, hsock, 2
    75.        invoke closesocket, hsock
    76.     .endif
    77.     ret
    78.  
    79.  
    80. SendHTTPS endp
     
  15. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.479
    чем проще, тут вообще ничего непонятно. Хоть бы уже ассемблерные инклуды выложил к OpenSSL этому.
    я уже молчу, что на локалхосте оно не будет работать, скорее всего изза ошибок самоподписанного серта.
     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.812
    Мне нравится, как люди рекомендуют слать HTTP-запросы человеку, которому не нужно слать HTTP-запросы.
     
  17. mitroha

    mitroha New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2021
    Сообщения:
    2
    все там понятно и все работает нормально.
    я не понял что ему нужно в прицепе, с openssl можно сделать и клиента и сервер и принимать и получать запросы.
     
  18. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.479
    Как оно может работать, где инклуд и либа TLS_client_method ?
     
  19. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.734
    Мне нравится как человеку продолжают слать рекомендации после того, как он полторы недели уже не заходил и похоже регался только ради этого вопроса.
     
  20. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.479
    f13nd, ну обычно в теме стоит ответить, т.к. иногда с гугла человек приходит по запросу. Даже если сам писал и решил - хорошей практикой считается написать решение.
    Хотя тут вопрос бредовый, конечно.