¿Cómo pasar parámetros de POST en una URL?


Básicamente, creo que no puedo, pero estaría muy feliz de que se demuestre lo contrario.

Estoy generando un menú HTML dinámicamente en PHP, agregando un elemento para cada usuario actual, de modo que obtengo algo como <a href="process_user.php?user=<user>>, pero tengo una preferencia por POST sobre GET.

¿Hay alguna manera de pasar la información como un parámetro POST, en lugar de OBTENER desde un enlace HREF clicable?


Actualización: lo siento, no se me permite usar JS - Debería haber dicho, mi mal


Actualizar a la actualización: parece que @Rob está en algo con " Podrías usar un botón en lugar de un ancla y simplemente darle estilo al botón para que parezca un enlace. De esa manera usted podría tener sus valores en los campos ocultos dentro del mismo formulario para ser enviado a través de POST "

Author: Mawg, 2011-06-02

7 answers

Puede usar un formulario con estilo como enlace, sin necesidad de JavaScript:

<form action="/do/stuff.php" method="post">
    <input type="hidden" name="user_id" value="123" />
    <button>Go to user 123</button>
</form>

CSS:

button {
    border: 0;
    padding: 0;
    display: inline;
    background: none;
    text-decoration: underline;
    color: blue;
}
button:hover {
    cursor: pointer;
}

Véase: http://jsfiddle.net/SkQRN /

 37
Author: Petah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 04:18:38

Los parámetros en la URL son parámetros GET, un cuerpo de solicitud, si está presente, son datos POST. Así que su premisa básica es por definición no alcanzable.

Debe elegir si desea utilizar POST o GET basado en la acción. Cualquier acción destructiva, es decir, algo que cambia permanentemente el estado del servidor (eliminar, agregar, editar) siempre debe ser invocado por POST requests. Cualquier " recuperación de información "pura debe ser accesible a través de una URL inmutable (es decir, GET peticiones).

Para hacer una solicitud POST, necesita crear un <form>. podría usar Javascript para crear una solicitud POST en su lugar, pero no recomendaría usar Javascript para algo tan básico. Si desea que su botón de envío se vea como un enlace, le sugiero que cree un formulario normal con un botón de envío normal, luego use CSS para rediseñar el botón y / o use Javascript para reemplazar el botón con un enlace que envíe el formulario usando Javascript (dependiendo de lo que reproduzca el comportamiento deseado, mejor). Ese sería un buen ejemplo de mejora progresiva .

 12
Author: deceze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-02 05:56:29

Puede hacer que el enlace realice una solicitud ajax post cuando se hace clic.

En jQuery:

$('a').click(function(e) {
   var $this = $(this);
   e.preventDefault();
   $.post('url', {'user': 'something', 'foo': 'bar'}, function() {
       window.location = $this.attr('href');
   });
});

También puede hacer que el enlace envíe un formulario de PUBLICACIÓN con javascript

<form action="url" method="post">
   <input type="hidden" name="user" value="soemthing" />
   <a href="#">CLick</a>
</form>
<script>
$('a').click(function(e) {
   e.preventDefault();
   $(this).parents('form').submit();
});
</script>
 11
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-02 05:50:47

Me gustaría compartir mi implementación también. Sin embargo, requiere algo de javascript.

<form action="./index.php" id="homePage" method="post" style="display: none;">
<input type="hidden" name="action" value="homePage" />
</form>
<a href="javascript:;" onclick="javascript:
document.getElementById('homePage').submit()">Home</a>

Lo bueno de esto, es que al contrario de GET requests, no muestra los parámetros en la URL, lo cual es más seguro.

 7
Author: Aris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-05 07:14:47

No, no puedes hacer eso. Te invito a leer una definición de POST: http://en.wikipedia.org/wiki/POST_%28HTTP%29

O esta página: http://en.wikipedia.org/wiki/GET_%28HTTP%29#Request_methods

 5
Author: zzarbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-02 05:48:54

En primer lugar, un descargo de responsabilidad: No creo que casar la PUBLICACIÓN con parámetros de URL sea una idea brillante. Como otros sugirieron, es mejor usar un formulario oculto para pasar información del usuario.

Sin embargo, una pregunta me hizo curioso cómo PHP está manejando este caso. Resultó que es posible en teoría. He aquí una prueba:

Post_url_params.html

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <form method="post" action="post_url_params.php?key1=value1">
            <input type="hidden" name="key2" value="value2">
            <input type="hidden" name="key3" value="value3">
            <input type="submit" value="click me">
        </form>
    </body>
</html>

Post_url_params.php

<?php
    print_r($_POST);
    print_r($_GET);
    echo $_SERVER['REQUEST_METHOD'];
?>

Salida

Array ( [key2] => value2 [key3] => value3 ) 
Array ( [key1] => value1 ) 
POST

Uno puede vea claramente que PHP almacena parámetros de URL en la variable $_GET y datos de formulario en la variable $_POST. Sospecho que es muy PHP y específico del servidor, sin embargo, y definitivamente no es una cosa en la que confiar.

 4
Author: raiks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-25 12:23:50

Esto podría funcionar si el script php genera un formulario para cada entrada con campos ocultos y el href usa javascript para publicar el formulario.

 2
Author: tofutim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-02 05:51:50