Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Buscador, si no hay nada entonces es todo

Estas en el tema de Buscador, si no hay nada entonces es todo en el foro de PHP en Foros del Web. Hola amigazos, estoy haciendo un buscador y se me presenta este problema: Código HTML: <form name= "form1" method= "post" action= "" > <table> <tr> <td> ...
  #1 (permalink)  
Antiguo 01/08/2014, 15:43
Avatar de asus090102  
Fecha de Ingreso: mayo-2012
Ubicación: Ensenada- Buenos Aires
Mensajes: 67
Antigüedad: 11 años, 11 meses
Puntos: 1
Buscador, si no hay nada entonces es todo

Hola amigazos, estoy haciendo un buscador y se me presenta este problema:

Código HTML:
<form name="form1" method="post" action="">
<table><tr>
<td><label for="txt1"><b>Interno:</label></td><td>
<input type="text" name="txt1" /></td>
<td><label for="txt2"><b>Desde:</b></label></td><td>
<input type="text" name="txt2" /></td>
<td><label for="txt3"><b>Hasta:</b></label></td><td>
<input type="text" name="txt3" /></td>
<td><input type="submit" name="btn" id="btning" value="CONSULTAR" /></td></tr>
</table>
</form> 
Código PHP:
$interno=$_POST["txt1"];

$desde=$_POST["txt2"];
if (
$desde==""){
$desde="20000101";
}

$hasta=$_POST["txt3"];
if (
$hasta==""){
$hasta=date("Y,m,d");
}

$rst mysql_query("SELECT * FROM tabla1 WHERE interno=" $interno " and fecha between '".$desde."' and '".$hasta."'",$conexion);
?> 
Código HTML:
<table>
<tr>
<td>INGRESO</td>
<td>FECHA</td>
<td>INTERNO</td>		
</tr> 
Código PHP:
<?php
while ($fila=  mysql_fetch_array($rst))
{
?>
Código HTML:
<td><?php echo$fila["id"];?></td>
<td><?php echo$fila["fechae"];?></td>
<td><?php echo$fila["interno"];?></td>
</tr> 
Código PHP:
<?php
}
?>
Código HTML:
</table> 
Obviamente "solo" me da los resultados obtenidos siempre y cuando introduzca un número de interno.
Pero ¿Qué tendría que hacer para que: En el caso de que no le introduzca un número de interno me devuelva todos los resultados entre las fechas solicitadas?
Desde ya muchas gracias por la ayuda.
  #2 (permalink)  
Antiguo 01/08/2014, 15:55
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Buscador, si no hay nada entonces es todo

Podrías verificar si hay datos llegados a través del método POST y de haberlos, armas la condición que luego añades a la consulta.

Código PHP:
Ver original
  1. if ($_POST){
  2.     $interno=$_POST["txt1"];
  3.  
  4.     $desde=$_POST["txt2"];
  5.     if ($desde==""){
  6.         $desde="20000101";
  7.     }
  8.  
  9.     $hasta=$_POST["txt3"];
  10.     if ($hasta==""){
  11.         $hasta=date("Y,m,d");
  12.     }
  13.  
  14.     $condicion = "WHERE interno = {$interno} AND fecha BETWEEN '{$desde}' AND '{$hasta}'";
  15. }
  16. else $condicion = '';
  17.  
  18. $rst = mysql_query("SELECT * FROM tabla1 $condicion", $conexion);

Si te fijas, cuando no hayan datos provenientes del formulario, la variable $condicion estará vacía, entonces, no afectará a la consulta.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 01/08/2014, 16:13
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Buscador, si no hay nada entonces es todo

Yo haría algo como :
[HIGHLIGHT="PHP"]

$interno=$_POST["txt1"];
$desde=$_POST["txt2"];
$hasta=$_POST["txt3"];
//declaramos query
$query = "SELECT * FROM tabla1 WHERE interno=" . $interno . " and fecha between '".$desde."' and '".$hasta."'";

if($interno==""){
//le estamos diciendo a php que el modifique el ambito de la variable query a global con lo que reemplaza el contenido y construye una nueva query
global $query;
$query = "SELECT * FROM tabla1 WHERE fecha between '".$desde."' and '".$hasta."'";


}elseif ($desde=="" && $hasta=="") {
$desde="20000101";
$hasta=date("Y,m,d");
global $query;
$query = "SELECT * FROM tabla1 WHERE interno=" . $interno . " and fecha between '".$desde."' and '".$hasta."'";
}

$rst = mysql_query($query,$conexion);
[/PHP]

Saludos!
  #4 (permalink)  
Antiguo 01/08/2014, 16:14
Avatar de asus090102  
Fecha de Ingreso: mayo-2012
Ubicación: Ensenada- Buenos Aires
Mensajes: 67
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Buscador, si no hay nada entonces es todo

Hola Alexis88 antes que nada, gracias por responder. El tema está en que cuando cargo la página me lista todo (muy bien ) pero cuando introduzco datos para filtrar deja de funcionar todo y ya no funciona n lo que antes funcionaba. No procesa.
  #5 (permalink)  
Antiguo 01/08/2014, 16:17
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Buscador, si no hay nada entonces es todo

UFF como me esta fallando hoy la página!! llevo 3 intentos para publicar el post!

Pongo de nuevo el código!

Que oído verlo sin higlight!


Yo haría algo como :

Código PHP:
Ver original
  1. $interno=$_POST["txt1"];
  2. $desde=$_POST["txt2"];
  3. $hasta=$_POST["txt3"];
  4. //declaramos query
  5. $query = "SELECT * FROM tabla1 WHERE interno=" . $interno . " and fecha between '".$desde."' and '".$hasta."'";
  6.  
  7. if($interno==""){
  8.  //le estamos diciendo a php que el modifique el ambito de la variable  query a global con lo que reemplaza el contenido y construye una nueva query
  9.  global $query;
  10.  $query = "SELECT * FROM tabla1 WHERE fecha between '".$desde."' and '".$hasta."'";
  11.  
  12.  
  13. }elseif ($desde=="" && $hasta=="") {
  14.     $desde="20000101";
  15.     $hasta=date("Y,m,d");
  16.     global $query;
  17.     $query = "SELECT * FROM tabla1 WHERE interno=" . $interno . " and fecha between '".$desde."' and '".$hasta."'";
  18. }else{
  19.         global $query;
  20.     $query = "SELECT * FROM tabla1";
  21.  
  22. }
  23.  
  24. $rst = mysql_query($query,$conexion);
Saludos!
  #6 (permalink)  
Antiguo 01/08/2014, 16:34
Avatar de asus090102  
Fecha de Ingreso: mayo-2012
Ubicación: Ensenada- Buenos Aires
Mensajes: 67
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Buscador, si no hay nada entonces es todo

Hola Djoaq, gracias por responder también. tu respuesta dió en el blanco. Ya funciona como corresponde. Muchísimas gracias a los 2.
  #7 (permalink)  
Antiguo 01/08/2014, 16:44
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Buscador, si no hay nada entonces es todo

De nada , pero te recomendaría que uses la extensión myqli ! mysql esta obsoleta y además importantisimo limpiar y sanear todos los post que recibes
http://www.w3schools.com/PHP/filter_sanitize_string.asp

Saludos!
  #8 (permalink)  
Antiguo 01/08/2014, 16:55
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Buscador, si no hay nada entonces es todo

No había alcanzado a leer bien lo que escribiste, por lo que te puse una respuesta que ya había dado a otra persona en el pasado cuyo hilo tenía un título similar. No hay necesidad de hacer global a la variable que contiene la consulta, bastaba con definir la consulta general al inicio y en cada condición (los if), crear la condición que luego se añadiría a la consulta.

Código PHP:
Ver original
  1. $interno = $_POST['txt1'];
  2. $desde = strlen($_POST['txt2']) ? $_POST['txt2'] : '20000101';
  3. $hasta = strlen($_POST['txt3']) ? $_POST['txt3'] : date('Y,m,d');
  4. $consulta = 'SELECT * FROM tabla1 ';
  5. $condicion = '';
  6.  
  7. if (!strlen($interno))
  8.     $condicion = "WHERE fecha BETWEEN '{$desde}' AND '{$hasta}'";
  9. else if (!strlen($desde) and !strlen($hasta))
  10.     $condicion = "WHERE interno = {$interno}";
  11. else
  12.     $condicion = "WHERE interno = {$interno} AND (fecha BETWEEN '{$desde}' AND '{$hasta}')";
  13.  
  14. $consulta .= $condicion;
  15. $rst = mysql_query($consulta, $conexion);

Ojo, ten cuidado al momento de mezclar las condiciones de la fecha y el campo 'interno' pues en ambos casos usas el operador lógico AND, el cual puede ser malinterpretado al momento de ejecutar la consulta, es por esa razón que encierro entre paréntesis a la consulta de la fecha a fin de evitar conflictos lógicos. También ten cuidado con el formato con el que obtienes la fecha actual, quizá sea incompatible con el del campo 'fecha' en la tabla de tu BD. Y por último, te aconsejo mudarte a la extensión mejorada MySQLi pues MySQL está obsoleta a partir de PHP 5.5.0.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 01/08/2014, 17:14
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Buscador, si no hay nada entonces es todo

Cita:
Iniciado por Alexis88 Ver Mensaje
No había alcanzado a leer bien lo que escribiste, por lo que te puse una respuesta que ya había dado a otra persona en el pasado cuyo hilo tenía un título similar. No hay necesidad de hacer global a la variable que contiene la consulta, bastaba con definir la consulta general al inicio y en cada condición (los if), crear la condición que luego se añadiría a la consulta.

Código PHP:
Ver original
  1. $interno = $_POST['txt1'];
  2. $desde = strlen($_POST['txt2']) ? $_POST['txt2'] : '20000101';
  3. $hasta = strlen($_POST['txt3']) ? $_POST['txt3'] : date('Y,m,d');
  4. $consulta = 'SELECT * FROM tabla1 ';
  5. $condicion = '';
  6.  
  7. if (!strlen($interno))
  8.     $condicion = "WHERE fecha BETWEEN '{$desde}' AND '{$hasta}'";
  9. else if (!strlen($desde) and !strlen($hasta))
  10.     $condicion = "WHERE interno = {$interno}";
  11. else
  12.     $condicion = "WHERE interno = {$interno} AND (fecha BETWEEN '{$desde}' AND '{$hasta}')";
  13.  
  14. $consulta .= $condicion;
  15. $rst = mysql_query($consulta, $conexion);

Ojo, ten cuidado al momento de mezclar las condiciones de la fecha y el campo 'interno' pues en ambos casos usas el operador lógico AND, el cual puede ser malinterpretado al momento de ejecutar la consulta, es por esa razón que encierro entre paréntesis a la consulta de la fecha a fin de evitar conflictos lógicos. También ten cuidado con el formato con el que obtienes la fecha actual, quizá sea incompatible con el del campo 'fecha' en la tabla de tu BD. Y por último, te aconsejo mudarte a la extensión mejorada MySQLi pues MySQL está obsoleta a partir de PHP 5.5.0.

Saludos
Me gusta esta solución aunque no la entiendo bien, seria como usar ternarias no? Si viene vacio strlen seria falso y haria la otra condicion, pero viene informada strlen no devolveria la longitud de la cadena?
  #10 (permalink)  
Antiguo 01/08/2014, 17:23
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Buscador, si no hay nada entonces es todo

Claro, es que si la longitud es cero, se interpreta como false, recuerda que el cero equivale a falso, mientras que si la longitud es mayor a cero, se le considera true.

Código PHP:
Ver original
  1. echo strlen('abc') ? 'Sí hay' : 'No hay'; //Imprimirá 'Sí hay'
  2. echo strlen('') ?  'Sí hay' : 'No hay'; //Imprimirá 'No hay'

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: buscador, fecha, mysql, nada, select, tabla, todo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:01.