Avatar billede Bjarne Novice
27. januar 2006 - 15:20 Der er 21 kommentarer og
1 løsning

Sende post-data uden form

Hvordan sender man post-data - uden at bruge en form. Altså direkte i scriptet.

Jeg har fundet en funktion på razor.dk, som jeg tror kan klare det, men jeg ved ikke hvordan den skal bruges, da jeg ikke helt forstår selve koden:

function post ($data, $url, $timeout=30) {

  $url_array = parse_url($url);
  $query = "";

  foreach ($data as $key => $value) {
    if ($query) $query .= "&";
    $query.= $key."=".urlencode($value);
  }

  $len = strlen($query);

  $headers =
    "POST ".$url_array["path"]."?".$url_array["query"]." HTTP/1.1\n".
    "Host: $url_array[host]\n".
    "User-Agent: PHP/".phpversion()."\n".
    "Content-Type: application/x-www-form-urlencoded\n".
    "Content-Length: $len\n\n".
    "$query\n";

  $socket = fsockopen($url_array["host"], 80, $errno, $errstr, $timeout);

  if (!$socket) {
    return false;
  } else {
    fputs($socket, $headers);
    while (!feof($socket)) $in .= fgets($socket, 128);
    return $in;
  }

}

Er der en der kan be/afkræfte at funktionen kan klare problemet. Samt hvordan man bruger funktionen.

På forhånd tak
Avatar billede specialty Nybegynder
27. januar 2006 - 19:16 #1
Det ser ud til at du kan bruge funktionen ved at lave et array med dine posts

$posts = array();
$posts["id"] = 22;
$result = post($posts, "http://adressen.du.vil.poste.til.dk");
echo $result;

Ovenstående skulle gerne virke... Jeg har dog ikke lige testet.

Alternativt kan jeg anbefale at bruge en classen clsHtmlSource som er meget nem at gå til:

Du kan downloade den og se eksempler her:

http://www.sloppycode.net/Sloppycode/Article.aspx?id=58
Avatar billede specialty Nybegynder
27. januar 2006 - 19:17 #2
$source = new HtmlSource();

$source->host = "demos.sloppycode.net";
$source->port = 80;
$source->page = "/php/clsHtmlSource/test.php";
$source->method = "POST";
$source->httpversion = 1.0;
$source->timeout = 5;

$source->addPostVar("test",urlencode("test"));
$source->striptags  = false;
$source->showsource = false;

// Output
echo "<h1>POST EXAMPLE</h1>";
echo $source->getSource();
echo "<HR>";
$source = null;

Dette er så det du skal bruge...
Avatar billede olebole Juniormester
27. januar 2006 - 19:38 #3
<ole>

Det er gabende langsomt at bruge HTTP1.1. Jeg har før brugt denne kode, der spinder som en mis:

function myPost($url, $aQuery) {
    $sQuery = "";
    foreach ($aQuery as $key => $val) {
        if ($sQuery<>"") $sQuery .= "&";
        $sQuery .= $key."=".urlencode($val);
    }
    $url_array = parse_url($url);
    $fp = fsockopen($url_array["host"], 80);
    if ($fp) {
        $header = "POST ".$url_array["path"]." HTTP/1.0\n"
                ."Host: ".$url_array["host"]."\n"
                ."Content-Length: ".strlen($sQuery)."\n"
                ."Content-Type: application/x-www-form-urlencoded\n"
                ."Connection: Close\n\n"
                .$sQuery;
        fputs($fp, $header);
        while (!feof($fp)) $return .= fgets($fp, 128);
        fclose($fp);
        return $return;
    }
    return false;
}

$aQ = array( // Variabel/værdi-par
    "varA" => "noget første",
    "varB" => "noget andet",
    "varC" => "noget tredie"
);
$foo = myPost("http://www.domain.dk/sti/til/fil.php", $aQ);

if ($foo) print $foo;
else print "The shit hit the fan :o|";

/mvh
</bole>
Avatar billede Bjarne Novice
27. januar 2006 - 21:46 #4
olebole: Vil gerne bruge din kode, når den er hurtigere. Jeg kan desværre ikke få det til at virke :(

Jeg har lavet to filer jeg sender i mellem:

post.php:

<? ob_start();

function myPost($url, $aQuery) {
    $sQuery = "";
    foreach ($aQuery as $key => $val) {
        if ($sQuery<>"") $sQuery .= "&";
        $sQuery .= $key."=".urlencode($val);
    }
    $url_array = parse_url($url);
    $fp = fsockopen($url_array["host"], 80);
    if ($fp) {
        $header = "POST ".$url_array["path"]." HTTP/1.0\n"
                ."Host: ".$url_array["host"]."\n"
                ."Content-Length: ".strlen($sQuery)."\n"
                ."Content-Type: application/x-www-form-urlencoded\n"
                ."Connection: Close\n\n"
                .$sQuery;
        fputs($fp, $header);
        while (!feof($fp)) $return .= fgets($fp, 128);
        fclose($fp);
        return $return;
    }
    return false;
}
$foo = array("bil"=>"mazda");
myPost("http://localhost/tests/post2.php", $foo);
header("location: http://localhost/tests/post2.php");
exit;
ob_flush();
?>

post2.php: //modtager

<?php
echo $_POST['bil'];
?>

Jeg bliver videresendt til post2.php, hvor jeg får følgende fejl:
Notice: Undefined index: bil in c:\programmer\easyphp1-8\www\tests\post2.php on line 9

hva dælen do I do? :=D
Avatar billede olebole Juniormester
28. januar 2006 - 21:56 #5
1) Du har intet at bruge oveflow-buffering til (ob_start og ob_flush). De bruges primært til at redde dårlig kode med.

2) Det er klart, det ikke virker, når du redirecter til den side, du prøver at poste til - inden du har skrevet resultatet ud.

Hvad er tanken bag den redirect? Har du prøvet den kode, jeg skrev?
Avatar billede olebole Juniormester
28. januar 2006 - 21:56 #6
Baaahhhh .... 'output-buffering' - skulle der naturligvis stå  :)
Avatar billede Bjarne Novice
28. januar 2006 - 23:31 #7
Har slettet ob_start(). Jeg forstår ikke helt, hvordan jeg sender post-data med funktionen :(

Ved godt det er meget at forlange - men kan du ikke prøve at opsætte et grydeklart eksempel. Så kan jeg måske forstå, hvordan det virker :)
Avatar billede olebole Juniormester
30. januar 2006 - 06:55 #8
Jeg tror ikke, det kan gøres mere grydeklart.
Hvad er det, du ikke kan få til at virke?
Hvad har du gjort?
Hvad skete der - og hvad skete der ikke?
Fik du evt. fejl - og i så fald: Hvad sagde den/de?
Avatar billede Bjarne Novice
31. januar 2006 - 16:06 #9
Siden udskriver:
Notice: Undefined variable: return in c:\programmer\easyphp1-8\www\tests\post.php on line 18
HTTP/1.1 200 OK Date: Tue, 31 Jan 2006 14:59:41 GMT Server: Apache/1.3.33 (Win32) PHP/4.3.10 X-Powered-By: PHP/4.3.10 Connection: close Content-Type: text/html
Notice: Undefined index: bil in c:\programmer\easyphp1-8\www\tests\post2.php on line 9

med følgende kode:

<?
function myPost($url, $aQuery) {
    $sQuery = "";
    foreach ($aQuery as $key => $val) {
        if ($sQuery<>"") $sQuery .= "&";
        $sQuery .= $key."=".urlencode($val);
    }
    $url_array = parse_url($url);
    $fp = fsockopen($url_array["host"], 80);
    if ($fp) {
        $header = "POST ".$url_array["path"]." HTTP/1.0\n"
                ."Host: ".$url_array["host"]."\n"
                ."Content-Length: ".strlen($sQuery)."\n"
                ."Content-Type: application/x-www-form-urlencoded\n"
                ."Connection: Close\n\n"
                .$sQuery;
        fputs($fp, $header);
        while (!feof($fp)) $return .= fgets($fp, 128);
        fclose($fp);
        return $return;
    }
    return false;
}

$aQ = array( // Variabel/værdi-par
    "varA" => "noget første",
    "varB" => "noget andet",
    "varC" => "noget tredie"
);
$foo = myPost("http://localhost/tests/post2.php", $aQ);

if ($foo) print $foo;
else print "The shit hit the fan :o|";

?>

Jeg vil gerne bruge det, hvor jeg sender noget data fra en fil til en anden. Hvis jeg fx afsendet noget fra filen post.php og vil bruge det i post2.php.
Avatar billede olebole Juniormester
04. februar 2006 - 01:23 #10
fputs($fp, $header);
$return = "";
while (!feof($fp)) $return .= fgets($fp, 128);
Avatar billede Bjarne Novice
05. februar 2006 - 12:04 #11
er ikke sikker på jeg forstod hvad du mente :)

men her er et forsøg:

<?
function myPost($url, $aQuery) {
    $sQuery = "";
    foreach ($aQuery as $key => $val) {
        if ($sQuery<>"") $sQuery .= "&";
        $sQuery .= $key."=".urlencode($val);
    }
    $url_array = parse_url($url);
    $fp = fsockopen($url_array["host"], 80);
    if ($fp) {
        $header = "POST ".$url_array["path"]." HTTP/1.0\n"
                ."Host: ".$url_array["host"]."\n"
                ."Content-Length: ".strlen($sQuery)."\n"
                ."Content-Type: application/x-www-form-urlencoded\n"
                ."Connection: Close\n\n"
                .$sQuery;
        fputs($fp, $header);
    $return = ""; //var det det du mente?
        while (!feof($fp)) $return .= fgets($fp, 128);
        fclose($fp);
        return $return;
    }
    return false;
}

$aQ = array( // Variabel/værdi-par
    "varA" => "noget første",
    "varB" => "noget andet",
    "varC" => "noget tredie"
);
$foo = myPost("http://localhost/tests/post2.php", $aQ);

if ($foo) print $foo;
else print "The shit hit the fan :o|";
?>

post.php udskriver:
HTTP/1.1 200 OK Date: Sun, 05 Feb 2006 11:02:52 GMT Server: Apache/1.3.33 (Win32) PHP/4.3.10 X-Powered-By: PHP/4.3.10 Connection: close Content-Type: text/html noget første

post2.php udskriver:
Notice: Undefined index: varA in c:\programmer\easyphp1-8\www\tests\post2.php on line 8
Avatar billede olebole Juniormester
05. februar 2006 - 12:12 #12
Ja, det var det, jeg mente - og det fjernede vist også den første fejl, du beskrev i (31/01-2006 16:06:22)  =)

"post2.php udskriver:
Notice: Undefined index: varA in c:\programmer\easyphp1-8\www\tests\post2.php on line 8"

- Ja, naturligvis ... alt virker præcis, som det skal. Når du kalder 'post2.php' direkte i en browser, poster du jo ikke noget mod dokumentet - og der _skal_ jo smides en fejl, når du forsøger at udskrive en variabel, der ikke eksisterer  ;o)
Avatar billede Bjarne Novice
05. februar 2006 - 13:23 #13
forstår stadig ikke helt hvordan jeg får værdierne fra arrayet ud igen i post2.php vha. $_POST['varA|varB|varC']?
Avatar billede olebole Juniormester
05. februar 2006 - 13:32 #14
- jamen, det er da helt elementært PHP. Du behandler dem præcist, somom de var ankommet fra en form  :)
Avatar billede Bjarne Novice
05. februar 2006 - 17:21 #15
kan ikke få det til at funke :|

Hvis jeg laver et link i post.php til post2.php. Henter post.php og klikker på linket -  så virker det ikke. Hvis jeg bruger header("location: post2.php") virker det heller ikke.

elementært eller ej - jeg kan bare ikke få det til at virke...
Avatar billede olebole Juniormester
05. februar 2006 - 17:36 #16
Det forstår jeg ikke. Hvad vil du med et link til 'post2.php'? Det skal du da ikke bruge til noget.
Avatar billede Bjarne Novice
05. februar 2006 - 19:43 #17
Jeg ved ikke hvordan jeg kommer fra post.php til post2.php - scriptet videre sender ikke automatisk til post2.php :(
Avatar billede olebole Juniormester
05. februar 2006 - 19:51 #18
I det øjeblik post.php loades i en browser, sender den de tre variabler til post2.php
Avatar billede Bjarne Novice
05. februar 2006 - 23:39 #19
så er spørgsmålet hvordan jeg kommet til at bruge de variabler :)

Når jeg kører post.php bliver de sendt, men hvordan kommer jeg over i post2.php for at bruge variablerne?
Avatar billede olebole Juniormester
06. februar 2006 - 00:42 #20
Du kalder (evt. inkluderer i en anden fil) post.php. Fra den sender du en variabel 'id' - og en variabel 'msg'.

I post2.php indsætter du de to variabler i en DB på denne måde:

<?
$id = $_POST["id"];
$message = $_POST["msg"];
// Udfør evt. check af variablerne her

$sql = "INSERT INTO `tabel` SET `id`='".$id."', `message`='".$message."'";
mysql_query($sql);
?>
Avatar billede Bjarne Novice
12. februar 2006 - 16:56 #21
Har ikke kunne få det til at virke... Det melder fejl, når jeg prøver at bruge variablerne :|
Hvis du gerne vil have point for den tid du har brugt, så sig til:)
Avatar billede olebole Juniormester
12. februar 2006 - 17:08 #22
Så må du stadig lave en eller anden fejl. Det er helt ligetil at få det til at virke ... selvom jeg godt ved, du ikke kan bruge den viden til ret meget  :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester