Comunidad de diseño web y desarrollo en internet online

Problemas consulta con 3 variables

Citar            
MensajeEscrito el 17 Abr 2013 03:40 pm
Hola a tod@s
estoy creando un portal inmobiliario a fuerza de equivocarme mucho, leer muchos foros y siendo paciente, puesto que no llevo mucho tiempo en el mundo del diseño y creación de sitios web. Pero ya no puedo más .....
El problema es el siguiente:
He creado un un formulario con las siguientes variables:

provinciaList;
localidadList;
tipoinmueblef;
habitacionesf;

dichas variables la envío mediante POST a consulta.php. La consulta la hago sobre una BD llamada unicajainmuebles que yo he creado y tengo todos los privilegios sobre ella. El código de consulta.php es el siguiente:

<?PHP



// Obtener valores introducidos en el formulario


$provinciaList = $_POST['provinciaList'];
$localidadList = $_POST['localidadList'];
$tipoinmueblef = $_POST['tipoinmueblef'];
$habitacionesf = $_POST['habitacionesf'];


$error = false;


// Conectar con la Base de Datos
$conexion = mysql_connect ("localhost", "consulta", "consulta")
or die ("No se puede conectar con el servidor");
mysql_select_db ("oteator")
or die ("No se puede seleccionar la base de datos");

// Corrige problemas con tildes
mysql_query("SET NAMES 'utf8'");


// Enviar consulta

$instruccion = "Select * FROM unicajainmuebles WHERE (provincia = '$provinciaList') AND (localidad = '$localidadList')";

$consulta = mysql_query ($instruccion, $conexion)
or die ("Fallo en la consulta");

// Mostrar resultados de la consulta
$nfilas = mysql_num_rows ($consulta);
if ($nfilas > 0)
{
print ("<TABLE align='center' border='2' weight='200'>\n");
print ("<TR>\n");
print ("<TH>Provincia</TH>\n");
print ("<TH>Localidad</TH>\n");

print ("<TH>Habitaciones</TH>\n");


print ("</TR>\n");

for ($i=0; $i<$nfilas; $i++)
{
$resultado = mysql_fetch_array ($consulta);
print ("<TR>\n");
print ("<TD>" . $resultado['provincia'] . "</TD>\n");
print ("<TD>" . $resultado['localidad'] . "</TD>\n");

print ("<TD>" . $resultado['habitaciones'] . "</TD>\n");


print ("</TR>\n");
}

print ("</TABLE>\n");
}
else
print ("No hay inmuebles disponibles en $localidadList/$provinciaList este momento con estas características,</br>");

print ("</br>");

// Cerrar conexión
mysql_close ($conexion);

?>

Hasta hay bien, el problema viene cuando introduzco un tercer elemento en la consulta:

$instruccion = "Select * FROM unicajainmuebles WHERE (provincia = '$provinciaList') AND (localidad = '$localidadList') AND (tipoInmueble = '$tipoinmueblef'";

Si existe un inmueble que contenga todas las características (misma provincia, localidad y tipo de inmueble) perfecto. El problema viene cuando por ejemplo no existe ningún inmueble dentro de la localidad que el usuario a indicado mediante el formulario, entonces aparecen todos los resultados de la BD y no todos los resultados en la provincia como a mi me gustaría.
La idea es que muestre resultados tanto si el usuario ha indicado provincia, localidad, tipo de inmueble y habitaciones, o en su defecto que muestre todos los resultados que coincidan con provincia y localidad si el usuario no ha indicado tipo de inmueble y habitaciones como "indiferente" o sea valor nulo.

No se si me he explicado bien, espero que sí. He probado ya por activa y por pasiva y nada.... Espero me podáis ayudar.
Un saludo a tod@s y gracias de antemano

Por franwebs

2 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 17 Abr 2013 06:09 pm
Pues ve armando la cláusula WHERE de la consulta SQL de acuerdo a si el valor de las variables implicadas tienen sentido o no:

Código PHP :

$provinciaList = trim(@$_POST['provinciaList']);
$localidadList = trim(@$_POST['localidadList']);
$tipoinmueblef = trim(@$_POST['tipoinmueblef']);
$habitacionesf = trim(@$_POST['habitacionesf']);
 


$instruccion = "Select * FROM unicajainmuebles";

$where = array();

if (!empty($provinciaList)) {
   $where[] = "(`provincia` = '".mysql_real_escape_string($provinciaList)."')"; // Siempre es bueno limpiar las variables de entrada
}

if (!empty($localidadList)) {
   $where[] = "(`localidad` = '".mysql_real_escape_string($localidadList)."')";
}

if (!empty($tipoInmueble)) {
   $where[] = "(`tipoInmueble` = '".mysql_real_escape_string($tipoinmueblef)."')";
}

if (!empty($habitacionesf)) {
   $where[] = "(`habitaciones` = '".mysql_real_escape_string($habitacionesf)."')";
}

if (count($where) > 0) { // Si hay cláusulas WHERE...
   $instruccion = $instruccion." WHERE ".implode(" AND ",$where);
}

$instruccion = $instruccion." ORDER BY `provincia`"; // Solo para que la salida sea más natural...

$consulta = mysql_query ($instruccion, $conexion);


Como consejo, deberías dejar de usar las funciones mysql_ y usar las mysqli_ porque las primeras no estarán disponibles en la próxima versión de PHP.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 Abr 2013 06:53 pm
GRACIAS DriverOp!!!!

Esto tiene más sentido que lo que yo estaba haciendo...jijijij
Voy a probarlo ahora mismo!!
Luego cuento como me ha ido, y gracias de nuevo sobretodo por contestar tan rápido

Por franwebs

2 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 17 Abr 2013 07:11 pm
Listo, muchísimas gracias.
Te debo una caja de aspirinas que me he ahorrado :lol:

Por franwebs

2 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 26 Abr 2013 03:46 pm
Hola de nuevo.
Después de conseguir solventar los problemas con la consulta, ahora llevo dos semanas atascado con la paginación. No se que ocurre, la consulta la hace correctamente, gracias a la ayuda de DriverOp, y consigo hacer la paginación de los inmuebles encontrados con las características recogidas a través del formulario. El problema viene cuando pulso siguiente, entonces me carga todos los inmuebles que hay en la bd.
Este es el script:


//---------------------------------------------------------------------------------------------------------------------------------

<?php


?>
<link href="css/paginacion.css" type="text/css" rel="stylesheet">
<?php
require('conexion.php');

//AL PRINCIPIO COMPRUEBO SI HICIERON CLICK EN ALGUNA PÁGINA
if(isset($_GET['page']))
{
$page= $_GET['page'];
}
else
{
//SI NO DIGO Q ES LA PRIMERA PÁGINA
$page=1;
}

// Obtener valores introducidos en el formulario
$provinciaList = trim(@$_GET['provinciaList']);
$localidadList = trim(@$_GET['localidadList']);
$tipoinmueblef = trim(@$_GET['tipoinmueblef']);
$habitacionesf = trim(@$_GET['habitacionesf']);


$consulta = "Select * FROM unicajainmuebles";

$where = array();

if (!empty($provinciaList)) {
$where[] = "(`provincia` = '".mysql_real_escape_string($provinciaList)."')"; // Siempre es bueno limpiar las variables de entrada
}

if (!empty($localidadList)) {
$where[] = "(`localidad` = '".mysql_real_escape_string($localidadList)."')";
}

if (!empty($tipoInmueble)) {
$where[] = "(`tipoInmueble` = '".mysql_real_escape_string($tipoinmueblef)."')";
}

if (!empty($habitacionesf)) {
$where[] = "(`habitaciones` = '".mysql_real_escape_string($habitacionesf)."')";
}

if (count($where) > 0) { // Si hay cláusulas WHERE...
$consulta = $consulta." WHERE ".implode(" AND ",$where);
}

$consulta = $consulta." ORDER BY `provincia`"; // Solo para que la salida sea más natural...


$datos=mysql_query($consulta,$conn);

//MIRO CUANTOS DATOS FUERON DEVUELTOS
$num_rows=mysql_num_rows($datos);

//ACA SE DECIDE CUANTOS RESULTADOS MOSTRAR POR PÁGINA , EN EL EJEMPLO PONGO 15
$rows_per_page= 15;

//CALCULO LA ULTIMA PÁGINA
$lastpage= ceil($num_rows / $rows_per_page);

//COMPRUEBO QUE EL VALOR DE LA PÁGINA SEA CORRECTO Y SI ES LA ULTIMA PÁGINA
$page=(int)$page;

if($page > $lastpage)
{
$page= $lastpage;
}

if($page < 1)
{
$page=1;
}

//CREO LA SENTENCIA LIMIT PARA AÑADIR A LA CONSULTA QUE DEFINITIVA
$limit= 'LIMIT '. ($page -1) * $rows_per_page . ',' .$rows_per_page;

//REALIZO LA CONSULTA QUE VA A MOSTRAR LOS DATOS (ES LA ANTERIO + EL $limit)
$consulta .=" $limit";
$busqueda=mysql_query($consulta,$conn);

if(!$busqueda)
{
//SI FALLA LA CONSULTA MUESTRO ERROR
die('Invalid query: ' . mysql_error());
}
else
{
//SI ES CORRECTA MUESTRO LOS DATOS
?> <table>
<thead>
<tr><th>Provincia</th><th>Localidad</th><th>Tipo Inmueble</th><th>Habitaciones</th></tr>
</thead>
<tbody>
<?php while($row = mysql_fetch_assoc($busqueda))
{ ?>

<tr><td><?php echo $row['provincia']; ?> </td><td> <?php echo $row['localidad']; ?> </td><td> <?php echo $row['tipoInmueble']; ?> </td><td> <?php echo $row['habitaciones']; ?> </td></tr>
<?php } ?>
</tbody>
</table>
<?php
//UNA VEZ Q MUESTRO LOS DATOS TENGO Q MOSTRAR EL BLOQUE DE PAGINACIÓN SIEMPRE Y CUANDO HAYA MÁS DE UNA PÁGINA





if($num_rows != 0)
{
$nextpage= $page +1;
$prevpage= $page -1;

?><ul id="pagination-digg"><?php
//SI ES LA PRIMERA PÁGINA DESHABILITO EL BOTON DE PREVIOUS, MUESTRO EL 1 COMO ACTIVO Y MUESTRO EL RESTO DE PÁGINAS
if ($page == 1)
{
?>
<li class="previous-off">&laquo; Previous</li>
<li class="active">1</li>
<?php
for($i= $page+1; $i<= $lastpage ; $i++)
{?>
<li><a href="busquedas.php?page=<?php echo $i;?>"><?php echo $i;?></a></li>
<?php }

//Y SI LA ULTIMA PÁGINA ES MAYOR QUE LA ACTUAL MUESTRO EL BOTON NEXT O LO DESHABILITO
if($lastpage >$page )
{?>
<li class="next"><a href="busquedas.php?page=<?php echo $nextpage;?>" >Next &raquo;</a></li><?php
}
else
{?>
<li class="next-off">Next &raquo;</li>
<?php
}
}
else
{

//EN CAMBIO SI NO ESTAMOS EN LA PÁGINA UNO HABILITO EL BOTON DE PREVIUS Y MUESTRO LAS DEMÁS
?>
<li class="previous"><a href="busquedas.php?page=<?php echo $prevpage;?>">&laquo; Previous</a></li><?php
for($i= 1; $i<= $lastpage ; $i++)
{
//COMPRUEBO SI ES LA PÁGINA ACTIVA O NO
if($page == $i)
{
?> <li class="active"><?php echo $i;?></li><?php
}
else
{
?> <li><a href="busquedas.php?page=<?php echo $i;?>" ><?php echo $i;?></a></li><?php
}
}
//Y SI NO ES LA ÚLTIMA PÁGINA ACTIVO EL BOTON NEXT
if($lastpage >$page )
{ ?>
<li class="next"><a href="busquedas.php?page=<?php echo $nextpage;?>">Next &raquo;</a></li><?php
}
else
{
?> <li class="next-off">Next &raquo;</li><?php
}
}
?></ul></div><?php
}
}

?>



//-------------------------------------------------------------------------------------------------------------------------------------

Creo que el problema esta en la segunda consulta, aunque ya he hecho muchas pruebas y nada.
Espero pueda ayudarme alguien.
Gracias de antemano

Por franwebs

2 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 26 Abr 2013 04:24 pm
No sé dónde está el problema que tienes porque no puedo probar el código (no tengo la tabla que estás usando), pero sí puedo decirte que hay cosas que puedes mejorar.

Por ejemplo, para calcular cuántas páginas hay en el listado estás lanzando la consulta completa para medir los registros con mysql_num_rows(). Eso no es eficiente. Lo que deberías hacer es:

Código MySQL :

SELECT COUNT(*) AS `cuenta` FROM `unicajainmuebles` WHERE ... <condiciones where>

Sin agregar ORDER ni LIMIT esto te devolverá un solo registro con un solo campo llamado "cuenta" de tipo INT con el número de registros que generaría la consulta.

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.