Formulardaten an externen Server senden

Probier mal Folgendes:
PHP:
function post($url, $query)
{
	$parts = parse_url($url);
	$requestURL = $parts['path'];
	if( !empty($parts['query']) ) {
		$requestURL .= '?'.$parts['query'];
	}
	$request = 'POST '.$requestURL.' HTTP/1.1' . "\r\n";
	$headerFields = array(
		'Host'         => $parts['host'],
		'Content-Type' => 'application/x-www-form-urlencoded',
		'Connection'   => 'close'
	);
	foreach( $headerFields as $fieldName => $fieldValue ) {
		$request .= $fieldName.': '.$fieldValue . "\r\n";
	}
	$request .= "\r\n" . $query;

	$fp = fsockopen($host, empty($parts['port']) ? $parts['port'] : 80);
	fwrite($fp, $request);
	while( !feof($fp) ) {
		$response .= fgets($fp, 128);
	}
	fclose($fp);
	return $response;
}
 
Okay, danke schön, aber das ist ein bisschen zuviel des Guten, außerdem will ich ja selber verstehen, wie es geht ohne mich durch meterlange Scripts zu wälzen.

Ich hab jetzt mal selber ein Script auf der Basis meines zugegebenermaßen geringen verständisses von headern geschrieben, dass aber leider nicht funktioniert. Vielleicht kann mir jemand sagen, was daran falsch ist:
PHP:
$arr['var1'] = 'blubb';
$arr['var2'] = 'bla';
$arr['var3'] = 'flo';
post('beispiel.de/formulare/form1.php?n=4',$arr);

function post($host,$data){
    $path=explode('/',$host);
    $host=$path[0];
    unset($path[0]);
    $path='/'.(implode('/',$path)); 
    
    #Boundary ermitteln
        srand((double)microtime()*1000000);
        $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
    
    #Post-Vars formatieren
        foreach($data as $key => $val){
            $dat .=
                '--'.$boundary."\r\n".
                'Content-Disposition: form-data; name="'.$key."\"\r\n".
                "\r\n".$val."\r\n".
                '--'.$boundary."\r\n";
        }
    
    #Header schreiben
        $header = 
            'POST '.$path." HTTP/1.0\r\n".
            'Host: '.$host."\r\n".
            "Content-type: multipart/form-data, boundary=$boundary\r\n".
            'Content-length: '.strlen($dat)."\r\n\r\n";

    $h = fsockopen($host,80);
    fwrite($h,$header.$dat);
    fclose($h);
}
der Header sähe dann so aus
POST /formulare/form1.php?n=4 HTTP/1.0
Host: beispiel.de
Content-type: multipart/form-data, boundary=---------------------e58cc5ca94
Content-length: 368

-----------------------e58cc5ca94
Content-Disposition: form-data; name="var1"

blubb
-----------------------e58cc5ca94
-----------------------e58cc5ca94
Content-Disposition: form-data; name="var2"

bla
-----------------------e58cc5ca94
-----------------------e58cc5ca94
Content-Disposition: form-data; name="var3"

flo
-----------------------e58cc5ca94

Ich hoffe ich falle auch noch nicht auf die Nerven damit, aber irgentwie verzeifle ich so langsam daran.

P.S.
Habe den letzten Post von Gumbu übersehen. Werde das mal versuchen. Danke!
 
An die letzte Boundary wird noch -- angehaengt, um zu kennzeichnen, dass nun Schluss ist.
Aber die Boundary benoetigst Du eh nur wenn Du mit Dateien arbeiten willst.
Ansonsten werden die Parameter einfach im folgenden Format angehaengt:
Code:
param1name=param1value&param2name=param2value
Also im Grunde wie wenn man sie per GET am URL anhaengt.
Der aus meiner Klasse relevante Code ist
PHP:
fwrite($connection,"POST ".$uri." HTTP/1.1\r\nHost: ".$host."\r\n".$cookiestring."Connection: close\r\n");
fwrite($connection,"Content-Type: application/x-www-form-urlencoded\r\nContent-Length: ".$contentlength."\r\n\r\n".$parameters);
$contentlength entspricht dabei strlen($parameters)
$uri ist die aufzurufenden Datei
$host ist der lokale Hostname
$cookiestring kannst Du rausschmeissen, ausser Du willst Cookies uebergeben
 
Also Gumbo, bei deinem Script fällt mir als erstes auf, dass hier was nicht stimmt:
PHP:
foreach( $headerFields as $fieldName => $fieldValue ) {
        $request .= $headerName.': '.$fieldValue . "\r\n";
    }
"$headerName" müsste hier "$fieldName" heißen.

Aber selbst dann kommt der mir Header etwas komisch vor
POST /formulare/forml.php HTTP/1.1
Host: http://www.beispie.de
Content-Type: application/x-www-form-urlencoded
Connection: close

var1=blubb&var2=bla&var3=muh
 
Wiso, der stimmt doch. Sieht in meinen Augen zumindest richtig aus. Wenn es nicht klappt, muss evt noch die Länge der zu sendenden Daten dazu
Code:
Content-length: ".strlen($query)."\r\n
$query ist hierbei der erzeugte String aus den POST Daten. Das muss noch vor das "Connection: close"
 
Zurück