Me gustaría mandar una variable en PHP usando post sin formulario

Estoy creando una página web html php javascript y estoy mostrando un listado de artículos con un botón cada uno, el cual llevará a una web específica sobre el articulo pinchado. Para ello, necesitaría pasar algún dato de el al pulsar ese botón, como idarticulo . El problema es que no consigo mandar una variable de un php a otro sin tener un formulario, es decir, quiero que al pulsar ese botón, se mande el id de ese articulo pulsado.

Estoy usando control de sesiones en PHP, por si hay alguna solución con ella.

2 respuestas

Respuesta
1

Me parece que lo más fácil es utilizar AJAX con javascript, podrías enviar un JSON únicamente con el id que deseas.

Si requieres un poco más de ayuda, creo que sería conveniente que compartieras parte de tu código, en especial en la parte donde intentas hacer el POST.

<?php
$sql2= mysqli_query($conn, $sql);
if (mysqli_num_rows( $sql2) > 0 ) {
// output data of each row
    while($row = mysqli_fetch_assoc($sql2)) {
        $row1 = mysqli_fetch_assoc($sql2);
        echo "
  <section class='section-margin'>
    <div class='container'>
      <div class='row'>
        <div class='col-lg-6 col-xl-5 align-self-center mb-5 mb-lg-0'>
          <div class='search-content'>
            <div class='col-lg-6 pl-xl-5'>
              <ul class='clockdiv text-center' id='clockdiv'>
                <li class='clockdiv-single clockdiv-day'>
                <span class='smalltext'>Habitaciones</span>
                  <h1 class='days'>".$row1['Nhabitaciones']."</h1>
                </li>
                <li class='clockdiv-single clockdiv-hour'>
                <span class='smalltext'>Baños</span>
                  <h1 class='hours'>".$row1['Nbanos']."</h1>
                </li>
                <li class='clockdiv-single clockdiv-minute'>
                 <span class='smalltext'>Mensualidad</span>
                  <h1 class='minutes'>".$row1['Precio']."</h1>
                </li>
                <li class='clockdiv-single clockdiv-minute'>
                 <span class='smalltext'>Descripción</span>
                  <h5 class='minutes'>".$row1['Descripcion']."</h5>
                </li>
              </ul>
              <div    class='clockdiv-content text-center'>
                <input class='button border-0 mt-3' type='submit' name='submit' value='Reservar'  >
              </div>
            </div>
          </div>
        </div>
        <div class='col-lg-6 col-xl-6 offset-xl-1'>
          <div class='search-wrapper'>
            <div class='mySlides'>
              <div class='numbertext'>1 / 6</div>
              <img src='../img/home/clientes.png' style='width:100%'>
            </div>
          </div>
        </div>
      </div>
    </div>
  </section>";
    }}
  ?>

Justo aquí:

<input class='button border-0 mt-3' type='submit' name='submit' value='Reservar'  >

Al pulsar este botón me gustaría mandar la variable $row1['idInmuebles'] a inmueble.php

Para empezar podrías agregar la biblioteca de jQuery para facilitar las cosas, así que al principio y fuera de tu bucle agrega:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

En el botón quita el type="submit" y agrega el atributo onclick con el dato que requieres enviar y de preferencia cambia tu input a un anchore:

"<a class='button border-0 mt-3' onclick='postId(".$row1['idInmuebles'] .")' value='Reservar'  >Reservar</a>"

Al final de tu bucle agrega una función javascript para enviar el dato:

<script type="text/javascript">
    function postId(id){
        $.ajax({
            url: 'tu_url',
            type: 'POST',
            data: {"idInmuebles":id},
            datatype: 'json',
            success: function (data) { alert("success"); },
            error: function (jqXHR, textStatus, errorThrown) { alert("error"); }
        });
    }
</script>

Me parece que eso sería todo.

¿Y la lectura en el otro PHP seria simplemente $_POST["id"]?

Por cierto, me gustaría que al pulsar el botón, además de pasar la variable, se dirija a inmueble.php , ¿como añado esa función en el jquery?

Tu otro PHP iniciaría con:

$postdata = file_get_contents('php://input');
$request = json_decode($postdata);

Para acceder al id sería:

$Request->idInmuebles

Y para redirigir a otra página sería en el success de la llamada ajax:

success: function (data) { location.href='inmueble.php'; }

Me salta un error en inmueble.php, donde quiero recibir el archivo.

<?php
session_start();
$postdata = file_get_contents('php://input');
$request = json_decode($postdata);
$id= $Request->idInmuebles;
echo $id;
?>

trying to get property of non-object en la linea 7 que se corresponde con :

$id= $request->idInmuebles;

La forma correcta es la que pusiste al final:

$id= $request->idInmuebles;

es con minúscula $request, si te fijas en tu php está con mayúscula, por eso te marca error de que no existe el objeto.

Creo que cuando te puse el ejemplo el auto corrector me lo cambió a mayúscula y no me di cuenta.

El problema sigue saliendo. Me indica:

trying to get property of non-object 

Pese a cambiar a minúscula.

¿Cómo quedó la función de javascript? Tal vez se esté mandando con nombre diferente.

Otra cosa que puedes hacer es ver el valor de $request.

Manda su valor a pantalla con echo o var_dump o si tienes logs con error_log para ver su contenido y saber por qué te marca ese error.

Hasta ahora queda así todo:

Este es el botón para enviar:

<a class='button border-0 mt-3' onclick='postId(".$row1['idInmuebles'] .")' value='Reservar'  >Reservar</a>

Esta es la función js:

function postId(id){
    $.ajax({
        url: 'inmueble.php',
        type: 'POST',
        data: {'idInmuebles':id},
        datatype: 'json',
        success: function (data) { alert('success'); location.href='inmueble.php'; },
        error: function (jqXHR, textStatus, errorThrown) { alert('error'); }
    });
}

la cual envia la variable a inmueble.php.

Y en inmueble queda así:

$postdata = file_get_contents('php://input');
$request = json_decode($postdata);
$id= $request->idInmuebles;
echo $id;

Cambia la función de javascript a esto:

function postId(id){
    var inmueble = {'idInmuebles':id};
    $.ajax({
        url: 'inmueble.php',
        type: 'POST',
        data: JSON.stringify(inmueble),
        datatype: 'json',
        success: function (data) { alert('success'); location.href='inmueble.php'; },
        error: function (jqXHR, textStatus, errorThrown) { alert('error'); }
    });
}

Así ya debería de funcionar.

sigue apareciendo este error:

trying to get property 'idInmuebles' of non-object

Relacionado a esta línea

$id= $request->idInmuebles;

Obtén el valor de $postdata y de $request con var_dump para ver su contenido y muestra el resultado.

$postdata = file_get_contents('php://input');
var_dump($postdata);
$request = json_decode($postdata);
var_dump($request);
$id= $request->idInmuebles;
echo $id;

string(0) "" NULL

Este es en resultado imprimido.

Ya genere archivos exactamente igual a lo que aquí esta y en mi caso si responde todo bien, por lo que no se si tenga algo que ver con la versión de su PHP o tu sistema o alguna configuración interna que tengas.

¿Tienes la forma de poner tus archivos en algún servidor público para poder acceder a ellos y revisar cuál es el problema? O podrías poner todos tus archivos completos para poder revisarlos y hacer pruebas en mi computadora.

Respuesta
1

Para hacer eso que dices necesitas hacer una llamada tipo Ajax.

Si entiendo bien tu escenario igualmente creo que te convendría enviar el parámetro vía GET y así usar simples links.

Algo así en el botón:

$('#boton').click(function() {
   var productId = LO QUE SE NECESITE PARA OBTENERLO
   window.location.href = "detalle.php?id_producto=" + productId;
});

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas