Comunidad de diseño web y desarrollo en internet online

En una búsqueda mostrar coincidencias cumpliendo una condicion

Citar            
MensajeEscrito el 10 May 2019 08:31 am
Hola a tod@s
Tengo un formulario, con un array con distintos campos, relleno estos, realizo la búsqueda y me aparecen los resultados, sin son más de lo establecido pues voy pasando de página, hasta ahí todo bien, pero quiero que al pinchar en un enlace, además de hacerme la búsqueda por ese valor quiero que tenga en cuenta una condición, la búsqueda me la hace correctamente, me muestra los resultados según el valor[7] y la condición, que el campo valor[6] NO tiene que estar vacío, pero al pasar de página me dice que no se han encontrado resultados
Este es el enlace

Código HTML :

<a href="informatica.php?codigo=OF&href=#galerias" target="informatica">Codigo</a>

Este es el código con el que realizo las búsquedas

Código PHP :

 <?php
     include_once 'informatica_PHP/array.php';
     include_once 'informatica_PHP/paginar.php';         

     if (isset($_GET['p']))
       $p = $_GET['p'];      
     else
       $p = 1;

     $t = '';
    if (isset($_GET['t']))
       $t = $_GET['t'];    
    else if(isset($_GET['codigo']))        
       $t = $_GET['codigo'];             
     else if(isset($_POST['TxtBuscar']))
       $t = $_POST['TxtBuscar'];
      
 ?> 
 <?php        

    if (isset($t) && !empty($t))
     {       
       $coincidencias = array();         
            
        foreach($datos as $valor) {
            
            if (!empty($_POST['TxtBuscar'])) {      
                                  
               $cadena = $valor[0];  //busca por el input                        
            }
//Aquí es donde le digo que me busque por el campo código y me muestre los resultados que cumplan la condición de que el campo $valor[6] NO tenga contenido y lo hace correctamente, pero el problema viene al cambiar de página, que entonces me dice que no se han encontrado resultados
            elseif (!empty($_GET['codigo']) && $valor[6] != "" ) {                  
                                  
               $cadena = $valor[7];  //busca por el campo codigo                  
            }            
             
        $encontrar_coincidencia = stripos($cadena, $t); 
       
          if ($encontrar_coincidencia !== false) {
                    
                 $coincidencias[] = $valor;                                                              
             }          
         }
               
     }    
    else 
       $coincidencias = $datos;               

 ?>
  <?php
// Esta es la función que paso al siguiente archivo paginar.php donde hago la paginación y doy formato a los resultados
     //Aqui pongo el número de elementos que queremos que aparezca por página, en este caso 7
     paginar($coincidencias, 7, $p, $t);    
    
 ?>
 <?php
//Este es el archivo paginar. php donde recojo las variables y trabajo con ellas
function paginar($datos, $l, $p, $t) {

Por pedromir

29 de clabLevel



 

mozilla
Citar            
MensajeEscrito el 10 May 2019 01:57 pm
Si no hay resultados pueden pasar una cuantas cosas. lo mas probable

- Realmente no hay resultados: tip, imprime el SQL por pantalla y verifica directamente en tu BD
- No se pasa alguno de los parametros: tip, usa el inspector de Chrome (o del navegador que uses) y mira los parametros que se le han pasado a la pagina ... son los que esperas?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 13 May 2019 03:13 pm
No es una BD es un array multidimensional, la búsqueda la hace perfectamente, pues me muestra los resultados, el problema está a la hora de paginar, pues al pasar de página, pierde esos resultados, pues no los he pasado de ninguna manera a las siguientes páginas y ese es el problema, que no se como pasarlos, si quito la condición, entonces si puedo pasar de página sin ningún problema.
Otra solución, pero tampoco se como hacerlo, mi nivel de php es bastante básico, es que haga la búsqueda por los dos campos, pasar dos variables, en vez de una en el enlace

Código HTML :

<a href="informatica.php?importe=4&codigo=OF>

Y en el archivo php pues añadir la variable importe

Código PHP :

else if(isset($_GET['importe'])) 
 $t = $_GET['importe'];
else if(isset($_GET['codigo'])) 
 $t = $_GET['codigo'];

De esta forma me buscaría en el campo $valor[6] el número 4 y en el campo $valor[7] el texto OF, lo que es un formulario, buscar por varios campos, pero en un array no en una BD

Por pedromir

29 de clabLevel



 

mozilla
Citar            
MensajeEscrito el 23 May 2019 02:53 pm
Se hace algo difícil entender el código así... podrías mostrar el contenido del archivo 'informatica_PHP/array.php';?

Por mchojrin

37 de clabLevel



Genero:Masculino  

Ayudo desarrolladores PHP a acelerar su llegada a Sr.

chrome
Citar            
MensajeEscrito el 27 May 2019 06:38 am
Te pongo el código que utilizo para paginar y que se encuentra en el archivo paginar.php y donde recojo todas las variables para mostrar el resultado de las distintas búsquedas y donde hago la páginación, estas variables vienen del archivo informatica.php que es donde realizo dichas búsquedas.
El archivo informatica_PHP/array.php' es donde está el array que es multidimensional.
El problema está en crear una variable en el archivo informatica.php con la búsqueda y cumpliendo la condición y esta variable pasarla al archivo paginar.php o realizar una búsqueda por dos campos y pasar la variable con dicho resultado, que esto también me serviría
Te pongo el ejemplo de como hago para ir a la siguiente página o a la última

Código PHP :

function paginar($datos, $l, $p, $t) {
 // DEFINIMOS LA CANTIDAD DE PÁGINAS
     $paginas = ceil(count($datos) / $l);
     // CONDICION DE INICIO
     $inicio = ($p-1)*$l;
     // CONDICION DE FINAL
     $final = $p*$l;
 if ($p<$paginas){
      echo "<li>&nbsp;<a href=\"informatica.php?p=" .$p+1) . "&t=$t">Siguiente »</a></li>";      
      echo  "<li>&nbsp;&nbsp;|&nbsp;<a href=\"informatica.php?p=" . $paginas . "&t=$t">Última [" . $paginas . "] »<b>|</b></a></li>";
}
}   

Por pedromir

29 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 May 2019 01:39 pm
Viendo nuevamente tu código:

Código PHP :

else if(isset($_GET['importe'])) 
 $t = $_GET['importe'];
else if(isset($_GET['codigo'])) 
 $t = $_GET['codigo'];


Noto algo:

Siempre te quedas con un criterio para hacer la búsqueda (en la variable $t)... o bien usas el importe o bien usas el código...

¿Por qué no usas un array de filtro?

Algo como:

Código PHP :

 
$filtros = [];

if(isset($_GET['importe'])) { 
 $filtros['importe'] => $_GET['importe'];
}

if (isset($_GET['codigo'])) {
 $filtros['codigo'] = $_GET['codigo'];
}


Y luego haces una función que reciba un elemento del array, lo compare contra todos los filtros y sólo devuelva true cuando se cumplen todos.

Esa función la puedes usar dentro de un array_filter y con eso obtendrás todas las coincidencias posibles. Te dejo este link por si necesitas ayuda sobre funciones anónimas en PHP.

Por mchojrin

37 de clabLevel



Genero:Masculino  

Ayudo desarrolladores PHP a acelerar su llegada a Sr.

chrome
Citar            
MensajeEscrito el 28 May 2019 09:06 pm
Estoy empezando con el php, asi que mi nivel es bastante básico y lo de los filtros se me escapa, todavía no he llegado a ello, he mirado las paginas que me has dicho pero no me aclaro, no encuentro la forma de hacer lo que me dices

Por pedromir

29 de clabLevel



 

mozilla
Citar            
MensajeEscrito el 29 May 2019 03:37 pm
Ok... si quieres ver ejemplos más detallados y explicados te puede interesar https://academy.leewayweb.com/productos/php-aprender-mediante-ejemplos/.

Ahora, respecto de tu problema:

Lo que estoy diciendo es que, si usas una única variable para el filtro ($t en tu caso), es imposible (bueno, extremadamente difícil :p) lograr incorporar más de un criterio de filtro como quieres hacer.

Al usar una estructura if/elseif estás haciendo que los filtros sean mutuamente excluyentes (Si aplica uno no aplica el otro y viceversa).

Si lo haces como yo sugiero (un array de filtros), lo que te queda luego es recorrer el arreglo y, por cada elemento, validar que cumpla con todos y cada uno de los filtros definidos en el arreglo.

Lo del array_filter y lo demás es sólo un modo de escribirlo más concisa/eficientemente, no te líes con eso si no lo tienes tan claro, lo importante es la idea que te mencioné.

Por mchojrin

37 de clabLevel



Genero:Masculino  

Ayudo desarrolladores PHP a acelerar su llegada a Sr.

chrome
Citar            
MensajeEscrito el 03 Jun 2019 03:52 pm
El código que he hecho, no me termina de funcionar, porque me hace la búsqueda, pero me muestra los resultados en cuanto cumple una condición, aunque el resto no las cumpla, y debe de cumplir todas las condiciones, no estoy utilizando array_filter

Por pedromir

29 de clabLevel



 

mozilla
Citar            
MensajeEscrito el 03 Jun 2019 10:07 pm
Pues podrías ciclar sobre los filtros y apenas detectas uno que no se cumple romper el ciclo.

Algo como:

Código PHP :

$matches  = true;
foreach ( $filtros as $k => $v ) {
    if ( $row[$k] != $v ) {
         $matches = false;
         break;
    }
}

if ( $matches ) {
   // Se cumplen todas las condiciones :)
}

Por mchojrin

37 de clabLevel



Genero:Masculino  

Ayudo desarrolladores PHP a acelerar su llegada a Sr.

chrome
Citar            
MensajeEscrito el 04 Jun 2019 09:05 am
Seria algo asi entonces

Código PHP :

$listado = array(  
array('Ana', 'Pelaez', 'Informatica', 'Madrid'), 
array('Ana', 'Garcia', 'Contabilidad', 'Sevilla'), 
array('Ana', 'Lopez', 'Contabilidad', 'Madrid'), 
);

$matches  = true;
$coincidencias=array();
foreach($listado as $index=>$row){
foreach ( $filtros as $index => $v ) {
    if ( $row[$index] != $v ) {
         $matches = false;
         break;
    }
}
}

if ( $matches ) {   
   // Se cumplen todas las condiciones :)
   echo $coincidencias;
}

Por pedromir

29 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jun 2019 03:58 pm
No exactamente... algo así:

Código PHP :

$listado = [ 
   ['Ana', 'Pelaez', 'Informatica', 'Madrid'], 
   ['Ana', 'Garcia', 'Contabilidad', 'Sevilla'], 
   ['Ana', 'Lopez', 'Contabilidad', 'Madrid'], 
];

$coincidencias = [];

foreach($listado as $row) {
 $matches  = true;
 foreach ( $filtros as $index => $v ) {
    if ( $row[$index] != $v ) {
         $matches = false;

         break;
    }
 }
 if ( $matches ) {   
   // Se cumplen todas las condiciones :)
   $coincidencias[] = $row;
 }
}
// Mostrar las coincidencias

Por mchojrin

37 de clabLevel



Genero:Masculino  

Ayudo desarrolladores PHP a acelerar su llegada a Sr.

chrome
Citar            
MensajeEscrito el 05 Jun 2019 08:44 am
Con tu código no consigo que me haga las búsquedas, así que lo he modificado y con este si me hace la búsqueda, pero el problema, es que me busca el texto introducido en todo el array, me explico, si yo en curso escribo Ana, como ese texto está en el array pues me muestra todas las Anas, cuando no me deberia mostar ningún resultado, ya que en curso, que es donde lo tiene que buscar no existe ese valor

Código PHP :

$coincidencias = [];
foreach($listado as $index=>$row){
     foreach($row as $columna){
           foreach($filtros as $buscar_texto){
             if(!isset($coincidencias[$index]) and stripos( $columna,$buscar_texto )!==false){
                  $coincidencias[$index]=$row;
                  break;
             }
           }
     } 
}
var_dump($coincidencias);

Por pedromir

29 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Jun 2019 02:55 pm
El problema es que estás haciendo la comparación por todas las columnas...

Lo que debes hacer es ciclar, primero sobre el arreglo de filas y, por cada una, ciclar sobre el arreglo de filtros de modo de obtener el nombre de la columna y el valor buscado para poder realizar correctamente la comparación:

Código PHP :

$coincidencias = [];
foreach($listado as $index=>$row) {
    foreach($filtros as $columnaABuscar => $buscar_texto) {
             if( !isset($coincidencias[$index]) and stripos( $row[$columnaABuscar], $buscar_texto )!==false){
                  $coincidencias[$index]=$row;

                  break;
             }
     } 
}

var_dump($coincidencias);

Por mchojrin

37 de clabLevel



Genero:Masculino  

Ayudo desarrolladores PHP a acelerar su llegada a Sr.

chrome
Citar            
MensajeEscrito el 05 Jun 2019 10:57 pm
No funciona como debiera, no busca que se cumplan todas las condiciones, sólo que cumpla una, si cumple la primera, pues muestra los resultados, sin comprobar si cumple la segunda también y si no cumple la primera pasa a la segunda y si cumple esta pues muestra los resultados, sin tener en cuenta que no ha cumplido la primera, ya empiezo a dudar que se pueda hacer lo que yo quiero, reconozco que mi nivel de php es bastante básico

Por pedromir

29 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.