1 votos

Como hacer una consulta con muchas variables?

Estoy creado una consulta que obtiene las variables de un formulario GET, lo que pasa es que son demasiadas variables lo que estoy haciendo es lo siguiente:

if (isset($_GET['id_distrit'])||isset($_GET['id_operation'])||isset($_GET['id_property_type'])||isset($_GET['price_min'])){
if (isset($_GET['id_distrit'])&&isset($_GET['id_operation'])&&isset($_GET['id_property_type'])&&isset($_GET['price_min'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_distrit=%s AND id_operation=%s AND id_property_type=%s AND price>%s", $_GET['id_distrit'],$_GET['id_operation'],$_GET['id_property_type'],$_GET['price_min']);
}else
if (isset($_GET['id_distrit'])&&isset($_GET['id_operation'])&&isset($_GET['id_property_type'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_distrit=%s AND id_operation=%s AND id_property_type=%s", $_GET['id_distrit'],$_GET['id_operation'],$_GET['id_property_type']);
}else
if (isset($_GET['id_distrit'])&&isset($_GET['id_operation'])&&isset($_GET['price_min'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_distrit=%s AND id_operation=%s AND price>%s", $_GET['id_distrit'],$_GET['id_operation'],$_GET['price_min']);
}else
if (isset($_GET['id_distrit'])&&isset($_GET['id_operation'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_distrit=%s AND id_operation=%s", $_GET['id_distrit'],$_GET['id_operation']);
}else
if (isset($_GET['id_distrit'])&&isset($_GET['id_property_type'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_distrit = %s AND id_property_type=%s",$_GET['id_distrit'],$_GET['id_property_type']);
}
if (isset($_GET['id_distrit'])&&isset($_GET['price_min'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_distrit = %s AND price>%s",$_GET['id_distrit'],$_GET['price_min']);
}else
if (isset($_GET['id_distrit'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_distrit = %s", $_GET['id_distrit']);
}else
if (isset($_GET['id_operation'])&&isset($_GET['id_property_type'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_operation = %s AND id_property_type=%s",$_GET['id_operation'],$_GET['id_property_type']);
}else
if (isset($_GET['id_operation'])){
    $query_GetProperties = sprintf("SELECT * FROM g_propertys WHERE id_operation = %s", $_GET['id_operation']);
}}

Pero creo que no es la forma obtima de hacer una consulta, de que otra forma podría hacerla?

2voto

Gilbert Puntos 20

Ese código parece un laberinto xD

Te recomiendo que cada GET lo guardes en una variable, así se te hace más legible a la hora de buscar un error y te ahorras escribir tanto.

1voto

aEscarcha Puntos 220

Una forma mejor de hacerlo sería ir creando las condiciones así:

$conditions = 'WHERE 1 = 1 ';
if (isset($_GET['id_operation'])){
    $conditions .= sprintf("AND id_operation = %s", $_GET['id_operation']);
}
if (isset($_GET['id_distrit'])){
    $conditions .= sprintf("AND id_distrit = %s", $_GET['id_distrit']);
}
if (isset($_GET['id_property_type'])){
    $conditions .= sprintf("AND id_distrit = %s", $_GET['id_property_type']);
}
if (isset($_GET['price_min'])){
    $conditions .= sprintf("AND price > %s", $_GET['price_min']);
}
$query = "SELECT * FROM g_propertys " . $conditions;

También podrías montar un bucle que analizara el $_GET, y fuera haciendo lo mismo que estos IFs.

Por cierto, NO TE RECOMIENDO que crees una query así, porque vas a ser vulnerable a inyección SQL, tienes varias opciones, limpiar las variables, con métodos como strip_tags, add_slashes etc y lo que te recomiendo que es que te pases a MYSQLi, que es la extensión de MySQL para PHP mejorada.

1 votos

**Muchísimas gracias**, solo hay que cambiar ese "AND" por "&&" ya que cuando se junta con el %s o otra letra se malogra la consulta.

0voto

ArtEze Puntos 285

Hay que crear un array como este.

var A=["id_distrit","id_operation","id_property_type","price_min"]

Simular el OR (al menos un verdadero)

var booleano=false
for(var i=0;i<A.length;i++)
{
    if( isset($_GET[ A[ i ] ) ){booleano=true}
}
if(booleano){/*Los otros if*/}

Simular el AND (ningún falso)

var booleano=true
for(var i=0;i<A.length;i++)
{
    if( ! isset( $_GET[A[ i ] ) ){booleano=false}
}
if(booleano){/*Los otros if*/}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: