Buscador simple PDO

884 views
Skip to first unread message

Nicolas Ezequiel Almonacid

unread,
Aug 9, 2014, 7:13:55 PM8/9/14
to programa...@googlegroups.com
Hola a todos, aprovecho de presentarme, mi nombre es nicolas, estoy comenzando en esto de php, pdo, mysql, desarrollo web en general, me han pedido desarrollar un sistema de publicacion de avisos, con mucho trabajo estoy adportas de finalizar, he estado estudiando el curso del amigo Jonathan, y me ha servido mucho, ahora me encuentro con el siguiente inconveniente: tengo que hacer un buscador y un filtro con un select, actualmente obtengo todos los registros sin problemas, tengo el select cargado desde la bd, y tengo una fuincion para buscar, pero la misma me arroja siempre que no hay resultados, cuando lo que busco si existe en la bd.. Tengo este codigo:

Funcion para realizar la busqueda:

function buscarAviso(){
           
           
//variables para utilizar en la busqueda
           
            $clave
=$_POST['buscar'];
           
           
//Query para buscar por cod_aviso,correo_electronico,titulo_aviso,etc
           
//$query="SELECT * FROM avisos where cod_aviso LIKE '%$clave%' OR correo_electronico LIKE '%$clave%'";
           
           
 $query
="SELECT * FROM avisos WHERE cod_aviso LIKE '%{$clave}%' OR
correo_electronico LIKE '%{$clave}%' OR titulo_aviso LIKE '%{$clave}%'
OR comuna LIKE '%{$clave}%'"
;
           
           
//Preparar la consulta
            $stmt
=$this->con->prepare($query);
           
            $stmt
->bindParam(1,$clave);
                 
            echo $query
;    
           
           
           
//Ejecutar la Consulta
            $stmt
->execute();
           
if (!$stmt->rowCount() == 0) {
           
               
           
while ($row=$stmt->fetch()){
               $this
->datos[]=$row;
           
}
           
//Retornamos los Valores
           
return $this->datos;
           
}
               
       
else {
            echo
'Nothing found';
       
}
           
           
/*$count = $stmt->rowCount();
            if($count == 0) {
                       $output = '<tr><tr>No results found.</tr></td>';
                   } else {
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                $titulo_aviso= $row['titulo_aviso'];
                $comuna = $row['comuna'];
               
            }
        }
           
           
            //Obtengo el total de filas afectadas por la accion que se realiza
           /*$res=$stmt->fetch();
           
            while ($row=$stmt->fetch()){
               $this->datos[]=$row;
            }
            //Retornamos los Valores
            return $this->datos;*/

           
           
           
       
}//funcion Buscar Aviso
y en esta pagina es en la que musetro todos los avisos (funcionando hasta ahora) y donde esta el input para buscar y el select para filtrar

<?php


require_once
'Inc/funciones.php';
require_once
'js/vendor/PDO_Pagination.php';

$aviso
= new Avisos();


//Muestro todos los Datos en la pagina


if(isset($_POST['buscar'])){
   
//Invoco a la funcion buscar
   
    $busca
=$aviso->buscarAviso();
     
   
   
}else{
         
//cargo por defecto los avisos
    $avisos
=$aviso->listadoAvisos();
    $av
=$aviso->cargarCombo();
    $totalavisos
=count($avisos);
   
}

?>

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
   
<meta charset="utf-8">
   
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   
<title>Plataforma de Avisos Gratuitos.- ChiloeAvisos</title>
   
<!--<meta name="viewport" content="width=device-width, initial-scale=1">-->
       
<link rel="stylesheet" href="css/normalize.min.css">
       
<link rel="stylesheet" href="css/bootstrap.css">
       
<link rel="stylesheet" href="css/main.css">
       
<script src="js/vendor/modernizr-2.6.2.min.js"></script>
</head>

<body>
<!--Contenedor Principal-->
<div class="container">

   
<div class="row">
       
<h3 class="text-center">Avisos Publicados</h3>
       
<p class="text-right alert-info">Tenemos <strong><?php echo $totalavisos; ?> </strong> avisos publicados
         en nuestra Base de Datos
</p>
   
</div>
   
   
<!--Busqueda y Filtros-->
   
<div class="row">
       
<section class="col-lg-12 buscadorAvisos">
           
<form method="POST" id="search" class="form-inline" action="">
               
<div class="form-group">
               
<label for="buscador">Titulo del Aviso:</label>
               
<input type="text" name="buscador" class="form-control"/>
               
<input type="submit" class="btn btn-default" name="buscar" value="Buscar"/>
               
</div>
               
<div class="form-group">
               
<label for="categorias">Mostrar Avisos de:</label>
               
<select name="categorias" class="form-control" >
                 
                   
<?php foreach($av as $row) : ?>
                    <option value="
<?php echo $row['id_categoria']; ?>"><?php echo $row['categoria']; ?></option>
               
<?php endforeach ?>

               
</select>
               
</div>
           
</form>
       
</section>
       
       
<!--<section class="col-lg-8">
        Filtros de Busqueda
        </section>-->

       
   
</div><!--Fin Busqueda y Filtros-->
   
   
<!--Presentación de Avisos-->
   
<div class="row">
       
       
<!--Avisos-->
       
<?php foreach($avisos as $row)
           
{
                echo
"<article class='col-lg-12 listadoAvisos'>";
       
        echo
"<div class='col-lg-5 imagenListaAviso'>";
                   
if($row['img1']==NULL){
            echo
"<img src='img/noimage.jpg'  class='img-rounded' />";
           
}else{
                                echo
"<img src=".$row['img1']." height='200px' width='350px' />";}
        echo
"</div>";
       
               
//contenido
               echo
"<div class='col-lg-6 text-left contenidoListaAviso'>";
                   
       
//Titulo del Aviso
        echo
"<h3 class='text-center'>".$row['titulo_aviso']."</h3>";
       
//Parrafo parte Aviso
        echo
"<p class='text-justify'>".$row['aviso_completo']."</p>";
       
//Fecha de Publicación
        echo
"<p class='text-justify'>".$row['fecha_publicacion']."</p>";
       
//Categoria
        echo
"<p class='text-justify'>".$row['categoria_aviso']."</p>";
       
//Boton Leer Aviso Completo
        echo
"<a class='text-center btn btn-info' href='detalleaviso.php?cod_aviso=".$row['cod_aviso']."'>Ver Aviso</a>";
                   
                echo
"</div>";
                                                 
                echo
"</article>";
       
               
}?>
       
               
</div>
               
               
       
</div>
               
               
<!--aca muestro el listado de avisos-->
   
   
</div><!--Fin Presentación de Avisos-->
   
   
<!--Paginacion de Resultados-->
   
<div class="text-center paginas">

Agradezco a todos desde ya su tiempo y su ayuda...

Jeison Varilla Mendoza

unread,
Aug 9, 2014, 7:17:52 PM8/9/14
to programa...@googlegroups.com
Prueba primero que la consulta este bien, tomala exactamente del php y quitale a {} a el criterio $clave
segundo prueba if($stm->rowCount() != 0)...haber. listo



--
--
Publicar: programa...@googlegroups.com
Anular suscripción: programando-an...@googlegroups.com
Webs: http://www.blonder413.com/ - http://www.cesarcancino.com/ - http://www.oscar-gomez.net/ - http://www.keyphercom.com/blog/

---
Has recibido este mensaje porque estás suscrito al grupo "Programando Ando" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a programando-an...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Nicolas Ezequiel Almonacid

unread,
Aug 9, 2014, 7:24:22 PM8/9/14
to programa...@googlegroups.com
hola amigo Jeison, gracias por tu ayuda, mira en la funcion tengo un echo de la query para ver que esta tomando y me envia esto:

SELECT * FROM avisos WHERE cod_aviso LIKE '%Buscar%' OR correo_electronico LIKE '%Buscar%' OR titulo_aviso LIKE '%Buscar%' OR comuna LIKE '%Buscar%'

le quite los { } a $clave, capaz que no entendi bien lo de tomar la consulta directamente del php

Jonathan Morales Salazar

unread,
Aug 9, 2014, 7:26:42 PM8/9/14
to programa...@googlegroups.com
hacer esto: '%$clave%' puede causar que php pase el valor tal y como lo escribe, es decir, %$clave% en lugar del valor de la variable, le recomiendo que concatene usando el punto, imprima la consulta y verifique si funciona.
--


Jonathan Morales Salazar
Ingeniero de Sistemas
www.blonder413.com

Jeison Varilla Mendoza

unread,
Aug 9, 2014, 7:27:15 PM8/9/14
to programa...@googlegroups.com
Toma la consulta...
SELECT * FROM avisos WHERE cod_aviso LIKE '%Buscar%' OR correo_electronico LIKE '%Buscar%' OR titulo_aviso LIKE '%Buscar%' OR comuna LIKE '%Buscar%' 

colocala en tu manejador de BD, mysqlFront, phpmyadmin, administrator sql, etc... y coloca un producto, objeto o palabra que tengas en tu db, y cambiala donde dice buscar, haber como te va....listo

Nicolas Ezequiel Almonacid

unread,
Aug 9, 2014, 7:34:17 PM8/9/14
to programa...@googlegroups.com
amigo, al pegar la consulta directamente en phpmyadmin, me sale asi:
 MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas). (La consulta tardó 0.0010 seg), o sea, vacia

y con esta:
SELECT * FROM avisos WHERE cod_aviso LIKE '1' OR correo_electronico LIKE '%Buscar%' OR titulo_aviso LIKE '%Buscar%' OR comuna LIKE '%Buscar%' , efectivamente me muestra el aviso con el codigo 1

lo de concatenar con puntos seria mas o menos asi la consulta?:
$query="SELECT * FROM avisos WHERE cod_aviso LIKE .$clave. OR correo_electronico LIKE .$clave. OR titulo_aviso LIKE .$clave. OR comuna LIKE .$clave.  ";

Jeison Varilla Mendoza

unread,
Aug 9, 2014, 7:38:33 PM8/9/14
to programa...@googlegroups.com
Jonas, estas conmigo, el problema de nicolas podria ser de SQL, la consulta podria estar mal formulada...LIKE '%$clave%' no creo que sea su problema...mas bien la consulta.... LIKE '%' . $clave .'%' ....

Jonathan Morales Salazar

unread,
Aug 9, 2014, 7:46:26 PM8/9/14
to programa...@googlegroups.com
pruebe con esto: imprímala en pantalla con un exit a ver qué sale
$query="SELECT * FROM avisos WHERE cod_aviso LIKE '%" . $clave . "%' OR correo_electronico LIKE '%" . $clave . "%' OR titulo_aviso LIKE '%" . $clave . "%' OR comuna LIKE '%" . $clave . "%'";

Nicolas Ezequiel Almonacid

unread,
Aug 9, 2014, 8:55:45 PM8/9/14
to programa...@googlegroups.com
estimado jonathan, hice;


$query="SELECT * FROM avisos WHERE cod_aviso LIKE '%" . $clave . "%' OR correo_electronico LIKE '%" . $clave . "%' OR titulo_aviso LIKE '%" . $clave . "%' OR comuna LIKE '%" . $clave . "%'";
exit();

y me arroja:
SELECT * FROM avisos WHERE cod_aviso LIKE '%Buscar%' OR correo_electronico LIKE '%Buscar%' OR titulo_aviso LIKE '%Buscar%' OR comuna LIKE '%Buscar%'SELECT * FROM avisos WHERE cod_aviso LIKE '%Buscar%' OR correo_electronico LIKE '%Buscar%' OR titulo_aviso LIKE '%Buscar%' OR comuna LIKE '%Buscar%'

Jeison Varilla Mendoza

unread,
Aug 9, 2014, 10:23:35 PM8/9/14
to programa...@googlegroups.com
input type="text" name = "buscador"/>
<input type="submit" name="buscar" value="buscar"/>

cuando recibes el $_POST, deberias poner buscador no buscar...por cierto los buscadores trabajalos tipo $_GET o hazlos asincronos con ajax.

Tu error es, $clave=$_POST['buscar'];
deberia ser $clave=$_POST['buscador'];

Saludos.

Nicolas Ezequiel Almonacid

unread,
Aug 9, 2014, 10:49:15 PM8/9/14
to programa...@googlegroups.com
ojojoj fallo mio, se me paso, ahora si me toma el valor que le paso:

SELECT * FROM avisos WHERE cod_aviso LIKE '%a@as%' OR correo_electronico LIKE '%a@as%' OR titulo_aviso LIKE '%a@as%' OR comuna LIKE '%a@as%'Nothing found

pero me sigue sin mostrar los resultados
...

Nicolas Ezequiel Almonacid

unread,
Aug 10, 2014, 5:15:15 PM8/10/14
to programa...@googlegroups.com
Funciono!!!!! finalmente y gracias a la ayuda de todos ustedes maigos logre hacer funcionar el buscador, hice el cambio aca:

  //Ejecutar la Consulta
            $stmt->execute();
            if (!$stmt->rowCount() == 0) { //!= 0
           
y ahora si, ingreso algo y me muestra lo que hay ejejeje, muchas gracias por su ayuda...
...

Jeison Varilla Mendoza

unread,
Aug 10, 2014, 10:19:14 PM8/10/14
to programa...@googlegroups.com
Siempre que hagas un buscador sincrono, hazlo con $_GET, limpia los datos o el criterio de busqueda, INPUT_FILTER, usa libreria para xss, y no insertes datos externos en consultas de forma directa, usa sentencias preparadas y son SELECT * ... Saludos.


--

Nicolas Ezequiel Almonacid

unread,
Aug 10, 2014, 11:04:37 PM8/10/14
to programa...@googlegroups.com
bueno como es algo simple lo que tuve que hacer lo dejare con post por ahora, lo que me mencionas amigo de limpiar los datos,seria por ejemplo:

$clave=htmlspecialchars($_post[''as]); eso me mencionabas cierto?

Nicolas Ezequiel Almonacid

unread,
Aug 11, 2014, 10:33:03 AM8/11/14
to programa...@googlegroups.com
o es asi:
$titulo_aviso=filter_input(INPUT_POST,$titulo_aviso,FILTER_SANITIZE_MAGIC_QUOTES);
              
                $query  ="INSERT INTOblblblblb
                //Preparamos la consulta
                $stmt= $this->con->prepare($query);
                $stmt->bindParam(':titulo_aviso',$_POST['titulo_aviso'],PDO::PARAM_STR);.........//si uso filter_input deberia ser :titulo_aviso,$titulo_aviso,PDO::PARAM_STR

si uso filter_input deberia ser :titulo_aviso,$titulo_aviso,PDO::PARAM_STR cierto?

muchas gracias

        echo
"<p class='text-justify'>".$row['categoria_aviso'<span style=
...
Reply all
Reply to author
Forward
0 new messages