Hola:
Os expongo mi caso:
Tengo en una base de datos una serie de casas, uno de los campos son dormitorios, el cual tiene asignado un valor (4 por ejemplo)
Luego quiero hacer una busqueda, pero el formulario deberia mostar una opcion que fuera entre 3-5 habitaciones.
Mi primera duda es como plantear el select a la holar de asignar el valor, y luego la segunda es plantear la busqueda.
Muchas gracias de antemano
Hola, la consulta debería ser: SELECT * FROM tabla WHERE dormitorios BETWEEN 3 AND 5. En cuanto a la búsqueda, tendrías que ser más específico, o sea, te refieres a la búsqueda dentro de la base de datos, el campo de búsqueda como un input (el que llama al archivo que procesa los datos), etc..
La consulta funciona bien si es que la columna dormitorios es de tipo INT (INTEGER), pero si es VARCHAR, entonces tienes que envolver los valores con comillas simples: BETWEEN '3' AND '5'.
Saludos.
Ya, así debería funcionar:
<form method="post" action="busqueda.php"><!-- El atributo name en los formularios ya no es necesario -->
<table width="600" border="1">
<tr>
<td colspan="2">BUSCAR</td>
</tr>
<tr>
<td>DORMITORIOS</td>
<td>
<select name="dormitorios">
<option value="<= 2">≤ 2</option>
<option value="3 AND 5">3-5</option>
<option value="6 AND 8">6-8</option>
<option value="9 AND 11">9-11</option>
<option value="> 11">> 11</option>
</select>
</td>
</tr>
<tr>
<td>ASEOS</td>
<td>
<select name="aseos">
<option value="<= 2">≤ 2</option>
<option value="3 AND 5">3-5</option>
<option value="6 AND 8">6-8</option>
<option value="9 AND 11">9-11</option>
<option value="> 11">> 11</option>
</select>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="SEARCH" /></td><!-- El atributo name del botón que envía los formularios tampoco es necesario, pues, generalmente, no nos sirve de nada el contenido de este botón -->
</tr>
</table>
</form>
El archivo de búsqueda quedaría así:
<?php
session_start();
include('config.php');
// dormitorios y aseos siempre tendrán un valor, pues en el form siempre valen, al menos "< 2"
// por ende, esta comprobación es inútil:
if( isset( $_POST['dormitorios'] ) || isset( $_POST['aseos'] ) ) {
$a = $_POST['dormitorios'];
$b = $_POST['aseos'];
}
$resultado = mysql_select_db($db, $conexion);
if ( !$resultado ) {
echo "ERROR: Imposible seleccionar la base de datos $basedatos.<br>\n";
mysql_close( $conexion );
exit;
}
else {
$sql = "SELECT * FROM recetas WHERE ";
if( !empty( $a ) ) {
$sql .= "dormitorios ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $a ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $a";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$a";
}
}
if( !empty( $b ) ) {
$sql .= " AND aseos ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $b ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $b";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$b";
}
}
$sql .= " ORDER BY id";
$res = mysql_query( $sql, $conexion );
if( !$res ) {
echo "<p>ERROR: " . mysql_error( $conexion ) . "</p>";
}
else {
echo"<table align='center' border=2 cellpadding=10 bordercolor=gold>";
echo"<tr>
<td>
<h3>REF</h3>
</td>
<td>
<h3>DORMITORIOS</h3>
</td>
<td>
<h3>ASEOS</h3>
</td>
<td></td><!-- ¿Y esta columna por qué? -->";
while( $fila = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {
echo "
<h3>
<tr>
<td>
<h4>$fila[id]</h4>
</td>
<td>
<h4>$fila[ref]</h4>
</td>
<td>
<h4>$fila[dormitorios]</h4>
</td>
<td>
<h4>$fila[aseos]</h4>
</td>
</tr>
</h3>";
}
echo "</table>";
}
mysql_close( $conexion );
}
?>
Yo lo probé y debería funcionar, pero es mejor que hagas las pruebas necesarias tú también :D.
Saludos.
Genial, muchas gracias...
Solo un pero:
Necesita de las dos condiciones para buscar... pongo el nuevo codigo y me explico:
<form method="post" action="busqueda.php"><!-- El atributo name en los formularios ya no es necesario -->
<table width="600" border="1">
<tr>
<td colspan="2">BUSCAR</td>
</tr>
<tr>
<td>DORMITORIOS</td>
<td>
<select name="habitaciones">
<option value=""></option>
<option value="<= 2">≤ 2</option>
<option value="3 AND 5">3-5</option>
<option value="6 AND 8">6-8</option>
<option value="9 AND 11">9-11</option>
<option value="> 11">> 11</option>
</select>
</td>
</tr>
<tr>
<td>ASEOS</td>
<td>
<select name="aseos">
<option value=""></option>
<option value="<= 2">≤ 2</option>
<option value="3 AND 5">3-5</option>
<option value="6 AND 8">6-8</option>
<option value="9 AND 11">9-11</option>
<option value="> 11">> 11</option>
</select>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="SEARCH" /></td><!-- El atributo name del botón que envía los formularios tampoco es necesario, pues, generalmente, no nos sirve de nada el contenido de este botón -->
</tr>
</table>
</form>
He hecho una modificacion, puedo buscar sin restrinciones, que todos las valores sean validos...
pero da este error:
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY id' at line 1
la idea es que puedas escoger hacer una, dos o ningu criterio de busqueda
Ok, en ese caso, el archivo que procesa los datos queda así:
<?php
session_start();
include('config.php');
// dormitorios y aseos siempre tendrán un valor, pues en el form siempre valen, al menos "< 2"
// por ende, esta comprobación es inútil:
if( isset( $_POST['dormitorios'] ) || isset( $_POST['aseos'] ) ) {
$a = $_POST['dormitorios'];
$b = $_POST['aseos'];
}
$resultado = mysql_select_db($db, $conexion);
if ( !$resultado ) {
echo "ERROR: Imposible seleccionar la base de datos $basedatos.<br>\n";
mysql_close( $conexion );
exit;
}
else {
$sql = "SELECT * FROM recetas";
if( !empty( $a ) && !empty( $b ) ) {
$sql .= " WHERE dormitorios ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $b ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $a";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$a";
}
$sql .= " AND aseos ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $b ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $b";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$b";
}
}
else if( !empty( $a ) && empty( $b ) ) {
$sql .= " WHERE dormitorios ";
if( preg_match( , $a ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $a";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$a";
}
}
else if( empty( $a ) && !empty( $b ) ) {
$sql .= " WHERE aseos ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $b ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $b";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$b";
}
}
$sql .= " ORDER BY id";
$res = mysql_query( $sql, $conexion );
if( !$res ) {
echo "<p>ERROR: " . mysql_error( $conexion ) . "</p>";
}
else {
echo"<table align='center' border=2 cellpadding=10 bordercolor=gold>";
echo"<tr>
<td>
<h3>REF</h3>
</td>
<td>
<h3>DORMITORIOS</h3>
</td>
<td>
<h3>ASEOS</h3>
</td>
<td></td><!-- ¿Y esta columna por qué? -->";
while( $fila = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {
echo "
<h3>
<tr>
<td>
<h4>$fila[id]</h4>
</td>
<td>
<h4>$fila[ref]</h4>
</td>
<td>
<h4>$fila[dormitorios]</h4>
</td>
<td>
<h4>$fila[aseos]</h4>
</td>
</tr>
</h3>";
}
echo "</table>";
}
mysql_close( $conexion );
}
?>
Escribe lo siguiente antes de extraer los datos: echo '<p>' . $sql . '</p>'; Esto esta para saber como queda la consulta y poder corregir los errores.
Hola:
Me da el siguiente error:
Parse error: syntax error, unexpected ',', expecting ')' in /var/www/vhosts/inmobiliariasaroesma.com/httpdocs/busqueda.php on line 40
Esta es la linea 40
if( preg_match( , $a ) ) { // Si coincide con 'NUMERO AND NUMERO'
Gracias
Jajajaj, lo que pasa es que por algún motivo borré la expresión regular en esa línea:
<?php
session_start();
include('config.php');
// dormitorios y aseos siempre tendrán un valor, pues en el form siempre valen, al menos "< 2"
// por ende, esta comprobación es inútil:
if( isset( $_POST['dormitorios'] ) || isset( $_POST['aseos'] ) ) {
$a = $_POST['dormitorios'];
$b = $_POST['aseos'];
}
$resultado = mysql_select_db($db, $conexion);
if ( !$resultado ) {
echo "ERROR: Imposible seleccionar la base de datos $basedatos.<br>\n";
mysql_close( $conexion );
exit;
}
else {
$sql = "SELECT * FROM recetas";
if( !empty( $a ) && !empty( $b ) ) {
$sql .= " WHERE dormitorios ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $b ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $a";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$a";
}
$sql .= " AND aseos ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $b ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $b";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$b";
}
}
else if( !empty( $a ) && empty( $b ) ) {
$sql .= " WHERE dormitorios ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $a ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $a";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$a";
}
}
else if( empty( $a ) && !empty( $b ) ) {
$sql .= " WHERE aseos ";
if( preg_match( '/^\d\s(\w)+\s\d$/i', $b ) ) { // Si coincide con 'NUMERO AND NUMERO'
$sql .= "BETWEEN $b";
}
else { // De lo contrario, el valor es <= 2 o >11
$sql .= "$b";
}
}
$sql .= " ORDER BY id";
echo '<p>Sentencia SQL: ' . $sql . '</p>'; // Esta línea es innecesaria una vez que el código funcione.
$res = mysql_query( $sql, $conexion );
if( !$res ) {
echo "<p>ERROR: " . mysql_error( $conexion ) . "</p>";
}
else {
echo"<table align='center' border=2 cellpadding=10 bordercolor=gold>";
echo"<tr>
<td>
<h3>REF</h3>
</td>
<td>
<h3>DORMITORIOS</h3>
</td>
<td>
<h3>ASEOS</h3>
</td>
<td></td><!-- ¿Y esta columna por qué? -->";
while( $fila = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {
echo "
<h3>
<tr>
<td>
<h4>$fila[id]</h4>
</td>
<td>
<h4>$fila[ref]</h4>
</td>
<td>
<h4>$fila[dormitorios]</h4>
</td>
<td>
<h4>$fila[aseos]</h4>
</td>
</tr>
</h3>";
}
echo "</table>";
}
mysql_close( $conexion );
}
?>
Publica el resultado donde diga
Sentencia SQL: .
Saludos.
Muchas Gracias, funciona perfectamente¡¡¡
Pero se confirma que soy muy torpe...
Tengo algunas consulta mas, espero no robarte mucho tiempo:
He tratado de sumarle un par de busquedas mas, pero no tengo muy claro como hacerlo, es mas ha sido un fracoso total¡¡¡
Una de las consultas no seria de between, sino com un = ; una seria precio y la otra area, esta ultima seria la de igual.
Ahora seria unos detalles para que sea la busqueda "perfecta":
Se le puede poner un echo que muestre un Mensaja del tipo:" Lo sentimos, no hay ninguna coincidencia"
Y en otro formulario tengo una serie de cosas que me gustaria traer aqui, pero mas de lo mismo no se "encajalas"
En este codigo se usa una paginacion, vamos que muestre un numero de resultados y el resto lo organice por paginas, un "redimensinador" de Imagenes y un "contador de caracteres para uno de los campos
<?php
//para acortar texto noticias
function cortarAdelante( $cadena, $cuantos, $ponerPuntos=0, $sacarTags=0, $puntos1 = '...' ){
$puntos = '';
if( $ponerPuntos == 1 ){
if( strlen( $cadena ) >= $cuantos) {
$puntos = $puntos1;
}
}
if( $sacarTags==1 ){
$cadeba = sacarTags( $cadena );
}
$cadena .= ' ';
$cadena = substr( $cadena, 0, $cuantos + 1 );
$cadena = substr( $cadena, 0, strrpos( $cadena,' ') );
return $cadena.$puntos;
}
#funciones adicionales que usara
function sacarTags( $str ){
if( trim( $str )!='' ){
$str = ereg_replace( "<([^>]+)>", "", $str );
return $str;
}else{
return $str;
}
}
function sacarHref( $str ){
if( trim( $str ) != '' ){
$str = eregi_replace( "<a([^>]+)>|</a>", "", $str );
return $str;
}else{
return $str;
}
}
//mostramos todos nuestros
//artículos, viendo si han
//sido agregados o no a nuestro
//carro de compra
//y hacemos la consulta
$SrcImg = ''; //agregue esta variable que es donde asignaremos la ruta de la imagen =D
$ScaleImg = ''; //esta variable obtendra el nuevo ancho y alto de tu imagen...
$registros = 1;
if(!$_GET['pagina']){
$inicio = 0;
$_GET['pagina'] = 1;
}else{
$inicio = ($_GET['pagina'] - 1) * $registros;
}
// Esta funcion es la que se encarga de redimensionar la imagen, solo recibe 5 parametros, en este caso
//el ancho y alto de la imagen original, el ancho y alto del contenedor y un boleano para darle una segund pasada =D
function imageResize($width, $height, $_MaxWidth, $_MaxHeight, $OtherPass) {
if ($width > $height) {
$percentage = ($_MaxWidth / $width);
} else {
$percentage = ($_MaxHeight / $height);
}
$width = round($width * $percentage);
$height = round(($height * $percentage));
if($width > $_MaxWidth){
$TempWidth = ($width - $_MaxWidth);
$width = ($width - $TempWidth);
$height = ($height - $TempWidth);
}
if($height > $_MaxHeight){
$TempHeight = ($height - $_MaxHeight);
$height = ($height - $TempHeight);
$width = ($width - $TempHeight);
}
if($OtherPass){
imageResize($width, $height, $_MaxWidth, $_MaxHeight, false);
}
return "width=\"$width\" height=\"$height\"";
}
$resultados = mysql_query("SELECT * FROM directorio order by id desc");
$total_registros = mysql_num_rows($resultados);
$resultados = mysql_query("SELECT * FROM directorio order by id desc LIMIT $inicio, $registros");
$total_paginas = ceil($total_registros / $registros);
$qry=$resultados;
while($row=mysql_fetch_assoc($qry)){
$SrcImg = ''.$row['url']; //Aquí asignamos la ruta de la imagen que obtuvimos de la Base de Datos =D
//como esta dentro del while cada vez que se recorra un resultado se le asigna a $SrcImg =P
$ImgSize = getimagesize($SrcImg); /* $ImgSize es la variable que recibirá el alto y el ancho original de la
imagen, como te daras cuenta a la funcion de PHP getimagesize le pasamos como parametro la ruta de la imagen obtenida de la BD.
una vez hecho esto ya podemos usar la funcion que te mostre...
$ImgSize[0] <--- esto representa el ancho de la imagen original
$ImgSize[1] <--- esto representa el alto de la imagen origina */
//$ScaleImg obtiene el nuevo alto y ancho proporcional a 200px
$ScaleImg = imageResize($ImgSize[0], $ImgSize[1], 240, 150, true); /* el 200 es el ancho de tu contenedor, osea tu celda 200px
y el alto es 125, tu imagen se ajustara
proporcionalmente... pruebalo y veras =D */
?>
<table width="550" border="3">
<tr>
<td colspan="2"><h2><?php echo $row['titulo'] ?>
</h2></td>
</tr>
<tr>
<td rowspan="2" width="200px" ><div align="center"><img <?php echo 'src="'.$SrcImg.'" '.$ScaleImg; ?> align="top" ></div></td>
<td>
<div align="center"><?php echo cortarAdelante($row['noticia'], 200, 1, 1) ?></div></td>
</tr>
<tr>
<td><div align="right"><a href="url.php?id=<?php echo $row['id'] ?>" >LEER LA NOTICIA </a></div></td>
</tr>
</table>
<?php }
if($_GET['pagina'] > 1) {
echo "<a href='url.php?pagina=1'><< Primera</a> ";
}
if($_GET['pagina'] > 2) {
echo "<a href='url.php?pagina=".($_GET['pagina']-1)."'>< Anterior</a> ";
}
for($i=($_GET['pagina']-2); $i <= ($_GET['pagina']+2); $i++){
if(($i > 0) && ($i <= $total_paginas)){
if($_GET['pagina'] == $i){
echo "<b>".$i."</b> ";
}else{
echo "<a href='url.php?pagina=$i'>$i</a> ";
}
}
}
if($_GET['pagina'] < ($total_paginas-1)){
echo " <a href='url.php?pagina=".($_GET['pagina']+1)."'>Siguiente ></a>";
}
if($_GET['pagina'] < $total_paginas){
echo " <a href='url.php?pagina=".$total_paginas."'>Última >></a>";
}
?>
Se prodria adaptar?
Oye y gracias, disculpa el atraco
Realmente no he leído todo el código pues tengo que trabajar ahora. Lo que te puedo decir en cuanto al mensaje cuando no hay resultados, claro que se puede. Simplemente debes poner el mensaje en un else cuando ejecutas la consulta:
if( $res ) {
// aquí muestras los resultados
}
else {
// Aquí iría el mensaje si es que no hubieron resultados.
}
Más tarde leo el mensaje completo y veo que puedo hacer (a no ser de que otro usuario te ayude).
Ya revisé el código, pero necesito saber que estructura tiene tu base de datos (lo más simple sería tener la misma estructura que tiene el código).
Hola, ni te imaginas como te eche de menos¡¡¡¡¡
si tiene la misma estructura.
Un saludo
Jejeje, me vas a tener que perdonar, pero tengo algunos problemas que resolver y no me da mucho tiempo de responderte. Intenta implementarlo por tu cuenta mientras (si quieres), sino tendrás que esperar a que me desocupe, lo siento.
Una de las cosas que deberías hacer es agregar un <select name="pagina"><option value="10">10</option><option value="etc.."></option></select> y cambiar donde diga $_GET['pagina'] por $_POST['pagina'].
Saludos.
Gracias por tu tiempo¡¡¡
Yo sigo intentandolo pero sin exito, a ver si te "desocupas" y sacas un hueco.
Un saludo