Foros del Web » Programando para Internet » PHP »

No se porque pero este codigo no funciona...

Estas en el tema de No se porque pero este codigo no funciona... en el foro de PHP en Foros del Web. Hola, he realizado un buscador para mi web, primeramente lo realize para que puediera buscar solo una palabra en en los campos de la tabla ...
  #1 (permalink)  
Antiguo 09/03/2003, 20:49
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
No se porque pero este codigo no funciona...

Hola, he realizado un buscador para mi web, primeramente lo realize para que puediera buscar solo una palabra en en los campos de la tabla Buscador, al darme cuenta que si introducia mas de una palabra en el formulario del buscador no encontraba nada, opte por utilizar un explode para desglosar la variable $buscar, y ahora no se porque pero cada vez que meto una o mas palabras para buscar me saca todos los registros de la tabla.

Si alguien pudiese decirme porque es le estaria mu pero que my agradecido xddd la verdad no le encuentro explicación a continuación pego el codigo:

# asignamos la conexion a una base de datos determinada

mysql_select_db($base, $conexion);

# divimos la variable $buscar en trozos

$trozobuscar = explode(" ",$buscar);

# establecemos el criterio de seleccion

$resultado = mysql_query("SELECT Titulo, Descripcion, Url FROM $tabla WHERE (Titulo LIKE '%$trozobuscar[0]%' OR Titulo LIKE '%$trozobuscar[1]%' OR Titulo LIKE '%$trozobuscar[2]%' OR Titulo LIKE '%$trozobuscar[3]%' OR Descripcion LIKE '%$trozobuscar[0]%' OR Descripcion LIKE '%$trozobuscar[1]%' OR Descripcion LIKE '%$trozobuscar[2]%' OR Descripcion LIKE '%$trozobuscar[3]%' OR Claves LIKE '%$trozobuscar[0]%' OR Claves LIKE '%$trozobuscar[1]%' OR Claves LIKE '%$trozobuscar[2]%' OR Claves LIKE '%$trozobuscar[3]%') ORDER BY Titulo ASC", $conexion);


# CREAMOS UNA CABEZERA DE UNA TABLA (codigo HTML)

echo "<table width='90%'cellpadding='0' cellspacing='0' align=center bgcolor='#EFEFEF' border=0>";

# establecemos un bucle que recoge en un array
# cada una de las LINEAS DEL RESULTADO DE LA CONSULTA
# utilizamos en esta ocasión <<myslq_fetch_array>>
# recuerda que esta ultima función devuelve un array escalar
# y otro asociativo con los resultados

while ($encontrados = mysql_fetch_array($resultado)){
echo "<tr><td height='20'>&nbsp;</td></tr>";
echo "<tr><td height='20' valign='middle' bgcolor='#003366'>&nbsp;<font face='arial' size='1'><strong><a href='".$encontrados['Url']."'>".$encontrados['Titulo']."</a></strong></font></td></tr>";
echo "<tr><td></td></tr>";
echo "<tr><td><font face='arial' size='1'><strong>".$encontrados['Descripcion'].".</strong></font></td></tr>";
echo "<tr><td><br></td></tr>";
}
echo "</table>";

if($vacio=mysql_num_rows($resultado)==0){
echo "<br><br><font face='arial' size='1'><strong>No se han encontrado coincidencias con la cadena <font color='#FF0000'>".$buscar."</font>.</strong></font>";
}

# cerramos la conexión

mysql_close();

?>

Gracias desde ya!!! Un saludo.
  #2 (permalink)  
Antiguo 10/03/2003, 05:00
Avatar de BVis  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 15 años
Puntos: 0
Cambia:

LIKE '%$trozobuscar[0]%'

por

LIKE '%{$trozobuscar[0]}%'


y claro, así con todos.


De todos modos te recomiendo que te mires algo sobre 'FULLTEXT', si usas MySQL.


1 Saludo.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates
  #3 (permalink)  
Antiguo 10/03/2003, 20:08
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
Hola BVis:

He modificado el SELECT según me comentaste, y sigue pasando lo mismo, lo he dejado exactamente asi:

$resultado = mysql_query("SELECT Titulo, Descripcion, Url FROM $tabla WHERE (Titulo LIKE '%{$trozobuscar[0]}%' OR Titulo LIKE '%{$trozobuscar[1]}%' OR Titulo LIKE '%{$trozobuscar[2]}%' OR Titulo LIKE '%{$trozobuscar[3]}%' OR
Descripcion LIKE '%{$trozobuscar[0]}%' OR Descripcion LIKE '%{$trozobuscar[1]}%' OR Descripcion LIKE '%{$trozobuscar[2]}%' OR Descripcion LIKE '%{$trozobuscar[3]}%' OR Claves LIKE '%{$trozobuscar[0]}%' OR Claves LIKE '%{$trozobuscar[1]}%' OR Claves LIKE '%{$trozobuscar[2]}%' OR Claves LIKE '%{$trozobuscar[3]}%') ORDER BY Titulo ASC", $conexion);

¿De que puede ser que me sigan saliendo todos los registros cada vez que realizo una busqueda?

Un saludo.
  #4 (permalink)  
Antiguo 11/03/2003, 12:02
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
Por favor que alguien me ayude!!!

No me explico porque no funciona este script...

Un saludo.
  #5 (permalink)  
Antiguo 11/03/2003, 12:35
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Usa:

$resultado=mysql_query(...) or die (mysql_error());

Por si hay algun error en el SQL de la consulta ..

Un saludo,
  #6 (permalink)  
Antiguo 11/03/2003, 12:50
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
Hola Cluster:

El problema es que no me devuelve ningun error en la consulta, lo unico que hace es que no realiza la selección, me saca todos los registros de la tabla.

¿Alguna sugerencia la verdad ya no se que hacer?

Un saludo.
  #7 (permalink)  
Antiguo 11/03/2003, 16:15
Avatar de BVis  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 15 años
Puntos: 0
Recomiendo que siempre se haga lo siguiente para detectar posibles errores en consultas:
Código PHP:
$sql "...CONSULTA SQL...";
$resultado[email protected]mysql_query($sql) or die ("Error en la consulta:\n<br><b>$sql</b><br>\nMySQL dice: ".mysql_error()); 
De esta manera detectaremos inmediatamente si hay algo incoherente en la consulta.

1 Saludo.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates
  #8 (permalink)  
Antiguo 11/03/2003, 17:31
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
Hola BVis:

He modificado la sentencia según me comentaste exactamente la he dejado asi:

# seleccionamos la base de datos

mysql_select_db($base, $conexion);

# divimos la variable

$buscar en trozos

$trozobuscar = explode(" ",$buscar);

# definimos la sentencia sql

$sql = "SELECT * FROM $tabla WHERE (Titulo LIKE '%{$trozobuscar[0]}%' OR Titulo LIKE '%{$trozobuscar[1]}%' OR Titulo LIKE '%{$trozobuscar[2]}%' OR Titulo LIKE '%{$trozobuscar[3]}%' OR Descripcion LIKE '%{$trozobuscar[0]}%' OR Descripcion LIKE '%{$trozobuscar[1]}%' OR Descripcion LIKE '%{$trozobuscar[2]}%' OR Descripcion LIKE '%{$trozobuscar[3]}%' OR Claves LIKE '%{$trozobuscar[0]}%' OR Claves LIKE '%{$trozobuscar[1]}%' OR Claves LIKE '%{$trozobuscar[2]}%' OR Claves LIKE '%{$trozobuscar[3]}%') ORDER BY Titulo ASC";


# establecemos el criterio de seleccion

$resultado = mysql_query($sql, $conexion) or die ("Error en la consulta:\n<br><b>$sql</b><br>\nMySQL dice: ".mysql_error());


# CREAMOS UNA CABEZERA DE UNA TABLA (codigo HTML)

echo "<table width='90%'cellpadding='0' cellspacing='0' align=center bgcolor='#EFEFEF' border=0>";

# establecemos un bucle que recoge en un array
# cada una de las LINEAS DEL RESULTADO DE LA CONSULTA
# utilizamos en esta ocasión <<myslq_fetch_array>>
# recuerda que esta ultima función devuelve un array escalar
# y otro asociativo con los resultados


while ($encontrados = mysql_fetch_array($resultado)){
echo "<tr><td height='20'>&nbsp;</td></tr>";
echo "<tr><td height='20' valign='middle' bgcolor='#003366'>&nbsp;<font face='arial' size='1'><strong><a href='".$encontrados['Url']."'>".$encontrados['Titulo']."</a></strong></font></td></tr>";
echo "<tr><td></td></tr>";
echo "<tr><td><font face='arial' size='1'><strong>".$encontrados['Descripcion'].".</strong></font></td></tr>";
echo "<tr><td><br></td></tr>";
}
echo "</table>";

if($vacio=mysql_num_rows($resultado)==0){
echo "<br><br><font face='arial' size='1'><strong>No se han encontrado coincidencias con la cadena <font color='#FF0000'>".$buscar."</font>.</strong></font>";
}

# cerramos la conexión

mysql_close();

?>

<form action="buscar2bis.php" method="post" name="BUSCADOR" id="BUSCADOR">
<strong><font color="#003366" size="1" face="Tahoma">BUSCADOR</font></strong>
<input name="buscar" type="text" id="buscar" size="25" maxlength="100" style="font-family:arial;font-size:7pt;font-weight:bold">
&nbsp;
<input name="Buscar" type="submit" id="Buscar" style="background-color:#ffffff;font-family:arial;font-size:7pt;font-weight:bold" value="Buscar">
</form>

----------------------------------------------------------------

Sigue pasandome lo mismo no me da ningún error pero aveces encuentra registros y otras veces no encuentra nada.

La verdad me estoy rallando mazo.. , al final del php tengo un formulario para volver a realizar busquedas que vuelve a llamar al mismo script php es decir este ---> buscar2bis.php ¿¿Puede ser por dicho formulario por lo que me falla la verdad es que no tiene mucho sentido que fallase por eso pero ya no se me ocurre nada.

Un saludo.
  #9 (permalink)  
Antiguo 13/03/2003, 11:40
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
Este codigo en teoria esta bien y no funciona alguien sabe porque????

Hola de nuevo:

La verdad sigo igual que al principio, el buscador sigue petando y no se porque???

Meto cualquier palabra en el buscador y me saca todos los registros de la tabla . Os pego la estructura de la tabla aver si me equivocado en algo:

CREATE TABLE Buscador (
ID INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
Titulo VARCHAR(255) NOT NULL,
Descripcion MEDIUMTEXT NOT NULL,
Claves VARCHAR(255) NOT NULL,
Url VARCHAR(255) NOT NULL,
PRIMARY KEY(ID)
);


Un saludo.
  #10 (permalink)  
Antiguo 13/03/2003, 14:58
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Haz un echo $sql y mira si por casualidad hay algun like '%%' o algo asi. Porque si $trozobuscar[0], $trozobuscar[1], ... tiene la cadena vacia es lo que se genera. Y eso es lo que hace que te devuelva todos los registros.

Lo mejor es que crees la condicion where dinamicamente recorriendo el array $trozobuscar y añadiendo las condiciones para todo elemento no vacio.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #11 (permalink)  
Antiguo 14/03/2003, 11:01
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
Hola Josemi:

Cuando dices lo de recorrer el array devuelto por el explode, a que te refieres exactamente a recorrerlo con una funcion tipo foreach???

La verdad lo he estado intentado y despues no se como acoplarlo al WHERE.

¿Podrías ponerme un ejemplo de como hacerlo?

Un saludo.
  #12 (permalink)  
Antiguo 14/03/2003, 11:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si mal no recuerdo .. un ejemplo completo te lo puse en:

http://www.forosdelweb.com/showthrea...hreadid=119741

Es lo mismo en este caso .. solo que:

$condicion=" AND ";

usa

$condicion=" OR ";

Es mas, si te trabajas un poco el tema podrias hacer algo para que sea por ejemplo "buscar todas las palabras" .. o "buscar solo que coincida alguna de las palabras" .. mandando el ·$condicion con su valor correspondiente ..

Un saludo,
  #13 (permalink)  
Antiguo 14/03/2003, 13:27
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años
Puntos: 2
Ok gracias cluster probaré a ver con este metodo, porque probe con el FULLTEXT y tiene un incoveniente bastante grande en mi opinión y es que cuando insertas una palabra a buscar y aparece en mas del 50% de los registros no te devuelve nada, esto se puede solucionar usando un BOOLEAN MODE en las busquedas del FULLTEXT, el problema es que este modo solo lo soporta la MySQL a partir de su versión 4, versión que no tiene mi servidor, así que tendre que hacerlo como me habeis comentado.

Un saludo.
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 17:01.