Daten per POST mittels Indy verschicken

schnuggel

Grünschnabel
Hallo Leute,

Ich sitze jetzt schon zu lange an diesem Problem, alsdass noch Aussicht auf Erfolg besteht. :( Bitte helft mir also!

Ich will mit den Indy 9 - Komponenten ein paar Werte per POST an ein PHP-Script schicken. Folgender Delphi-Code stammt aus dem Internet:


Code:
(Delphi)
uses IdMultipartFormData;
[...]

procedure Tfrm_main.Button1Click(Sender: TObject);
var
  data: TIdMultiPartFormDataStream;
begin
  data := TIdMultiPartFormDataStream.Create;
  try
    { add the used parameters for the script }
    data.AddFormField('field1', 'test');
    data.AddFormField('field2', 'value2');
    data.AddFormField('field3', 'value3');

    { Call the Post method of TIdHTTP and read the result into TMemo }
    Memo1.Lines.Text := IDHTTP1.Post('http://www.test.de/testordner/test.php', data);
  finally
    data.Free;
  end;
end;

Das PHP-Script, an welches die Daten gePOSTet werden:

Code:
(PHP)
<?
echo "Folgende Daten wurden per POST geschickt: ";
echo $_POST['field1'];
?>

In dem Memo-Feld sollte nach dem POST-Aufruf eigentlich folgendes stehen:

"Folgende Daten wurden per POST geschickt: test"

Tut es aber nicht! Es steht dort lediglich:

"Folgende Daten wurden per POST geschickt: "

Wieso kommen die Daten nicht an? Am PHP-Script kann es eigentlich nicht liegen, denn wenn ich die Felder über eine HTML-Seite übertrage, funktioniert alles wunderbar.

Danke für Eure Hilfe!

Cornelius
 

ixtreme-delphi

Grünschnabel
den post request mit indy zu senden ist ne sache für sich....da gibts oft probleme...


naja, dein php script kann doch genausogut so aussehen:

Code:
<?
echo "Folgende Daten wurden per POST geschickt: $field1 ";
?>

gruß

ixtreme.de
 

JoelH

Erfahrenes Mitglied
hmm,

@ixtreme

nicht unbedingt, man kann den php Interpreter so einstellen dass man die POST/GET Variablen nutzen muss. das erhöht die Sicherheit !
 

schnuggel

Grünschnabel
zur Sache, bitte

Mensch Leute,

ist dieses Forum dazu da, um sich hier wie die Kleinkinder aufzuführen?

Es sollte doch vorallem genutzt werden, um anderen Usern behilflich zu sein (s.o. "tutorials.de - User helfen Usern").

Da kriege ich andauernd Emails vom tutorials.de-Mailer, die mich auf eingegangene ANTWORTEN zu meiner FRAGE hinweisen. Voller Erwartung klicke ich auf den Link, in der Hoffnung, dass endlich irgend jemand meinen Hilferuf erhört hat und mir die alles entscheidenden Zeilen Quelltext verraten hat... und dann sind diese "Antworten" von spielenden Kindern verfasst, die meinen Thread dazu missbrauchen, sich über eine lächerliche Trivialität die Haare zu zerspalten!

Also wirklich! Zur Sache bitte! Und wenn man selbst keine Ahnung hat, sollte man mit den Fingerchen erst gar nicht in Reichweite der Tastatur kommen... Oder geilt Euch die Zahl unter Eurem Nickname, wieviele "Beiträge" Ihr schon "geleistet" habt, irgendwie auf?

Cornelius

P.S.
Es widerstrebt mir zutiefst, diesen Beitrag verfasst zu haben, weil er sich kaum von dem nichtssagenden Geplänkel unterscheidet, den hier einige verzapfen. In der Hoffnung, dass es nach diesem Beitrag weniger Geplänkel geben wird, und mehr Konstruktives, habe ich dennoch auf den "Antworten"-Button geklickt.
 
Zuletzt bearbeitet:

Dhyani

Grünschnabel
Hat mich auch schon ein Weilchen aufgehalten die ganze Geschichte.. aber so funktionierts [ zumindest bei mir :) ]

function HTTPEncode(const AStr: string): string;
const
NoConversion = ['A'..'Z', 'a'..'z', '*', '@', '.', '_', '-'];
var
Sp, Rp: PChar;
begin
SetLength(Result, Length(AStr) * 3);
Sp := PChar(AStr);
Rp := PChar(Result);
while Sp^ <> #0 do
begin
if Sp^ in NoConversion then
Rp^ := Sp^
else if Sp^ = ' ' then
Rp^ := '+'
else
begin
FormatBuf(Rp^, 3, '%%%.2x', 6, [Ord(Sp^)]);
Inc(Rp, 2);
end;
Inc(Rp);
Inc(Sp);
end;
SetLength(Result, Rp - PChar(Result));
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
Werte : TStringStream;
TestWert : String;
begin
Werte := TStringStream.create('');
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';

TestWert := Memo1.Lines.Text;

Werte.WriteString('P1=' + HTTPEncode(TestWert) + '&');
Werte.WriteString('P2=Wenn du das hier liest, hats wohl funktioniert');
try
Memo1.Lines.Text := IdHttp1.Post('http://localhost/Test/script.asp', Werte);
except
on E: Exception do
showmessage('Fehler: ' + E.Message);
end;
end;

Einfach mal nen langen Text ins Memo reinkopieren, den Button drücken, und sehen, was passiert :)