PHP + curl, HTTP POST sample code?

    |
  • Added:
  • |
  • In: Basic PHP

Can anyone show me how to do a php curl with an HTTP POST?

I want to send data like this:

username=user1, password=passuser1, gender=1 

To www.domain.com

I expect the curl to return a response like result=OK. Are there any examples?

This Question Has 9 Answeres | Orginal Question | mysqllearner

Here are some boilerplate code for PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php

include in these library will simplify development

<?php # Initialization include("LIB_http.php"); include("LIB_parse.php"); $product_array=array(); $product_count=0; # Download the target (store) web page $target = "http://www.tellmewhenitchanges.com/buyair"; $web_page = http_get($target, ""); ... ?> 

A simpler answer IF you are passing information to your own website is to use a SESSION variable. Begin php page with:

session_start(); 

If at some point there is information you want to generate in PHP and pass to the next page in the session, instead of using a POST variable, assign it to a SESSION variable. Example:

$_SESSION['message']='www.'.$_GET['school'].'.edu was not found. Please try again.' 

Then on the next page you simply reference this SESSION variable. NOTE: after you use it, be sure you destroy it, so it doesn't persist after it is used:

if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);} 

It's can be easily reached with:

<?php $post = [ 'username' => 'user1', 'password' => 'passuser1', 'gender' => 1, ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); $response = curl_exec($ch); var_export($response); 
curlPost('google.com', [ 'username' => 'admin', 'password' => '12345', ]); function curlPost($url, $data) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); curl_close($ch); return $response; } 
<?php // // A very simple PHP example that sends a HTTP POST to a remote site // $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "postvar1=value1&postvar2=value2&postvar3=value3"); // in real life you should use something like: // curl_setopt($ch, CURLOPT_POSTFIELDS, // http_build_query(array('postvar1' => 'value1'))); // receive server response ... curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $server_output = curl_exec ($ch); curl_close ($ch); // further processing .... if ($server_output == "OK") { ... } else { ... } ?> 

Because this thread is high in Google's results for sending post with curl in php, I would like to provide most valid answer as all others above and below do unnecessary work, while the answer is pretty straightforward:

Procedural

// set post fields $post = [ 'username' => 'user1', 'password' => 'passuser1', 'gender' => 1, ]; $ch = curl_init('http://www.domain.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // execute! $response = curl_exec($ch); // close the connection, release resources used curl_close($ch); // do anything you want with your response var_dump($response); 

Object oriented

<?php namespace MyApp\Http; class Curl { /** @var resource cURL handle */ private $ch; /** @var mixed The response */ private $response = false; /** * @param string $url * @param array $options */ public function __construct($url, array $options = array()) { $this->ch = curl_init($url); foreach ($options as $key => $val) { curl_setopt($this->ch, $key, $val); } curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); } /** * Get the response * @return string * @throws \RuntimeException On cURL error */ public function getResponse() { if ($this->response) { return $this->response; } $response = curl_exec($this->ch); $error = curl_error($this->ch); $errno = curl_errno($this->ch); if (is_resource($this->ch)) { curl_close($this->ch); } if (0 !== $errno) { throw new \RuntimeException($error, $errno); } return $this->response = $response; } /** * Let echo out the response * @return string */ public function __toString() { return $this->getResponse(); } } // usage $curl = new \MyApp\Http\Curl('http://www.domain.com', array( CURLOPT_POSTFIELDS => array('username' => 'user1') )); try { echo $curl; } catch (\RuntimeException $ex) { die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode())); } 

Side note here: it would be best to create some kind of interface called AdapterInterface for example with getResponse() method and let the class above implement it. Then you can always swap this implementation with another adapter of your like, without any side effects to your application.

Using HTTPS / encrypting traffic

Usually there's a problem with cURL in PHP under the Windows operating system. While trying to connect to a https protected endpoint, you will get an error telling you that certificate verify failed.

What most people do here is to tell the cURL library to simply ignore certificate errors and continue (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). As this will make your code work, you introduce huge security hole and enable malicious users to perform various attacks on your app like Man In The Middle attack or such.

Never, ever do that. Instead, you simply need to modify your php.ini and tell PHP where your CA Certificate file is to let it verify certificates correctly:

; modify the absolute path to the cacert.pem file curl.cainfo=c:\php\cacert.pem 

The latest cacert.pem can be downloaded from the Internet or extracted from your favorite browser. When changing any php.ini related settings remember to restart your webserver.

A live example of using php curl_exec to do an HTTP post:

Put this in a file called foobar.php:

<?php $ch = curl_init(); $skipper = "luxury assault recreational vehicle"; $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash'); $postvars = ''; foreach($fields as $key=>$value) { $postvars .= $key . "=" . $value . "&"; } $url = "http://www.google.com"; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST, 1); //0 for a get request curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3); curl_setopt($ch,CURLOPT_TIMEOUT, 20); $response = curl_exec($ch); print "curl response is:" . $response; curl_close ($ch); ?> 

Then run it with the command php foobar.php, it dumps this kind of output to screen:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Title</title> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Expires" content="0"> <body> A mountain of content... </body> </html> 

So you did a PHP POST to www.google.com and sent it some data.

Had the server been programmed to read in the post variables, it could decide to do something different based upon that.

If the form is using redirects, authentication, cookies, SSL (https), or anything else other than a totally open script expecting POST variables, you are going to start nashing your teeth really quick. Take a look at Snoopy, which does exactly what you have in mind while removing the need to set up a lot of the overhead.

Curl Post + Error Handling + Set Headers [thanks to @mantas-d]:

function curlPost($url, $data=NULL, $headers = NULL) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if(!empty($data)){ curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } $response = curl_exec($ch); if (curl_error($ch)) { trigger_error('Curl Error:' . curl_error($ch)); } curl_close($ch); return $response; } curlPost('google.com', [ 'username' => 'admin', 'password' => '12345', ]); 

Search
I am...

Sajjad Hossain

I have five years of experience in web development sector. I love to do amazing projects and share my knowledge with all.

Connect Social With PHPAns
Top