¿Que valor le da id a un $_GET?

publicado por: Anonymous

Tengo el siguiente código donde obtengo datos de la Urls

if (isset($_GET['id'])){
    $url = $_GET['id'];
}

Compruebo el valor que me esta dando la variable $url como resultado:

libro-php/

Actualmente se obtiene el dato de tal manera porque tengo el archivo .htaccess en Urls amigable.

Los datos son correctos a la hora de realizar la consulta:

$stmtID = $con->prepare("SELECT idlibro,libro,titulo,precio FROM biblioteca WHERE url=?");

Ahora mi pregunta:

¿Que valor le da el id al $_GET?

Si cambio de esta manera el código no funciona todas las variables del archivo pierde su validación por el motivo que ya no recibe el resultado idóneo a la consulta.

if (isset($_GET['url'])){
    $url = $_GET['url'];
}

¿Qué tiene que ver el id en $_GET?

No tengo ningún producto o dato en la base de datos que tenga una columna id todos los IDS están definidas así id_producto, id_usuario etc.

¿Por qué al darle otro nombre no funciona igual?

Actualización

Archivo .htaccess

#Regla Url amigable
RewriteRule ^([a-zA-Z0-9-/]+)$ detalle.php?id=$1

solución

Como dice el Manual de PHP:

$_GET es un array asociativo de variables pasado al script actual
vía parámetros URL.

Por ejemplo en una URL como esta:

http://www.dominio.com/archivo.php?id=1&nombre=Pedro

El valor de $_GET será un array así:

array('id'=>1, 'nombre'=>'Pedro');

Si tú quieres obtener los valores de GET:

$_GET["id"]; //obtienes 1
$_GET["nombre"]; //obtienes Pedro

Para resolver tu problema

Viendo que tu URL se construye así:

#Regla Url amigable
RewriteRule ^([a-zA-Z0-9-/]+)$ detalle.php?id=$1

Bastaría con cambiar en la regla el valor id por url

#Regla Url amigable
RewriteRule ^([a-zA-Z0-9-/]+)$ detalle.php?url=$1

Si por el contrario, el valor url fuese tomado de otro elemento, o si equivaliese a algún archivo a través del cual construyes URL amigables, entonces tendrías que modificar el nombre del elemento (por ejemplo un elemento HTML) o el nombre del archivo si fuese un archivo.


Otras cosas sobre GET

Supongo que vas a usar GET o POST más de una vez, por eso me permito dejar algunas indicaciones…

Cuando envías formularios HTML, GET asociará los valores usando como clave el valor de la etiqueta name de los elementos.

Ejemplo:

<form>
  <input type="number" name="id" />
  <input type="text" name="nombre" />
</form>

Si tú quieres igualar las claves que obtendrás vía GET con los nombres de las columnas de tu base de datos, sólo tienes que cambiar el valor de la etiqueta name si usas un formulario HTML, o los valores de la URL.

Ejemplo:

Formulario HTML

<form action="archivo.php" method="GET">
  <input type="number" name="id_producto" placeholder="Introduzca id_producto"/>
  <input type="number" name="id_usuario"  placeholder="Introduzca id_usuario"/>
  <input type="text"   name="url"         placeholder="Introduzca url"/>
</form>

Cuando envías este formulario, lo que se produce en realidad es una URL como esta:

http://www.dominio.com/archivo.php?id_usuario=1&id_producto=24890&url=example.com/registrar

Entonces, con GET obtenemos un array con tres claves y sus tres valores respectivos, cada par (clave->valor) es separado por & en la URL:

  • id_usuario => 1
  • id_producto => 24890
  • url => example.com/registrar

archivo.php o archivo que recibe los datos del formulario anterior

En el archivo PHP recuperarías cada valor así:

$_GET["id_producto"];
$_GET["id_usuario"];
$_GET["url"];

Notas del Manual de PHP y de la experiencia

Algunas indicaciones con respecto al uso de GET (las cuales son válidos también para POST):

  • Cuando los valores vienen de un documento HTML, GET recoge los valores usando la etiqueta name de los elementos HTML, no la etiqueta id.
  • Se suele usar isset para verificar que el valor buscado existe en la URL (si existe entre los datos posteados). Por ejemplo, para saber si id_usuario fue posteado:

    if(isset($_GET['id_usuario'])) {
         //existe
    }else{
         //no existe
    }
    

    Esta comparación se puede refinar, buscando no sólo si existe, sino si además no está en blanco.

  • Esta es una ‘superglobal’ o una variable automatic global. Significa simplemente que es una variable que está disponible en cualquier parte del script. No hace falta hacer global $variable; para acceder a la misma desde funciones o métodos.

  • Las variables GET son pasadas vía urldecode().

  • $_POST funciona de la misma manera y en algunas ocasiones es recomendable con respecto a GET, pero eso sería otra cuestión.

  • Nunca envíes de manera directa valores recuperados con GET o con POST ni ningún otro valor proveniente desde el exterior a consultas de la base de datos. Hacer eso haría el código vulnerable a la Inyección SQL, a través de la cual, usuarios mal intencionados podrían tomar el control no sólo de la base de datos, sino de todo tu sistema. Esos valores deben enviarse mediante consultas preparadas. Aquí en SO hay varias preguntas que tratan este tema.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *