Frage von Holistiker, 58

HTML Button durch PHP ersetzen?

Hallo Zusammen,

folgendes Problem. Um einen HTTP Post an einen Printserver zu Senden (Base64 String muss übergeben werden) wird mir lt. anleitung gesagt es soll folgendes HTML Element erzeugt werden.

<form method="post" action="http://localhost:8080">
<input type="hidden" name="label" value="<?php echo $base64Label; ?>" />
<input type="submit" value="Print" />
</form>

Klappt auch... Wenn ich auf den Button Print drücke wird der Base64 String an den Printserver geschickt und ausgedruckt.

Die Frage ist nun wie bekommen ich es hin, dass ich nicht extra auf den Printbutton drücken muss sondern meinetwegen direkt in PHP eine Funktion aufrufe, die dasselbe macht wie das Drücken auf den "Print" button.

Vielen Dank!!

Antwort
von mastema666, 20

Das kannst du via "cURL" machen, damit kann man auch in PHP direkt z.B: POST Daten abschicken. Siehe z.B. https://goo.gl/cwrvBo

Dabei solltest du nur darauf achten, dass entweder der Printserver auf dem selben Rechner läuft, auf dem auch das PHP Script ausgeführt wird (denn wenn du via HTML-Formular an "localhost" schickst wird das an den localhost von deinem Rechner aus gesehen geschickt, wenn du das intern mit cURL verschickst, würde das an den Server selbst geschickt, auf dem es ausgeführt wird), oder du müsstest die (externe) IP des Printservers explizit angeben statt des "localhost".


// Edit: Sehe grad in einem Kommentar von dir, dass du wohl auch noch einen speziellen Content-Type angeben musst, das geht über cURL aber auch: http://php.net/manual/de/function.curl-setopt.php

Antwort
von Balco, 34

Schau dir mal folgendes Beispiel an, so kannst du POST-Requests mit PHP versenden:



// url
$url = 'http://localhost:8080';
// variablen
$myvars = 'label=' . $base64Label;
// curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// response
$response = curl_exec($ch);



Quelle: http://stackoverflow.com/questions/3080146/post-data-to-a-url-in-php

Kommentar von poldiac ,

Mit Curl gehts wohl auch, das stimmt wohl. Jetzt muss er sich nur noch aussuchen womit er es macht :).

Kommentar von Holistiker ,

Danke erstmal für die Antworten.Die Frage ist nur wiie Sende ich denn nun den Befehl "Print"? Leider passiert nämlich einfach garnichts wenn ich den obrigen Code ausführe. Danke!


In der Anleitung steht nämlich:




To send labels to the RocketShipIt Print Server simply do a application/x-www-form-urlencoded HTTP post to the print server url (default is http://localhost:8080).

The easiest way to do this which also works from over the internet is to create a PHP page on your webserver and output a form on a page like this:

<form method="post" action="http://localhost:8080">
<input type="hidden" name="label" value="<?php echo $base64Label; ?>" />
<input type="submit" value="Print" />
</form>

Then navigate to this page from the computer hooked up to the printer with the RocketShipIt Print Server running and click the Print button. Since the computer you are currently on is hooked up to the printer and is localhost it will print.




Kommentar von Balco ,

Dann musst du den Header noch anpassen, damit tatsächlich ein application/x-www-form-urlencoded Request gesendet wird.

Kommentar von Balco ,

Dazu passt du den Header so an:

curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
Kommentar von Holistiker ,

Irgendwie bin ich zu doof :(

Habe jetzt folgenden Code:

// url

$url = 'http://localhost:8080';
// variablen
$myvars = 'label=' . $basecode;

// curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// response
$response = curl_exec($ch);

var_dump($response)

aber irgendwie bekomme ich trotdem nur ein False zurück und ein Label wird auch nicht gedruckt :(. Ich würde mir sowas ja auch eigentlich selber beibringen aber ich brauch sowas nur einmal jetzt für Automatisierten Versandetiketten druck. Der Printserver wird übrigens auf einem Terminalserver ausgefürt so dass jeder user über localhost:8080 auf die Configseite des Druckers kommt.

Kommentar von RakonDark ,

nimm noch ein Feld mit 'Print' dazu  , ohne feldnamen , wie im button beispiel .

vielelicht brauch tdas der drucker weil es noch andere befehle gibt

Kommentar von Balco ,

@RakonDark: Der submit-Button hat gar kein Attribut name, wird somit auch nicht mitgeschickt. Das sollte nicht das Problem sein.

@Holistiker: Wenn mein Beispiel nicht funktioniert, kannst du auch das folgende mal versuchen:

$url = 'http://localhost:8080';
$data = ['label' => $basecode];

// use key 'http' even if you send the request to https://...
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { // Handle error }

var_dump($result);

Quelle: http://stackoverflow.com/questions/5647461/how-do-i-send-a-post-request-with-php

Antwort
von Hasenfrau0, 32

Du kannst dies einer POST-Variable übergeben, hier mehr Infos:

http://php.net/manual/de/reserved.variables.post.php


An sich brauchst du aber immer ein Formular oder eine URL, um Daten zu bekommen und zu übertragen. Sie müssen von PHP erst einmal "empfangen" werden.


Oder du arbeitest mit SESSIONS.


Kommentar von poldiac ,

Mal davon abgesehen, dass man die Funktion nicht mehr verwenden sollte, verwechselst Du da gerade was.

Ihm geht es ja erstmal darum etwas abzusenden :).

Antwort
von poldiac, 21

Schau Dir das oberste Beispiel von vor 4 Jahren an:

http://php.net/manual/de/function.file-get-contents.php

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten