Cookie bei fsockopen() im header mitsenden

Ich nutze die Version 1.1.
In der Session Variable steht lediglich das Cookie was ich bei meinem ersten Aufruf bekomme.

mein Skript:

PHP:
<?php
session_start();
 //$url="http://www2.htlwrn.ac.at/d05044/sbnk/buecher.php";
 
if(empty($_POST['stichwort'])){
	 $ch = curl_init();
	$url="http://www.bibliotheken.at/woload.asp?startart=1&startland=31818001";
	
	$proxy="193.170.149.182";
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch,CURLOPT_COOKIEJAR,"cookies.txt");
	/*//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
	curl_setopt($ch, CURLOPT_TIMEOUT, 20);  
	//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
	curl_setopt($ch,CURLOPT_PROXYPORT,8080);
	
	curl_setopt($ch,CURLOPT_PROXY,$proxy);
	
	//curl_setopt($ch,CURLOPT_REFERER,$referer);
	//curl_setopt($ch,CURLOPT_COOKIEFILE,'cookies.txt');*/
	curl_setopt($ch, CURLOPT_HEADER, 1);
	
	$output = curl_exec($ch);
	$info = curl_getinfo($ch);
	
	
	$header = $output;
	$end = strpos($header, "Content-Type");
	$start = strpos($header, "Set-Cookie");
	$parts = split("Set-Cookie: ",substr($header, $start, $end-$start));
	$cookies = array();
	foreach ($parts as $co)
	{
	$cd = split(";",$co);
	if (!empty($cd[0]))
	$cookies[] = $cd[0];
	}
	
	//file_put_contents ("cookies.txt", "test"); 
	
	if ($output == false /*|| $info['http_code'] != 200*/) {
	  $output = "No cURL data returned for $url [". $info['http_code']. "]<br/>";
	  if (curl_error($ch))
		$output .= "\n". curl_error($ch);
	   echo 'Es ist ein Fehler aufgetreten!<br/>';
	  // echo $output;
	   echo implode(";",$cookies);
	   file_put_contents("cookies.txt",implode(";",$cookies));
	  }
	else {
	  // 'OK' status; format $output data if necessary here:
	  echo 'Hat funktioniert!<br/>';
	  //echo $output;
	  echo implode(";",$cookies);
	  echo $output;
	  file_put_contents("cookies.txt",implode(";",$cookies));
	}
	curl_close($ch);
	
	$_SESSION['cookie']=implode(";",$cookies);
	

	// then return or display the single string $output
}
else{
	
	/*
	$ch = curl_init();
	$url="http://www.bibliotheken.at/results.asp";
	
	echo $url."<br/>";

	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch,CURLOPT_COOKIEFILE,'cookies.txt');
	curl_setopt($ch,CURLOPT_COOKIEJAR,"cookies.txt");
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,120);
	curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT,   61440);
    curl_setopt($ch, CURLOPT_LOW_SPEED_TIME,    20); 
	curl_setopt($ch,CURLOPT_TIMEOUT,6580);
	curl_setopt($ch,CURLOPT_POST,1);
	curl_setopt($ch,CURLOPT_POSTFIELDS,"Stichwort=".$_POST['stichwort']."&ZST=31818001");
	//curl_setopt($ch, CURLOPT_TIMEOUT, 20);  
	curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
	//curl_setopt($ch,CURLOPT_PROXYPORT,8080);
	
	//curl_setopt($ch,CURLOPT_PROXY,$proxy);
	
	//curl_setopt($ch,CURLOPT_REFERER,$referer);
	//curl_setopt($ch,CURLOPT_COOKIEFILE,'cookies.txt');*/
	//curl_setopt($ch, CURLOPT_HEADER, 1);
	/*
	$output = curl_exec($ch);
	$info = curl_getinfo($ch);

	if ($output == false /*|| $info['http_code'] != 200) {
		  $output = "No cURL data returned for $url [". $info['http_code']. "]<br/>";
		  if (curl_error($ch))
			$output .= "\n". curl_error($ch);
		   echo 'Es ist ein Fehler aufgetreten!<br/>';
		  echo $output;
		  
	 }
	else {
	  // 'OK' status; format $output data if necessary here:
	  echo 'Hat funktioniert!<br/>';
	  echo $output;
	file_put_contents("test.txt",$output);
	}
	curl_close($ch); */
	
//2---
/**	  $opts = array(
      'http'=>array(
        'method'=>"GET",
        'header'=>"Accept-language: en\r\n" . 
                  "Cookie: ".$_SESSION['cookie']."\r\n"
      )
    );

	echo $_SESSION['cookie'];
    $context = stream_context_create($opts);

    $link = "http://www.bibliotheken.at/results.asp?Stichwort=".$_POST['stichwort']."&ZST=31818001"; //Beispiel
    $data = fopen($link, 'r', false, $context);
    $data = fgets($data);
	echo $data;**/
	
	
//3---
require("httpconnection.class.php");
/*$http=new httpconnection("www.bibliotheken.at");
$data=$http->post("results.asp","Stichwort=".$_POST['stichwort']."&ZST=31818001",$_SESSION['cookie'],"","","","");
echo nl2br(print_r($data['head'],true));
$output= $data['body'];
file_put_contents("test.txt",$output);
unset($http);*/


$http=new httpconnection("www.bibliotheken.at");
$data=$http->get("results.asp","Stichwort=".$_POST['stichwort']."&ZST=31818001",$_SESSION['cookie'],"","");
echo nl2br(print_r($data['head'],true));
echo $data['body'];
unset($http);
}
?>

<form name="aha" method="post" action="<? echo $_SERVER['SCRIPT_NAME'];?>">
<span style="margin-top: 5px; color: black;">Stichwort:</span>
<input type="text" name="stichwort" size="15" />

<input type="submit" value="suchen" title="Suchen" />

 </form>

Ich hoffe du kennst dich aus.
 
Der Cookie wird also in der Variable in der Form Cookie-Name=Cookie-Wert festgehalten, richtig?
Nur ein Cookie oder mehrere?
Wie sind diese getrennt?
In den Beispielen im Tutorial hatte ich mit & getrennt, bin aber nicht mehr so sicher ob das auch richtig ist. In der neuen Version der Klasse wird nun per Array uebergeben, und die Klasse trennt dann die Cookies intern mit ;

Weiterhin moechte ich empfehlen Dir die aktuelle Version von HTTPConnection zu besorgen. Es gibt dabei zwar eine Abhaengigkeit zu einer anderen Klasse (TCPConnection, da "Low-Level"-Funktionen in diese ausgelagert wurden) aber auch einige Verbesserungen. So finde ich z.B. dass die Uebergabe von Parametern und Cookies in Arrays wesentlich freundlicher ist als in Strings.

Auch frag ich mich grad warum Du einen Teil mit Curl abwickelst und einen anderen Teil mit meiner Klasse. Waere es nicht einfacher entweder komplett mit Curl oder eben komplett mit meiner Klasse zu arbeiten?
 
Es ist nur ein Cookie, folglich ist die Sache mit dem Trennzeichen eh egal.

Zu meiner Misch-Masch-Programmierung:

1. Ich habe es mit Curl probiert, mit dem gleichen Fehler! ---> Seite konnte nicht angezeigt werden...
2. Also habe ich andere Lösungsansätze ausprobiert.

Wie funktioniert die Cookie-Auslesung mit deiner Klasse eigentlich?

Mit der Header-Funktion oder?
 
So jetzt habe ich es komplett mit deiner Klasse:
PHP:
<?php 
session_start();

require("httpconnection.class.php");

if(empty($_POST['stichwort'])){
$http=new httpconnection("www.bibliotheken.at");
$data=$http->get("woload.asp","startart=1&startland=31818001","","","");
//echo nl2br(print_r($data['head'],true));
echo $data['head']['cookies'][0]['name']."=".$data['head']['cookies'][0]['value'];
$_SESSION['cookie']=$data['head']['cookies'][0]['name']."=".$data['head']['cookies'][0]['value'];
unset($http);
}
else{
$http=new httpconnection("www.bibliotheken.at");
$data=$http->post("results.asp","Stichwort=".$_POST['stichwort']."&ZST=31818001",$_SESSION['cookie'],"","","","");
echo nl2br(print_r($data['head'],true));
echo $data['body'];
unset($http);

}

?>

Bekomme auch das richtige Cookie, aber bei der POST-Funktion bleibt das Resultat leer!

Andere Anregungen vllt und danke für alles!
 
Es scheint als muesstest Du die erste Seite zweimal aufrufen, beim zweiten Mal mit dem Cookie.

Hier mal wie ich es zum laufen gekriegt hab.
PHP:
<?php
require_once('../php-classes/php5/tcpconnection.class.php');
require_once('../php-classes/php5/httpconnection.class.php');

$stichwort='Baum';

$http=new httpconnection('www.bibliotheken.at');

$data=$http->get('woload.asp',array('startverbund=','startart=','startland='));
$cookies=array($data['head']['cookies'][0]['name'].'='.$data['head']['cookies'][0]['value']);
$data=$http->get('woload.asp',array('startverbund=','startart=','startland='),$cookies);

$data=$http->get('results.asp',array('STICH1='.$stichwort),$cookies);

var_dump($data['head']);
echo $data['body'];
unset($http);
?>

Der Code nutzt die aktuelle Version der Klasse, duerfte also in der Form mit der Version die Du einsetzt nicht laufen.

Die neue Version kannst Du hier bekommen. Nicht vergessen, TCPConnection brauchst Du dabei auch.
 
Also ein kleines Problem noch:

Lokal funktioniert alles super.

Aber auf dem Testserver muss ich an einem proxy vorbei, folgender Fehler erscheint:
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.bibliotheken.at:80 (No route to host) in /home/students/d05044/www/tcpconnection.class.php on line 71

Hättest da auch einen rettenden Vorschlag? ;)
 
Zurück