Archief - wanted: php (again) submit data script niet curl

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

SyRuS.be

Legacy Member
Curl wil niet lukken op mn server en is me net iets te uitgebreid, maar toont wel goed aan wat ik zoek met een alternatief script.

Er spelen 3 pagina's mee in mijn "probleem"
"Mijnpagina1"
"Mijnpagina2"
"Infopagina" (deze zijn php, of phtml maakt niet super uit).

Je komt op "Mijnpagina1" en daar vul je je naam in, die deze stuurt naar pagina2 waar je dan je bijhorde info kunt zien van op de Infopagina.

Dit is opgelost met volgende script: (dank aan Cyberkef!)

PHP:
<?php 
$fp = fopen("www.voorbeeld.com/infopagina.htm","r"); 
if (!$fp) 
{ 
echo "$errstr ($errno)<br />\n"; 
} 
else 
{ 
$out = "GET / HTTP/1.1\r\n"; 
$out .= "Host: www.voorbeeld.com.htm\r\n"; 
$out .= "Connection: Close\r\n\r\n"; 

fwrite($fp, $out); 

$x = 0; 
while (!feof($fp)) 
{ 
$data[$x] = fgets($fp); 
$x++; 
} 
fclose($fp); 
} 
echo $data[70-0];
?>

Nu is er maar 1 probleem en dat is dat ik ipv de info dit krijg "geen gebruikersnaam". "Mijnpagina1" stuurt nochtans de info ook al naar "infopagina". Wat moet er dus gebeuren? Voor dat de array de pagina binnehaalt moet ik een php scriptje dat van zichzelf een simpel formpje submit. Eigenlijk zoals deze curl:
http://www.higherpass.com/php/tutorials/Using-Curl-To-Query-Remote-Servers/1/
(dank aan dJeez! maar curl is me wat te veel script en gedoe op mn server voor zo'n enkel scriptje)

Nu is de uitdaging, wie weet of kent er een script :unsure:
(sorry voor het nieuwe topic maar het vorige was zo chaotisch en ging eigenlijk over het probleem waar Cyberkef me mee hielp)

Ik probeerde eerst zelf :$ een java body onload submit maar die's trager als de array dus eerst haal ik daarmee de pagina binnen en dan pas submit hij lol :rofl:

edit: is dit niet aan te passen aan mijn noden? http://www.phpclasses.org/browse/package/2046.html

dJeez

Legacy Member
Pff, bekijk dan de PEAR HTTP Client klasse eens.

Je moet via PEAR op z'n minst Net_URL, HTTP_Request en HTTP_Client zelf installeren.

Daarna kan je data posten naar een script op onderstaande manier (aangezien 'k niet direct een voorbeeld vond snel ff ineen geknutseld) :
PHP:
<?php

require_once('HTTP/Client.php');

$data = array('var1' => 'value1', 'var2' => 'value2', 'var3' => 'value3');

$hc = new HTTP_Client();
$hc->post('http://localhost/phptest/dumpvars.php', $data);
$data = $hc->currentResponse();

print_r($data);

?>

De return value (dus het resultaat in $data) is een associatieve array waarin in $data['body'] de HTML weergave staat dat het script waarnaar je hebt gepost als resultaat gaf (je kan ook de headers en de HTTP return code uitlezen respectievelijk via $data['headers'] en $data['code']).

Je kan desnoods zelf de nodige PEAR klasses op de server zetten als die niet beschikbaar zouden zijn (alhoewel ik dan eerder aan de hosting provider zou vragen van ze erop te zetten want die zijn enorm handig). Zelf installeren op de server doe je door ze eerst lokaal te installeren en dan de folders die toegevoegd werden onder je PHP Pear folder (in dit geval dus op z'n minst de Net folder en de hele HTTP folder - inclusief subfolders) op de server te zetten via FTP. In het script voeg je dan helemaal bovenaan nog 't volgende toe (ervan uitgaande dat je de PEAR klasses in een folder PEAR zet die direct onder de document root - maw de hoogste folder van de website - staat).
PHP:
$includepath = ini_get('include_path');
$includepath .= ';' . $_SERVER['DOCUMENT_ROOT'] . '/PEAR/';
ini_set('include_path', $includepath);

SyRuS.be

Legacy Member
thanks om me telkens te helpen dJeez (trouwens die pff is wat je handelsmerk of is dat enkel bij mij :p ). Ik ben een lastige klant ik weet het, maar zo simpel vind ik het allemaal niet als jou.

Ik ga de pear er bij mij op proberen zetten. En thanks voor dat scriptje. Mag ik anders je msn niet dan "bug" ik je daar wat ipv elk probleem te moeten posten. Ik vind persoonlijk dat er weinig duidelijke (voor beginners) readme's zijn van die php paketten!

De xml moet ik uploaden met de client map en het volgende aanpassen?
<filelist>
<file role="php" baseinstalldir="HTTP" name="Client.php"/>
<file role="php" baseinstalldir="HTTP" name="Client/CookieManager.php"/>
<file role="doc" baseinstalldir="HTTP" name="examples/link-checker.php"/>
</filelist>
volgens dit moet het dus in mn root zitten of niet?

Of niks aanpassen, gewoon uppen en in mn pagina verwijzen naar waar het staat via je extra scriptje?

(echt super bedankt, ik weet dat ik een pain in the :) ben

dJeez

Legacy Member
MSN (of een andere IM) gebruik 'k niet, je zal me dus via hier moeten buggen :p.

Maar ik vrees dat je PEAR dus nog niet gebruikt hebt. Via de DOS prompt ga je naar de folder waar je PHP hebt geïnstalleerd, en doet dan pear install <package> om een PEAR klasse te installeren.

Dus voor dit geval pear install HTTP_Client. Als er dependencies zijn die nog niet geïnstalleerd zijn krijg je daar een melding van, de bedoeling is dat je die dan eerst installeert (en desnoods daar weer de dependencies van) en daarna pas opnieuw probeert van de klasse te installeren.

Ach ja, het zou wel kunnen dat je eerst nog go-pear moet uitvoeren...

Die XML file is louter informatief voor de PEAR package manager, dus moet je die helemaal niet FTPen.

S3cT0r

Legacy Member
Ik ben niet helemaal zeker of ik snap wat uw probleem is, maar me dunkt dat je een paar post variables wilt verzenden naar de Infopagina zodat die goed kan reageren op de socket? In dit geval zal dit makkelijk en zonder veel aanpassing via uw bestaande scriptje in de header gaan:

Code:
<?php
$fp = fopen("www.voorbeeld.com/infopagina.htm","r");
if (!$fp)
{
echo "$errstr ($errno)<br />\n";
}
else
{
$size = DE GROOTE VAN UW DATA, VIND HIER MAAR EEN FUNCTIE VOOR;

$out = "POST /infopagina.php HTTP/1.1\r\n";
$out .= "Host: www.voorbeeld.com\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: $size\r\n\r\n";
$out .= "urlencode($data)";

fwrite($fp, $out);

$x = 0;
while (!feof($fp))
{
$data[$x] = fgets($fp);
$x++;
}
fclose($fp);
}
echo $data[70-0];
?>

Ik ben wel niet zeker of het 100% correct is, kheb het maar ff in mekaar gestoken omdat ik niet snel een voorbeeld vond zoals hierboven :)
Maar dit zou je een idee moeten geven.

SyRuS.be

Legacy Member
:love: :niceone:

Die grote van de data moet dat? (want dies variabel aan de naam die ze invullen). Iemand die het nog kan perfectioneren? Kzal zelf ook proberen :unsure:

Super doeper bedankt.

en dJeez, wat lijken die paketten me moeilijk zeg! :confused: Ben echt blij dat ik ze kan ontwijken (maar je hulp was super gewardeert) maar damn lol.

Dos openen op mn server dan? :crazy: Ge kon me toch vragen of ik de red or the blue pill wou nemen eh. Dan blijf ik liever nog in de droomwereld :D

(ik ben geen (matrix) nerd :sop: )

SyRuS.be

Legacy Member
wel... Ik weet dat het slecht bedoeld was maar dat ben ik bezig: aant prutsen

En bij php ben ik voorlopig nog een serieuse prutser :(

euh om terug te komen op s3c zn script, mag ik de size gewoon weglaten? EN als ik vb naam=dirk wil posten zet ik dan gewoon?

$out = "POST /infopagina.phtml HTTP/1.1\r\n";
$out .= "naam: dirk\r\n";

nee toch? :$

edit: of of eerder
$out .= "naam=\"dirk\"\r\n";

SyRuS.be

Legacy Member
in ieder geval het script lukt niet als ik het zo gebruik
PHP:
<?php
$fp = fopen("www.voorbeeld.com/infopagina.htm","r");
if (!$fp)
{
echo "$errstr ($errno)<br />\n";
}
else
{

$out = "POST /infopagina.php HTTP/1.1\r\n";
$out .= "Host: www.voorbeeld.com\r\n";
$out .= "naam=\"dirk\"\r\n";



fwrite($fp, $out);

$x = 0;
while (!feof($fp))
{
$data[$x] = fgets($fp);
$x++;
}
fclose($fp);
}
echo $data[70-0];
?>

maar zo zal het wel niet horen hé :$

(ik krijg nog altijd geen naam binnen)

dJeez

Legacy Member
Luister dan misschien eens hé? Curl en/of PEAR zijn gewoon het makkelijkst, maar nee, da's "te moeilijk". Wel, ik zie het, je bent nu al dagen aan 't prutsen en raakt niet verder, dus misschien zou je er toch eens naar moeten kijken en het uittesten.

SyRuS.be

Legacy Member
ik luister, maar ik pruts nóg meer met PEAR er op proberen te krijgen...

dJeez

Legacy Member
Zeg dan eens wat er niet lukt? Als je PHP lokaal hebt geïnstalleerd ga je gewoon naar de DOS prompt, vervolgens naar de PHP folder en installeer je PEAR door go-pear in te tikken. Er worden dan wat settings gevraagd (normaal zijn de defaults goed, maar lees en check toch maar of wat er op 't scherm staat klopt). Daarna installeer je PEAR klasses via pear install <package> (waar je package uiteraard vervangt door datgene wat je wenst te installeren). Is er ergens een dependency probleem dan zal PEAR dat gewoon komen zeggen, en installeer je eerst de dependencies en dan pas de andere package.

Om je lokale PEAR "in sync" te houden met een remote site kan je best volgende pagina eens nalezen (ik heb dat wel nog niet zelf getest - pas gisteren gezien dat dat mogelijk is) : http://pear.php.net/manual/nl/installation.shared.php#installation.shared.ftp (de pagina is weliswaar nog niet vertaald).

En een voorbeeld van hoe je curl dient te gebruiken voor uw probleem (ff aangepast op basis van het eerder geposte voorbeeld):
PHP:
<?php

$naam = "dJeez";
$curlPost = 'naam='  . urlencode($naam) . '&submit=Send';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://localhost/curltest/infopagina.php');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($ch);
curl_close($ch);

echo "DATA<hr><pre>" . htmlentities($data) . "</pre>";

?>
Uiteraard moet je de verdere verwerking anders opvangen dan die echo, en het zou kunnen dat de submit anders moet zijn, dat hangt totaal van het script af dat je daarvoor gebruikt (in dit geval infopagina.php).

Een - idioot, en niet mijn normale werkwijze, maar soit - voorbeeld voor infopagina.php (niet echt nodig voor u, maar misschien wel makkelijk voor anderen):
PHP:
<?php

$naam = $_POST['naam'];

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
	<title>Infopagina</title>
</head>

<body>

Hallo,
<?php
echo "$naam";
?>
.<br/>

</body>
</html>
Moeilijk kan je dat niet noemen hé...

En laat 'k u niet meer horen over betaald worden om iets te doen hé, anders stuur 'k u de factuur voor bovenstaande :ironic:.

Viper5000

Legacy Member
PHP:
<?php
if (!$fp = fsockopen("www.voorbeeld.com", 80, $errno, $errstr))
{
echo "$errstr ($errno)<br />\n";
}
else
{
$size = strlen(urlencode($data));

$out = "POST /infopagina.php HTTP/1.1\r\n";
$out .= "Host: www.voorbeeld.com\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: $size\r\n\r\n";
$out .= urlencode($data);

fwrite($fp, $out);

$data = '';
while (!feof($fp))
{
$data .= fgets($fp,128);
}
fclose($fp);
}
echo $data;
?>

1. fopen is om bestanden te lezen/schrijven, niet om http connecties te openen; fsockopen is dus nodig als je headers wil verzenden
2. de functie voor de grootte van een string is strlen()
3. ik heb dit niet getest dus kan zijn dat er een foutje in zit, maar normaal moet het werken

SyRuS.be

Legacy Member
hehe Djeez ge hebt het gedult van een... beest besta nog nie...

ook bedankt viper, eens zien of die het ook doet

Viper5000

Legacy Member
oeps, het was weer laat vannacht, verander in de fsockopen functie "www.voorbeeld.com/infopagina.htm" naar "www.voorbeeld.com"

SyRuS.be

Legacy Member
Warning: urlencode() expects parameter 1 to be string, array given in :s
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan