84 votes

La manipulation d'ajouter/SUPPRIMER des arguments en PHP

Je suis en train de travailler sur mon RESTE de la bibliothèque du client pour CodeIgniter et j'ai du mal à trouver comment envoyer des PUT et DELETE arguments en PHP.

Dans quelques endroits que j'ai vu des gens en utilisant les options:

$this->option(CURLOPT_PUT, TRUE);
$this->option(CURLOPT_POSTFIELDS, $params);

Fâcheusement, ce qui semble ne rien faire. Est-ce la bonne façon de définir de METTRE les paramètres?

Si oui, comment dois-je SUPPRIMER les paramètres?

*$this->option() est une partie de ma bibliothèque, c'est tout simplement construit un tableau de CURLOPT_XX constantes et les envoie à curl_setopt_array() lorsque la demande cURL est exécutée.*

Je suis tenter de lire les METTRE et de SUPPRIMER des paramètres en utilisant le code suivant:

        case 'put':
            // Set up out PUT variables
            parse_str(file_get_contents('php://input'), $this->_put_args);
        break;

        case 'delete':
            // Set up out PUT variables
            parse_str(file_get_contents('php://input'), $this->_delete_args);
        break;

Il y a deux options ici, je me rapproche de ce dans le mauvais sens ou il y a un bug quelque part dans mes bibliothèques. Si vous pouviez laissez-moi savoir si cela devrait fonctionner en théorie je peux juste continuer à insister sur debug jusqu'à ce que je le résoudre.

Je ne veux pas perdre plus de temps sur une approche qui est fondamentalement faux.

68voto

Phil Sturgeon Points 19227

Au lieu d'utiliser CURLOPT_PUT = TRUE utilisation CURLOPT_CUSTOMREQUEST = 'PUT' et CURLOPT_CUSTOMREQUEST = 'DELETE' alors juste valeurs CURLOPT_POSTFIELDS.

48voto

Bryan Drewery Points 1278

Voici un code qui peut être utile pour les autres qui veulent METTRE la poignée et SUPPRIMER params. Vous êtes en mesure de fixer $_PUT et $_DELETE par $GLOBALS[], mais ils ne seront pas directement accessibles dans les fonctions, sauf si déclaré global ou via $GLOBALS[]. Pour contourner ce problème, j'ai fait une classe simple pour la lecture GET/POST/PUT/DELETE demande arguments. Ceci est également remplit $_REQUEST avec PUT/DELETE params.

Cette classe va analyser le PUT/DELETE params et de soutien GET/POST.

class Params {
  private $params = Array();

  public function __construct() {
    $this->_parseParams();
  }

  /**
    * @brief Lookup request params
    * @param string $name Name of the argument to lookup
    * @param mixed $default Default value to return if argument is missing
    * @returns The value from the GET/POST/PUT/DELETE value, or $default if not set
    */
  public function get($name, $default = null) {
    if (isset($this->params[$name])) {
      return $this->params[$name];
    } else {
      return $default;
    }
  }

  private function _parseParams() {
    $method = $_SERVER['REQUEST_METHOD'];
    if ($method == "PUT" || $method == "DELETE") {
        parse_str(file_get_contents('php://input'), $this->params);
        $GLOBALS["_{$method}"] = $this->params;
        // Add these request vars into _REQUEST, mimicing default behavior, PUT/DELETE will override existing COOKIE/GET vars
        $_REQUEST = $this->params + $_REQUEST;
    } else if ($method == "GET") {
        $this->params = $_GET;
    } else if ($method == "POST") {
        $this->params = $_POST;
    }
  }
}

16voto

Owen Points 36009

Rappelez-vous, la plupart des serveurs ne sont pas à METTRE la poignée ET de SUPPRIMER des demandes. Puisque vous faites une bibliothèque, je vous suggère de penser à la comptabilité pour cela. Généralement, il existe deux conventions que vous pouvez utiliser pour imiter les METTRE ET de SUPPRIMER par la POSTE.

  1. l'utilisation d'un POSTE de douane variable (ex. _METHOD=A) qui remplace les POST
  2. définir un en-tête HTTP personnalisé (ex. X-HTTP-Method-Remplacement: METTRE)

En règle générale, la plupart des services RESTful qui ne permettent pas de METTRE ET de SUPPRIMER directement en charge au moins l'une de ces stratégies. Vous pouvez utiliser cURL pour définir un en-tête personnalisé si vous avez besoin via l' CURLOPT_HTTPHEADER option.

// ex...
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT') );

3voto

Adam Hopkinson Points 16747

Je pense que vous êtes en mélangeant vos verbes MIS, c'est pour mettre un fichier, la POSTE est pour l'affichage des variables (bien que vous pouvez POSTER un fichier).

Pour définir les variables post, utilisez CURLOPT_POSTFIELDS avec une chaîne de param1=val1&param2=val2 ou un tableau associatif.

Une SUPPRESSION, vous aurez envie d'utiliser le curl option CURLOPT_CUSTOMREQUEST

1voto

okobsamoht Points 1

C'est ainsi que je suis seule mon problème de SUPPRESSION:

==>> dans REST_Controller.php - je remplacer la delault _parse_delete() de la fonction par :

protected function _parse_delete()
{
    $this->_delete_args = $_DELETE;
    $this->request->format and $this->request->body = file_get_contents('php://input');
    // Set up out DELETE variables (which shouldn't really exist, but sssh!)
    parse_str(file_get_contents('php://input'), $this->_delete_args);
}

;) ça marche pour moi!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X