2011-03-21 13 views
18

Si estoy emitiendo un HTTP DELETE, ¿cómo puedo acceder al cuerpo/variable de PHP? Sé que si está emitiendo POST, puede acceder a él a través del $_POST['varname'], pero ¿cómo puede acceder a él si se trata de un DELETE no POST? Digamos que el nombre var aquí es ID.obtener una variable de eliminación PHP

+0

Es un duplicado de http: // stackoverflow. com/questions/1405505/accessing-delete-from-jquery-in-php, pero no sé si las respuestas lo ayudan. –

+0

Revisado, no me ayuda – aherlambang

+0

Puede obtener la variable en '$ _GET'. Si el método no es 'GET' y' POST' la solicitud se enviará como método 'GET' –

Respuesta

12

Puede que tenga que leer los datos directamente desde la secuencia php://input.

I knwo esta es la forma en que tiene que hacerlo para PUT solicitudes y algunos rápidos de google indican que el método también funciona para DELETE.

Ver here y here para ejemplos. El comentario here dice que este método también funciona para DELETE.

Aquí es un ejemplo de código interesante que ayudará (de sfWebRequest.class.php del framework Symfony 1.4.9 alterado ligeramente por razones de brevedad):

public function initialize(...) 
{ 
    ... code ... 

    $request_vars = array(); 
    if (isset($_SERVER['REQUEST_METHOD'])) 
    { 
    switch ($_SERVER['REQUEST_METHOD']) 
    { 
     case 'PUT': 
     if ('application/x-www-form-urlencoded' === $this->getContentType()) 
     { 
      parse_str($this->getContent(), $request_vars); 
     } 
     break; 

     case 'DELETE': 
     if ('application/x-www-form-urlencoded' === $this->getContentType()) 
     { 
      parse_str($this->getContent(), $request_vars); 
     } 
     break; 
    } 
    ... more code ... 
} 

public function getContent() 
{ 
    if (null === $this->content) 
    { 
    if (0 === strlen(trim($this->content = file_get_contents('php://input')))) 
    { 
     $this->content = false; 
    } 
    } 

    return $this->content; 
} 

este ejemplo de código pone los parámetros de la petición o DELETEPUT en la matriz $request_vars. Una limitación parece ser que el formulario (si está utilizando otro encabezado de tipo de contenido) debe ser 'application/x-www-form-urlencoded', algo que Google lo confirma rápidamente.

+0

¿Y entonces, después de hacer esto, puedo acceder a él a través de $ request_vars ['id']? – aherlambang

+0

Sí, esencialmente. No podrá usar el código tal como es porque es parte de una clase grande, pero es la plantilla que busca. – xzyfer

4

file_get_contents('php://input') siempre te dará el cuerpo de la petición completa. Tenga en cuenta que puede ser legible solo una vez. La pregunta más importante es si una solicitud DELETE puede contener un cuerpo, que parece ser algo así como unanswered question, pero funcionará probablemente.

Yo diría que enviar el ID en el cuerpo es algo RESTless sin embargo. La entidad en cuestión debe ser referida por la URL como example.com/foo/42, por lo que una solicitud DELETE debe decir DELETE /foo/42, no DELETE /foo con la identificación en el cuerpo de la solicitud.

+0

¿cómo obtengo el nombre de la variable específica? ¿Tengo que string analizarlo? – aherlambang

+2

@Equ [Sí] (http://php.net/parse_str). – deceze

1

Según lo expresado por las personas de arriba, PHP hace no tiene una variable global para acceder rápidamente a los datos en una solicitud DELETE. Por qué, no sé; probablemente no ha sido tan usado como GET y POST históricamente.

Debería verificar el tipo de solicitud usando $_SERVER['REQUEST_METHOD'] y luego recuperar todo el cuerpo utilizando la corriente php://input y extraer sus datos de eso. Puede crear una función que haga esto en cada solicitud y guardarla en una variable global llamada $_DELETE si desea mantener un aspecto similar a su código (suponiendo que usa $_POST y $_GET). Incluso puedes parchar tu PHP para hacer esto y compilar tu propia versión de PHP, pero eso por supuesto confundiría a las personas que intentan ejecutar tu código en otra instalación de PHP :)

Cuestiones relacionadas