Pregunta:
Fecha: 14-10-2016 08:22:55
(En Español)
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)
Votos: 1 - Respuestas: 5 - Vistas: 15 Compartir en: Google Facebook Twitter LinkedIn Link
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 }}}?>
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