Foros del Web » Programando para Internet » PHP »

problema con buscador

Estas en el tema de problema con buscador en el foro de PHP en Foros del Web. Hice un buscador que busca registros de mi base de datos... Tengo 2 problemas graves con él... Código PHP: <?php $nombre  =  $_POST [ 'nombre' ...
  #1 (permalink)  
Antiguo 25/07/2006, 21:06
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
problema con buscador

Hice un buscador que busca registros de mi base de datos...

Tengo 2 problemas graves con él...

Código PHP:
<?php
$nombre 
$_POST['nombre'];

$nombre str_replace('á','a',$nombre);
$nombre str_replace('é','e',$nombre);
$nombre str_replace('í','i',$nombre);
$nombre str_replace('ó','o',$nombre);
$nombre str_replace('ú','u',$nombre);
$nombre str_replace('Á','A',$nombre);
$nombre str_replace('É','E',$nombre);
$nombre str_replace('Í','I',$nombre);
$nombre str_replace('Ó','O',$nombre);
$nombre str_replace('Ú','U',$nombre);
$nombre str_replace(" ","%",$nombre);

if (
$nombre == ""){
$nombre "%";
}

$sql="SELECT * FROM comercios WHERE plan=4 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
$result=mysql_query($sql);
while (
$fila mysql_fetch_Array($result)) {
echo 
'
            <div class="ficha">
                <h2>'
.$fila["nombre"].'</h2>
                <h3>'
.$fila["categoria"].' - '.$fila["barrio"].'</h3>
                <p class="largo">'
;
                if (
$fila["img"] != ""){
                    echo 
'<img alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="fotos/'.utf8_encode ($fila["img"]).'" />';
                };
echo                
$fila["linea1"].'<br />
                    '
.$fila["linea2"].'<br />
                    '
.$fila["linea3"].'
                </p>
                <p class="corto">
                    '
.$fila["linea4"].'<br />
                    '
.$fila["linea5"].'
                </p>
                    <a href="'
.$fila["leermas"].'" target="_blank" title="'.$fila["nombre"].'"><img class="abs" alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="img/sitio_web.gif" /></a>
            </div>
'
;
}

$sql="SELECT * FROM comercios WHERE plan=3 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
$result=mysql_query($sql);
while (
$fila mysql_fetch_Array($result)) {
echo 
'
            <div class="ficha">
                <h2>'
.$fila["nombre"].'</h2>
                <h3>'
.$fila["categoria"].' - '.$fila["barrio"].'</h3>
                <p class="largo">'
;
                if (
$fila["img"] != ""){
                    echo 
'<img alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="fotos/'.utf8_encode ($fila["img"]).'" />';
                };
echo                
$fila["linea1"].'<br />
                    '
.$fila["linea2"].'<br />
                    '
.$fila["linea3"].'
                </p>
                <p class="corto">
                    '
.$fila["linea4"].'<br />
                    '
.$fila["linea5"].'
                </p>
                    <a href="index.php?pag=mostrar&id='
.$fila["id"].'" title="'.$fila["nombre"].'"><img class="abs" alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="img/leer_mas.gif" /></a>
            </div>
'
;
}

$sql="SELECT * FROM comercios WHERE plan=2 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
$result=mysql_query($sql);
while (
$fila mysql_fetch_Array($result)) {
echo 
'
            <div class="ficha">
                <h2>'
.$fila["nombre"].'</h2>
                <h3>'
.$fila["categoria"].' - '.$fila["barrio"].'</h3>
                <p class="largo">'
;
                if (
$fila["img"] != ""){
                    echo 
'<img alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="fotos/'.utf8_encode ($fila["img"]).'" />';
                };
echo                
$fila["linea1"].'<br />
                    '
.$fila["linea2"].'<br />
                    '
.$fila["linea3"].'
                </p>
                <p class="corto">
                    '
.$fila["linea4"].'<br />
                    '
.$fila["linea5"].'
                </p>
            </div>
'
;
}

$basico=mysql_query("SELECT COUNT(id) FROM comercios WHERE plan=1 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%' ORDER BY nombre;");
$hay mysql_result($basico,0,0);

if (
$hay != 0){
    echo 
"<br style='clear:both;' />";
    echo 
'<div class="contenedor_plan1">';
    
$sql="SELECT * FROM comercios WHERE plan=1 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
    
$result=mysql_query($sql);
    while (
$fila mysql_fetch_Array($result)) {
    echo 
'
                <div class="ficha2">
                    <h2>'
.$fila["nombre"].'</h2>
                    <h3>'
.$fila["categoria"].'</h3>
                    <p>'
.$fila["linea1"].'<br />
                        '
.$fila["linea2"].'<br />
                        '
.$fila["linea3"].'<br />
                        '
.$fila["linea4"].'
                    </p>
                </div>
    '
;
    }
}

$plan=mysql_query("SELECT COUNT(id) FROM comercios WHERE barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%'");
$total mysql_result($plan,0,0);

if (
$total == 0){
    
$nombre2 substr($nombre03);//las tres primeras letras de $nombre
    
    
$sql="SELECT * FROM comercios WHERE plan=4 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre2."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
    
$result=mysql_query($sql);
    while (
$fila mysql_fetch_Array($result)) {
    echo 
'
                <div class="ficha">
                    <h2>'
.$fila["nombre"].'</h2>
                    <h3>'
.$fila["categoria"].' - '.$fila["barrio"].'</h3>
                    <p class="largo">'
;
                    if (
$fila["img"] != ""){
                        echo 
'<img alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="fotos/'.utf8_encode ($fila["img"]).'" />';
                    };
    echo                
$fila["linea1"].'<br />
                        '
.$fila["linea2"].'<br />
                        '
.$fila["linea3"].'
                    </p>
                    <p class="corto">
                        '
.$fila["linea4"].'<br />
                        '
.$fila["linea5"].'
                    </p>
                        <a href="'
.$fila["leermas"].'" target="_blank" title="'.$fila["nombre"].'"><img class="abs" alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="img/sitio_web.gif" /></a>
                </div>
    '
;
    }
    
    
$sql="SELECT * FROM comercios WHERE plan=3 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre2."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
    
$result=mysql_query($sql);
    while (
$fila mysql_fetch_Array($result)) {
    echo 
'
                <div class="ficha">
                    <h2>'
.$fila["nombre"].'</h2>
                    <h3>'
.$fila["categoria"].' - '.$fila["barrio"].'</h3>
                    <p class="largo">'
;
                    if (
$fila["img"] != ""){
                        echo 
'<img alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="fotos/'.utf8_encode ($fila["img"]).'" />';
                    };
    echo                
$fila["linea1"].'<br />
                        '
.$fila["linea2"].'<br />
                        '
.$fila["linea3"].'
                    </p>
                    <p class="corto">
                        '
.$fila["linea4"].'<br />
                        '
.$fila["linea5"].'
                    </p>
                        <a href="index.php?pag=mostrar&id='
.$fila["id"].'" title="'.$fila["nombre"].'"><img class="abs" alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="img/leer_mas.gif" /></a>
                </div>
    '
;
    }

    
$sql="SELECT * FROM comercios WHERE plan=2 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre2."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
    
$result=mysql_query($sql);
    while (
$fila mysql_fetch_Array($result)) {
    echo 
'
                <div class="ficha">
                    <h2>'
.$fila["nombre"].'</h2>
                    <h3>'
.$fila["categoria"].' - '.$fila["barrio"].'</h3>
                    <p class="largo">'
;
                    if (
$fila["img"] != ""){
                        echo 
'<img alt="'.utf8_encode ($fila["nombre"]).'" title="'.utf8_encode ($fila["nombre"]).'" src="fotos/'.utf8_encode ($fila["img"]).'" />';
                    };
    echo                
$fila["linea1"].'<br />
                        '
.$fila["linea2"].'<br />
                        '
.$fila["linea3"].'
                    </p>
                    <p class="corto">
                        '
.$fila["linea4"].'<br />
                        '
.$fila["linea5"].'
                    </p>
                </div>
    '
;
    }
    
    echo 
"<br style='clear:both;' />";
    echo 
'<div class="contenedor_plan1">';
    
$sql="SELECT * FROM comercios WHERE plan=1 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre2."%' ORDER BY nombre;"//Con Limit 0,5 mostramos sólo los últimos 5 registros, basándonos en el campo [id]
    
$result=mysql_query($sql);
    while (
$fila mysql_fetch_Array($result)) {
    echo 
'
                <div class="ficha2">
                    <h2>'
.$fila["nombre"].'</h2>
                    <h3>'
.$fila["categoria"].'</h3>
                    <p>'
.$fila["linea1"].'<br />
                        '
.$fila["linea2"].'<br />
                        '
.$fila["linea3"].'<br />
                        '
.$fila["linea4"].'
                    </p>
                </div>
    '
;
    }
    
    
$plan2=mysql_query("SELECT COUNT(id) FROM comercios WHERE barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre2."%'");
    
$total2 mysql_result($plan2,0,0);
    if (
$total2 == 0){
        echo 
'
                <div class="ficha">
                    <h2>'
.utf8_encode ("Tu búsqueda no obtuvo ningún resultado.").'</h2>
                    <h3>&nbsp;</h3>
                    <p class="largo">
                        <img alt="0 resultados" src="img/busqueda_error.gif" />
                        '
.utf8_encode ("Puedes volver a intentarlo, cambiando el nombre de tu búsqueda, o dejando el campo 'Nombre' en blanco para buscar todos los comercios de una categoría o barrio.").'
                    </p>
                    <p class="corto">
                        '
.utf8_encode ("Si deseas contactarnos:<br /><a href='mailto:[email protected]' title='Ayuda'>[email protected]</a>.").'
                    </p>
                </div>
        '
;
    }
}

echo 
'</div>';
?>
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #2 (permalink)  
Antiguo 25/07/2006, 21:09
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
En primer lugar, no me sustituye los tildes... no se porque...


Esto debería eliminarlos, verdad?:

Código PHP:
$nombre str_replace('á','a',$nombre);
$nombre str_replace('é','e',$nombre);
$nombre str_replace('í','i',$nombre);
$nombre str_replace('ó','o',$nombre);
$nombre str_replace('ú','u',$nombre);
$nombre str_replace('Á','A',$nombre);
$nombre str_replace('É','E',$nombre);
$nombre str_replace('Í','I',$nombre);
$nombre str_replace('Ó','O',$nombre);
$nombre str_replace('Ú','U',$nombre);
$nombre str_replace(" ","%",$nombre); 
Que es lo que está mal? alguien sabe?


En segundo lugar...
tengo el problema de que (si bien realiza primero una búsqueda gral. y luego con las primeras 3 letras, para seleccionar elementos "parecidos"...), si alguien ingresa (por ej.): "ENPASTA", (estando en mi DB "EMPASTA"), no le encuentra resultados, porque no hay un registro igual, ni uno con las 3 mismas primeras letras...

Cómo podría hacer esto...?

(escuche que había una función de php o mysql que comparaba "caracter a caracter", eso existe???)


MUCHÍSIMAS gracias por molestarte en leer esto...
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #3 (permalink)  
Antiguo 26/07/2006, 02:32
ysi
 
Fecha de Ingreso: junio-2006
Mensajes: 22
Antigüedad: 17 años, 10 meses
Puntos: 0
sql="SELECT * FROM comercios WHERE plan=4 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%' ORDER BY nombre;";

¿No será que las condiciones son muy restrictivas? Usas AND, asi que buscas registros que cumplan TODAS las búsquedas, y por lo que veo las otras variables no estan definidas.

Adema´s, evita usar
$nombre=$_POST["nombre"];

O usas otro nombre o modificas la variable _POST directamente, pero no una con el mismo nombre, pq con "register_globals" en "on" puede dar problemas.
  #4 (permalink)  
Antiguo 26/07/2006, 06:38
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
Cita:
Iniciado por ysi
sql="SELECT * FROM comercios WHERE plan=4 And barrio Like '".$barrio."' And categoria Like '".$categoria."' And nombre Like '%".$nombre."%' ORDER BY nombre;";

¿No será que las condiciones son muy restrictivas? Usas AND, asi que buscas registros que cumplan TODAS las búsquedas, y por lo que veo las otras variables no estan definidas.
Las otras variable estan definidas (no lo puse ahí porque me pasaba del límite de caracteres... ), pero esas vars no dan problemas...
Y La idea es que sea restrictivo...


Cita:
Adema´s, evita usar
$nombre=$_POST["nombre"];

O usas otro nombre o modificas la variable _POST directamente, pero no una con el mismo nombre, pq con "register_globals" en "on" puede dar problemas.
Voy a probar con eso, luego les cuento...


alguna otra idea???

gracias
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #5 (permalink)  
Antiguo 27/07/2006, 10:30
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
no funciona...

probé a cambiar el nombre de la variable como decía ysi, y tampoco me funciona.....


alguien que pueda ayudarme...??

gracias!
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #6 (permalink)  
Antiguo 27/07/2006, 12:57
Avatar de .php  
Fecha de Ingreso: julio-2006
Mensajes: 481
Antigüedad: 17 años, 9 meses
Puntos: 5
prueba con esto
Código PHP:
$nombre str_ireplace('á','a',$nombre);
$nombre str_ireplace('é','e',$nombre);
$nombre str_ireplace('í','i',$nombre);
$nombre str_ireplace('ó','o',$nombre);
$nombre str_ireplace('ú','u',$nombre);
$nombre str_ireplace('Á','A',$nombre);
$nombre str_ireplace('É','E',$nombre);
$nombre str_ireplace('Í','I',$nombre);
$nombre str_ireplace('Ó','O',$nombre);
$nombre str_ireplace('Ú','U',$nombre);
$nombre str_ireplace(" ","%",$nombre); 
http://cl2.php.net/manual/es/function.str-ireplace.php
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 20:27.