Roland: Mit php header() post-daten übertragen...

Hi!

Ich möchte Formulardaten an eine API übertragen, die Forumlardaten solln aber von PHP ausgefüllt werden, daher meine Frage, wie kann ich bei der Funktion header() Post-Daten übertragen.

lg
Roland

  1. Hi,

    Ich möchte Formulardaten an eine API übertragen, die Forumlardaten solln aber von PHP ausgefüllt werden, daher meine Frage, wie kann ich bei der Funktion header() Post-Daten übertragen.

    Header schreibt, wie der Name schon sagt, header.

    POST-Daten werden im body des Request übertragen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. wie könnte ich es denn dann sonst realisieren?

      danke
      Roland

      1. wie könnte ich es denn dann sonst realisieren?

        Hallo Roland,

        das Zauberwort heisst: CURL
        http://de.php.net/manual/de/function.curl-setopt.php

        Beispiel

        Leider wird das sehr oft missbraucht für unangebrachte Handlungen, ich selber kam das erste Mal damit in Berührung, als ich für eine sogenannte Serverfarm gearbeitet habe, und dort ist es eine der wichtigsten Librarys.

        Also bau keinen Mist damit!

        1. Eh nicht, das wird eh nur nach einem klick eines Benutzers aufgerufen...

          danke
          Roland

        2. Mit CURL kann ich Daten von einer Website auslesen, aber ich auf sie weiterleiten, passt also nicht :-/

          lg
          Roland

          1. Mit CURL kann ich Daten von einer Website auslesen, aber ich auf sie weiterleiten, passt also nicht :-/

            Da liegst du aber völlig daneben. Curl wird, wie bereits erwähnt, auch missbraucht, zum beispiel um sich Tausende von Bloagaccounts anzulegen, wo curl eben die komplette Anmelde und Weiterleitungsprozedur übernimmt.

            Anmelden, Login, Bilder hochladen, News eintragen, etc....

            Paul

            1. Aso, und wie könnte ich das denn mit Curl realisieren?

              lg
              Roland

  2. Hello Roland,

    einigermaßen erklärt wird es hier:
    http://www.php-faq.de/q/q-code-post.html

    <?php  #### post2host.php ####

    function post2host($host, $path, $referer, $data_to_send)
    {
      $fp = fsockopen($host, 80);
    #  printf("Open!\n");
      fputs($fp, "POST $path HTTP/1.1\n");
      fputs($fp, "Host: $host\n");
      fputs($fp, "Referer: $referer\n");
      fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
      fputs($fp, "Content-length: ". strlen($data_to_send) ."\n");
      fputs($fp, "Connection: close\n\n");
      fputs($fp, "$data_to_send\n");
    #  printf("Sent!\n");

    while(!feof($fp))
      {
        $res .= fread($fp, 128);
      }

    #  printf("Done!\n");
      fclose($fp);

    return $res;
    }

    $data = "pid=14&poll_vote_number=2";

    #printf("Go!\n");

    $x = PostToHost(
                  "www.linux.com",
                  "/polls/index.phtml",
                  "http://www.linux.com/polls/index.phtml?pid=14",
                  $data
    );

    ?>

    Ausgaben auf die Standardausgabe haben innerhalb einer Funktion nichts zu suchen.
    Ich bin mir nicht ganz klar darüber, ob man zum Senden der Daten nicht auch eine Schleife bauen müsste, die immer nur blockweise sendet, oder ob PHP das hier schon alleine schafft.

    Ein harzliches Glückauf

    Tom vom Berg

    http://bergpost.annerschbarrich.de
    .

    --
    Nur selber lernen macht schlau
    1. Hello,

      das gepostete Beispiel ist allerdings noch nicht einmal die Hälfte der Miete.
      Denn wenn man es "richtig" machen will, sollte man vor einem größeren Post erstmal einen HEAD-Request absenden, ob die Ressource überhaupt noch unter der URL erreichbar ist. Dies müsste man dann solange fortsetzen, wie ein Redirect zurückkommt bzw. bis ein Status 200 zurückkomt.

      Dann erst den eigentlichen Post absetzen an die resultierende URL.

      Sonst schickt man nutzlos Daten durch das netzt, ohne wissen zu können, ob sie überhaupt eine Chance haben, beim gewünschten Ziel anzukommen.

      Ein harzliches Glückauf

      Tom vom Berg

      http://bergpost.annerschbarrich.de
      .

      --
      Nur selber lernen macht schlau
      1. Denn wenn man es "richtig" machen will, sollte man vor einem größeren Post erstmal einen HEAD-Request absenden, ob die Ressource überhaupt noch unter der URL erreichbar ist. Dies müsste man dann solange fortsetzen, wie ein Redirect zurückkommt bzw. bis ein Status 200 zurückkomt.

        Sowas könnte schon fast DDoS sein...

        Sonst schickt man nutzlos Daten durch das netzt, ohne wissen zu können, ob sie überhaupt eine Chance haben, beim gewünschten Ziel anzukommen.

        M.E. verursacht ein HEAD-Request nebst Response plus POST-Request nebst Response mehr sinnlosen Traffic als gleich ein POST-Request. Sollte die Ressource nicht verfügbar sein, gibt's eine Fehlermeldung und gut.

        Siechfred

        --
        Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
        1. Hello,

          M.E. verursacht ein HEAD-Request nebst Response plus POST-Request nebst Response mehr sinnlosen Traffic als gleich ein POST-Request. Sollte die Ressource nicht verfügbar sein, gibt's eine Fehlermeldung und gut.

          Das interessiert mich nun wirklich, ob man das File mit einigen Megabyte nun wirklich gleich anhängen sollte, oder doch erstmal prüfen, ob die Ressource noch vorhanden ist.

          Ein harzliches Glückauf

          Tom vom Berg

          http://bergpost.annerschbarrich.de
          .

          --
          Nur selber lernen macht schlau
          1. Hi!

            Ich erhalte folgenden Fehler :-/
            Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com/:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in /[link.php] on line 754

            thx
            Roland

            1. Hello Roland,

              Ich erhalte folgenden Fehler :-/
              Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com/:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in /[link.php] on line 754

              Und hier bekomsmt Du den Status-Code "not suficiant input"...

              OS?
              PHP-Version und Implementation? (Modul, CGI, FastCGI)
              Weberserver Typ und Version?
              Provider?
              PHP-Konfiguration? -> phpinfo() -> allow_url_fopen: ?

              usw...

              Ein harzliches Glückauf

              Tom vom Berg

              http://bergpost.annerschbarrich.de
              .

              --
              Nur selber lernen macht schlau
              1. sry,

                Linux mx1 2.6.16.1 #5 SMP PREEMPT Tue Apr 4 16:28:46 CEST 2006 i686
                Server API: CGI/FastCGI
                Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.7e DAV/2 mod_fastcgi/2.4.2

                PHP Version 5.2.4
                allow_url_fopen is on

                1. Hello,

                  sry,

                  Ok

                  da muss ich aber auch erst mal basteln, um das nachzustellen...

                  Ein harzliches Glückauf

                  Tom vom Berg

                  http://bergpost.annerschbarrich.de
                  .

                  --
                  Nur selber lernen macht schlau
                  1. Ok, ich habs jetzt zum laufen gebraucht, hab auf folgendes geändert:
                        $fp = fsockopen($host, $port, $errno, $errstr, 30);

                    ich wollte damit aber auf die Seite weitergeleitet werden, nicht den Inhalt der Seite bei mir anzeigen können!

                    lg
                    Roland

                    1. Hi,

                      Ok, ich habs jetzt zum laufen gebraucht, hab auf folgendes geändert:
                          $fp = fsockopen($host, $port, $errno, $errstr, 30);

                      ich wollte damit aber auf die Seite weitergeleitet werden, nicht den Inhalt der Seite bei mir anzeigen können!

                      Mit dem, was du derzeit machst, fordert dein PHP-Script Daten von irgendwoher an. Also ist es auch an deinem PHP-Script, diese ggf. anzuzeigen.

                      Es existiert keine mir bekannte sichere Moeglichkeit, POST-Daten per HTTP "weiterzuleiten".

                      Fuer alle 3xx-Statuscodes gilt die Praemisse:
                      The action required MAY be carried out by the user agent without interaction with the user if and only if the method used in the second request is GET or HEAD.

                      Zu 301 Moved Permanently merkt der RFC an:

                      Note: When automatically redirecting a POST request after
                            receiving a 301 status code, some existing HTTP/1.0 user agents
                            will erroneously change it into a GET request.

                      Ob das mit "zeitgemaessen" Clients unter Verwendung von HTTP/1.1 anders aussieht, muesste man testen.

                      302 Found sollte per Spezifikation zwar gehen, ist in der Praxis aber wohl auch untauglich:

                      Note: RFC 1945 and RFC 2068 specify that the client is not allowed
                            to change the method on the redirected request.  However, most
                            existing user agent implementations treat 302 as if it were a 303
                            response, performing a GET on the Location field-value regardless
                            of the original request method. The status codes 303 and 307 have
                            been added for servers that wish to make unambiguously clear which
                            kind of reaction is expected of the client.

                      307 Temporary Redirect sollte ebenfalls die POST-Methode beibehalten (k.A., ob das zeitgemaesze Clients so umsetzen) - allerdings auch hier nicht ohne explizite Nachfrage an den Nutzer.

                      Das einzig halbwegs praxistaugliche waere m.E. eine "Weiterleitung" "per HTML" (und JavaScript):
                      PHP-Script baut HTML-Formular mit den benoetigten Daten in vorbelegten Feldern auf [1], versieht es mit der externen Zieladresse als action, liefert dieses an den Client aus - und laesst es dort per JavaScript automatisch abschicken.

                      [1] Geht natuerlich nicht fuer File-Uploads.

                      MfG ChrisB

            2. Hi,

              Ich erhalte folgenden Fehler :-/
              Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com/:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in /[link.php] on line 754

              In dieser Meldung wird dir sogar explizit eine Frage gestellt - wieso beantwortest du sie nicht (bzw. fragst zunaechst den Serveradmin, der es koennen sollte)?

              MfG ChrisB

              1. weil das eben enabled ist ;)

                Und ich dachte das es vielleicht am code liegt!

                lg
                Roland

    2. Hello,

      Noch ein Nachtrag:

      einigermaßen erklärt wird es hier:
      http://www.php-faq.de/q/q-code-post.html

      <?php  #### post2host.php ####

      function post2host($host, $path, $referer, $data_to_send, $port=80)

      {

      $fp = fsockopen($host, $port);
          fputs($fp, "POST $path HTTP/1.1\r\n");
          fputs($fp, "Host: $host\r\n");
          fputs($fp, "Referer: $referer\r\n");
          fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
          fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");
          fputs($fp, "Connection: close\r\n\r\n");
          fputs($fp, "$data_to_send\r\n");

      while(!feof($fp))
        {
          $res .= fread($fp, 128);
        }

      fclose($fp);

      return $res;
      }

      Header müssen mit CRLF aabgeschlossen werden. PHP nutzt aber kein magisches "\n", sondern ein rein ersetzendes. Es muss also dediziert "\r\n" angegeben werden.

      Außerdem sollte man bei größeren Datenmengen noch beachten, ob man nicht "chunked" übertragen muss, also mit Zeilenumbrüchen. Es fehlt auch ein Content transfer encoding.

      Wenn man sich einen Requestheader anschauen will, hilft z.B. php://input als Kanal zum Auslesen.

      http://forum.de.selfhtml.org/archiv/2006/10/t139327/#m904985
      http://www.php.net/manual/en/wrappers.php.php

      Bau Dir also ein Formular, fülle es aus mit Umlauten etc, und sende es dann an Deinen Testserver. Dann kannst Du es ansehen. Achte auf das Encoding der Daten.

      Auch dafür ist der Head-Request ggf. gut, um herauszufinden, welche Codierung der Server haben will.

      Wäre schön, wenn wir das hier mal fertig diskutieren könnten, wie so ein Request vollständig und sauber aufgebaut werden sollte.

      Ein harzliches Glückauf

      Tom vom Berg

      http://bergpost.annerschbarrich.de
      .

      --
      Nur selber lernen macht schlau
  3. Hi,

    Ich möchte Formulardaten an eine API übertragen, die Forumlardaten solln aber von PHP ausgefüllt werden, daher meine Frage, wie kann ich bei der Funktion header() Post-Daten übertragen.

    Vielleicht machst du dir erst mal den Unterschied zwischen Request und Response klar.

    MfG ChrisB

    1. Ich kenn den Unterschied!

      Das mit der API ist nicht ganz richtig, eigentlich wäre es ein Formular, das man auf der Website einbauen soll, ich will aber das die Daten nicht vom benutzer eingegeben werden müssen, sondern aus einer db kommen, daher der Wunsch $_POST mit PHP beim weiterleiten auf eine andere Website mitzuschicken...

      Ich bin bei den andren Antworten aber schon fündig geworden (
      Tom vom Berg).

      lg
      Roland