Jump to content

Recommended Posts

Posted

Bonjour à tous,
Je vais vous partagez un bout de code (que vous pouvez transformer en fonction) assez utile pour faire des requêtes POST (non pas avec du html) tout en PHP <3

à quoi ça sert?
quand vous désirez faire un système distant un peu sécurisé ou quand quelqu'un vous ennuie et qu'il n'a pas d'anti-robot sur sa page d'inscription...
 

/*
	Contexte: ayant bricolé un serveur apache et installé PHP avec beaucoup de mal vous n'arrivez pas à installer un serveur SMTP (gestion d'envoie et de réception d'email).
	Alors pour pallier à ce problème vous utilisez un script distant sur un ftp ayant un serveur smtp vous devez effectuer une requête POST avec des variable: l'espéditeur, le destinataire, le sujet ($sujet), le contenu ($content) et une clé de sécurité. le serveur répond "OK" si l'envoie c'est fait, on récupère la réponse dans la variable $result
*/
	$data = array(
		'exp' => "[email protected]",		// expéditeur
		'dest' => "[email protected]",	// destinataire
		'subject' => $sujet,			// sujet
		'content' => $content,			// contenu du mail
		'key' => 0258410025412002541200255210	// clé de sécurité
	);
	$url = "http://mars073.be/smtp.phps";		// url sur la quelle il faut envoyer la requête
	$data_url = http_build_query($data);
	$data_len = strlen($data_url);
	$x = array ('content'=>file_get_contents ($url, false, stream_context_create (array ('http'=>array ('method'=>'POST',
					'header'=>"Connection: close\r\nContent-Type: application/x-www-form-urlencoded\r\n".
									"Content-Length: $data_len\r\n",
		'content'=>$data_url)))),
	'headers'=>$http_response_header
	);
	$result = $x['content'];


	if ($result == "OK") {
		echo "L'envoie a été un succés.";
	} else {
		echo "t'as foiré #YOLO.";
	}

Bonne programmation à tous!
Cordialement,
Mars073

  • Upvote 1
  • 10 months later...
Posted

Pour complèter le topic, je vous propose une méthode alternative : CURL

 

Avantages : 

beaucoup plus rapide surtout pour les gros fichiers

plus d'options : possibilité de faire des requètes en https signées par certificat.

 

Inconvéniant :

la librairie php5_curl doit être dispo sur votre serveur.

 

Je vous partage un exemple : 

<?php

class Post_curl
{
	/* Attributs
	 * ******************************************************************************************** */

	private $url = NULL;
	private $data = NULL;

	/* Constructeurs et assesseurs
	 * ******************************************************************************************** */

	/**
	 * Constructeur
	 * @param string $url
	 * @param array $data
	 */
	public function __construct($url = FALSE, $data = FALSE)
	{
		if ($url)
		{
			$this->setUrl($url);
		}
		if ($data)
		{
			$this->setData($data);
		}
	}

	/**
	 * Set Url
	 * @param string $url 
	 */
	public function setUrl($url)
	{
		$this->url = trim($url);
	}

	/**
	 * Set data
	 * @param array $data 
	 */
	public function setData($data)
	{
		if (is_object($data))
		{
			$this->data = get_object_vars($data);
		}
		else
		{
			$this->data = $data;
		}
		$this->data = $this->encodeData($this->data);
	}

	/* Methodes publiques
	 * ******************************************************************************************** */

	/**
	 * Envoi de la requete
	 * @return mixed : Resultats de la requete
	 */
	public function send()
	{
		$return = FALSE;
		if (is_null($this->url))
		{
			throw new Exception("URI not found");
		}
		else if (is_null($this->data))
		{
			throw new Exception("Data not found");
		}
		else
		{
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $this->url);
			curl_setopt($ch, CURLOPT_POST, $this->rcount($this->data));
			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($this->data));
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
			$return = curl_exec($ch);
		}
		return ($return) ? $return : curl_error($ch);
	}

	/* Methodes privees
	 * ******************************************************************************************** */

	/**
	 * Fonction d'encodage des caracteres
	 * @param array $data
	 * @return array 
	 */
	private function encodeData($array)
	{
		foreach ($array as &$value)
		{
			if (is_array($value))
				$this->encodeData($value);
			else if (!mb_detect_encoding($value, 'UTF-8', true))
				$value = utf8_encode($value);
		}
		return $array;
	}

	/**
	 * Nombre d'elements d'un tableau recursivement
	 * @param array $array
	 * @return int
	 */
	private function rcount($array)
	{
		$count = 0;
		if (is_array($array))
		{
			foreach ($array as $value)
			{
				if (!is_array($value))
				{
					$count++;
				}
				else
				{
					$count = ($count + $this->rcount($value));
				}
			}
		}
		return $count;
	}

}

/* End of file Post_curl.class.php */
  • Upvote 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...