Nueva pregunta

Pregunta:

Fecha: 14-10-2016 08:22:55 (En Español)

CONSULTA MySQL[Resuelta]

Buenas tardes a todos:

Tengo 2 TABLAS

TABLA: usuarios
TABLA: prov_obligaciones_mensuales
Ambas están relacionadas por el campo id_usuario

Ahora bien, he aquí mi pregunta:
Deseo que el usuario pueda realizar BUSQUEDAS en 1, 2, 3 o 4 campos, de manera simultanea o individualmente o combinándolos, para ello hice el siguiente SCRIPT, en el cual si BUSCO por un solo CAMPO, me da un resultado correcto, pero si empiezo a combinar, arroja cualquier resultado:

Les dejo el script (Agradezco cualquier ayuda o sugerencia)

if (isset($_GET['buscar'])){

    $n_movil     = $_GET['n_movil'];
    $id_usuario  = $_GET['id_usuario'];
    $obligación  = $_GET['obligacion'];
    $pf_m        = $_GET['pf_m'];
    $pf_a        = $_GET['pf_a'];
 
    $sql = '';

    if (!empty($n_movil))
    {
        $sql = " AND usuarios.n_movil = " . $n_movil;
    }
    if (!empty($obligacion))
    {
        $sql = " AND prov_obligaciones_mensuales.obligacion = '" . $obligacion . "'";
    }
    if (!empty($pf_m))
    {
        $sql = " AND prov_obligaciones_mensuales.pf_m = " . $pf_m;
    }
    if (!empty($pf_a))
    {
        $sql = " AND prov_obligaciones_mensuales.pf_a = " . $pf_a;
    } 

    $sarch = mysqli_query($con, "SELECT *

                                FROM prov_obligaciones_mensuales, usuarios

                                WHERE usuarios.id_usuario = prov_obligaciones_mensuales.id_usuario" . $sql . " LIMIT 0,100;");

    while($row = mysqli_fetch_assoc($sarch)){?>

               <tr>
                  <td style="width: 5%;"><?php echo $row['n_movil']; ?></td>                
                  <td style="width: 5%;"><?php echo $row['id_usuario']; ?></td>                 	
                  <td><?php echo $row['obligacion']; ?></td>		
                	<td style="width: 5%;"><?php echo $row['pf_m']; ?></td>
                	<td style="width: 5%;"><?php echo $row['pf_a']; ?></td>		
                	<td><?php echo $row['fecha_pago']; ?></td>
                	<td><?php echo $row['importe']; ?></td>		
                	<td><?php echo $row['banco']; ?></td>
                	<td><?php echo $row['sucursal']; ?></td>                	
                  <td style="width: 6%;">
                    <a class="btn btn-default" target='_blank' href="<?php echo $row['comprobante_de_pago']; ?>"><i class="fa fa-search-plus" aria-hidden="true"></i></a> 
                  </td>                  
                  <?php
                        $valor = mysqli_num_rows($sarch);
                        if ($valor < 11)
                            {                       
                        echo "<td style='width: 13%;'>"; 
                        }
                        else{
                        echo '<td>'; 
                            }
                   ?>
                  <a href="" data-toggle="modal" data-target="#modificar" class="btn btn-info" onclick="carga_ajax('<?php echo $row['id_obligaciones_prov']; ?>','modificar','modal_mod_prov_obligaciones.php');"><i class="fa fa-pencil" aria-hidden="true"></i></a> |
                  <a href="?seccion=obligaciones_prov&id_obligaciones_prov=<?php echo $row['id_obligaciones_prov'];?>&borrar=borrar info" class="btn btn-danger"><span class="glyphicon glyphicon-trash"></span></a> | 
                  <a href="?seccion=obligaciones_prov" class="btn btn-warning">Cancelar</a></td>                               
                </tr>
          <?php }}}?>

Etiquetas: MySQL - PHP Votos: 1 - Respuestas: 5 - Vistas: 15 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 15-10-2016 01:34:41 Hola Antuan:

    Prueba a concatenar ('.=') los AND para el valor final de $sql

    Te quedaría así
    // ...
    $sql = '';
    
        if (!empty($n_movil))
        {
            $sql .= " AND usuarios.n_movil = " . $n_movil;
        }
        if (!empty($obligacion))
        {
            $sql .= " AND prov_obligaciones_mensuales.obligacion = '" . $obligacion . "'";
        }
        if (!empty($pf_m))
        {
            $sql .= " AND prov_obligaciones_mensuales.pf_m = " . $pf_m;
        }
        if (!empty($pf_a))
        {
            $sql .= " AND prov_obligaciones_mensuales.pf_a = " . $pf_a;
        } 
    
        $sarch = mysqli_query($con, "SELECT *
    
                                    FROM prov_obligaciones_mensuales, usuarios
    
                                    WHERE usuarios.id_usuario = prov_obligaciones_mensuales.id_usuario" . $sql . " LIMIT 0,100;");
    // ...

    Tal como lo tienes toma unicamente el valor del último if (!empty($xx)) seleccionado
      Votos: 3 - Link respuesta
     
  • Fecha: 15-10-2016 13:07:36 Saludos Antuan: lo mejor que se me ocurre para pensar que pueda servir en un futuro muy cercano y que no tengas mas dolores de cabeza: es crear una vista, simplemente creas un script concatenando los campos de las dos tablas, generas la vista y las consultas se harán directamente por los campos que ya tiene definida las vista, la ventaja es que PHP puede abrir la vista tal y como si fuera una tabla, por tanto no necesitas mas que un select y condicionar el where.

    ATENCIÓN:

    *- recuerda que en el caso de que existan campos duplicados deberás utilizar alias en los campos para que puedan ser utilizados en tu consulta.
    *- No olvides indexar tus tablas por la entidad que relacionara tu JOIN
    *- por ultimo: mi recomendación es que integres un sistema de creación de tablas y vistas, basado en archivos externos, de forma que no tengas que construir los script al momento de instalar tu aplicación.

    espero esto pueda ser de utilidad
    saludos desde Guatemala.
      Votos: 2 - Link respuesta
     
  • Fecha: 16-10-2016 04:22:55 Gente Buenos días:

    Ante todo agradezco a Texema y Antonio por sus aportes.
    Bueno, le comento que he seguido buscándole la vuelta a esto, ya que ni mi script, como los posteados tampoco resuelven el tema ...
    En este nuevo intento he logrado convina 3 de los 4 campos, por lo tanto, asumo que hay un error, el cual no logro detectar.

    Dejo mi script completo (PHP y MySQL):

    <?php
    if (isset($_GET['buscar']))
    
    {
    
        $n_movil        = $_GET['n_movil'];
        $id_usuario     = $_GET['id_usuario'];
        $obligación     = $_GET['obligacion'];
        $pf_m           = $_GET['pf_m'];
        $pf_a           = $_GET['pf_a']; 
    
        $sql_usuario    = '';
        $sql_obligacion = '';
    
        if (!empty($n_movil))
    
        {
            $sql_usuario = " AND USU.n_movil = " . $n_movil;
        }
        if (!empty($obligación))
        {
            if (!empty($sql_obligacion)){$sql_obligacion = " AND ";}
            $sql_obligacion = $sql_obligacion . "OBL.obligacion = '" . $obligación . "'";
        }
        if (!empty($pf_m))
        {
            if (!empty($sql_obligacion)){$sql_obligacion = " AND ";}
            $sql_obligacion = $sql_obligacion . "OBL.pf_m = " . $pf_m;
        }
        if (!empty($pf_a))
        {
            if (!empty($sql_obligacion)){$sql_obligacion = " AND ";}
            $sql_obligacion = $sql_obligacion . "OBL.pf_a = " . $pf_a;
        }
        if (!empty($sql_obligacion)){$sql_obligacion = " WHERE " . $sql_obligacion;}
     
        $sarch = mysqli_query($con, "SELECT *
    
                                    FROM prov_obligaciones_mensuales AS OBL
                                    INNER JOIN usuarios AS USU ON (USU.id_usuario = OBL.id_usuario" . $sql_usuario . ")" .
                                    $sql_obligacion . " ORDER BY USU.n_movil ASC LIMIT 0,100;");
    
        while($row = mysqli_fetch_assoc($sarch)){?>
    
                   <tr>
                      <td style="width: 5%;"><?php echo $row['n_movil']; ?></td>                
                      <td style="width: 5%;"><?php echo $row['id_usuario']; ?></td>                 	
                      <td><?php echo $row['obligacion']; ?></td>		
                    	<td style="width: 5%;"><?php echo $row['pf_m']; ?></td>
                    	<td style="width: 5%;"><?php echo $row['pf_a']; ?></td>		
                    	<td><?php echo $row['fecha_pago']; ?></td>
                    	<td><?php echo $row['importe']; ?></td>		
                    	<td><?php echo $row['banco']; ?></td>
                    	<td><?php echo $row['sucursal']; ?></td>                	
                      <td style="width: 6%;">
                        <a class="btn btn-default" target='_blank' href="<?php echo $row['comprobante_de_pago']; ?>"><i class="fa fa-search-plus" aria-hidden="true"></i></a> 
                      </td>                  
                      <?php
                            $valor = mysqli_num_rows($sarch);
                            if ($valor < 11)
                                {                       
                            echo "<td style='width: 13%;'>"; 
                            }
                            else{
                            echo '<td>'; 
                                }
                       ?>
                      <a href="" data-toggle="modal" data-target="#modificar" class="btn btn-info" onclick="carga_ajax('<?php echo $row['id_obligaciones_prov']; ?>','modificar','modal_mod_prov_obligaciones.php');"><i class="fa fa-pencil" aria-hidden="true"></i></a> |
                      <a href="?seccion=obligaciones_prov&id_obligaciones_prov=<?php echo $row['id_obligaciones_prov'];?>&borrar=borrar info" class="btn btn-danger"><span class="glyphicon glyphicon-trash"></span></a> | 
                      <a href="?seccion=obligaciones_prov" class="btn btn-warning">Cancelar</a>
                      </td>                               
                    </tr>
              <?php }} ?>	
    
      Votos: 1 - Link respuesta
     
  • Fecha: 17-10-2016 04:17:10 hola Antuan

    Solo un consejo

    siempre acostumbra imprimir tu consulta , asi veras si la consulta está bien


    
       $sql_cad = "SELECT * FROM prov_obligaciones_mensuales, usuarios
                                    WHERE usuarios.id_usuario = prov_obligaciones_mensuales.id_usuario ".$sql ." LIMIT 0,100";
    
    
     echo "SQL : ". $sql_cad;
    
     $sarch = mysqli_query($con,$sql_cad);
    
    
      Votos: 0 - Link respuesta
     
  • Fecha: 17-10-2016 18:57:58 Buenas noches a todos

    Agradezco la colaboración de Juan Quinto y Txema con sus aportes.
    Luego de ver y hacer hincapié en los consejos y colaboraciones recibidas, analizando mi código, logro detectar el error que se encontraba en los campos donde no resultaba la consulta MySQL:

    Yo ponía:

        if (!empty($pf_m))
        {
            if (!empty($sql_obligacion)){$sql_obligacion = " AND ";}
            $sql_obligacion = $sql_obligacion . "OBL.pf_m = " . $pf_m;
        }
        if (!empty($pf_a))
        {
            if (!empty($sql_obligacion)){$sql_obligacion = " AND ";}
            $sql_obligacion = $sql_obligacion . "OBL.pf_a = " . $pf_a;
        }


    Pero debería ser:

            if (!empty($pf_m))
            {
              if (!empty($sql_obligacion)){$sql_obligacion = $sql_obligacion . " AND ";}
              $sql_obligacion = $sql_obligacion . "OBL.pf_m = " . $pf_m;
            }
            if (!empty($pf_a))
            {
              if (!empty($sql_obligacion)){$sql_obligacion = $sql_obligacion . " AND ";}
              $sql_obligacion = $sql_obligacion . "OBL.pf_a = " . $pf_a;
            }


    Dejo a continuación el código completo para que se tenga en cuenta a la hora de hacer consultas multiples en varios campos de una o varias tablas (Ideal para Buscadores de Registros).
    Por lo tanto, doy como resuelta la pregunta.

    
            if (isset($_GET['buscar'])) {
    
            $n_movil         = $_GET['n_movil'];
            $id_usuario     = $_GET['id_usuario'];
            $obligación     = $_GET['obligacion'];
            $pf_m             = $_GET['pf_m'];
            $pf_a              = $_GET['pf_a']; 
          
            $sql_usuario        = '';
            $sql_obligacion    = '';
            
            if (!empty($n_movil))
            {
              $sql_usuario = " AND USU.n_movil = " . $n_movil;
            }
            if (!empty($obligación))
            {
              if (!empty($sql_obligacion)){$sql_obligacion = " AND ";}
              $sql_obligacion = $sql_obligacion . "OBL.obligacion = '" . $obligación . "'";
            }
            if (!empty($pf_m))
            {
              if (!empty($sql_obligacion)){$sql_obligacion = $sql_obligacion . " AND ";}
              $sql_obligacion = $sql_obligacion . "OBL.pf_m = " . $pf_m;
            }
            if (!empty($pf_a))
            {
              if (!empty($sql_obligacion)){$sql_obligacion = $sql_obligacion . " AND ";}
              $sql_obligacion = $sql_obligacion . "OBL.pf_a = " . $pf_a;
            }
            if (!empty($sql_obligacion)){$sql_obligacion = " WHERE " . $sql_obligacion;} 
          
            $sarch = mysqli_query($con, "SELECT * " .
                          "FROM prov_obligaciones_mensuales AS OBL " .
                          "INNER JOIN usuarios AS USU ON (USU.id_usuario = OBL.id_usuario" . $sql_usuario . ")" .
                          $sql_obligacion . " LIMIT 0,100;");
          
            while($row = mysqli_fetch_assoc($sarch)){?>
    


    Muchas gracias a todos
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com