Nueva pregunta

Pregunta:

Fecha: 05-05-2017 07:17:12 (En Español)

¿Cómo hacer una consulta de una tabla con llaves foráneas de un determinado id?[No resuelta]

Cordial saludos, el problema que tengo es sobre una consulta. Quiero que me busque todos los abonos de un prestamo en especifico. La consulta que tengo me arroja son todos los abonos de todos los prestamos, la verdad no se cual es el error logico.




Este es el archivo prestamos.php donde lista todos los prestamos y tiene un enlace donde dice "ver abonos" que es donde me lleva al archivo abono_esepcifico.php donde hace el proceso de mostrar solo los abonos del determinado prestamos y me lleva al listado de los abonos al archivo abonos.php

Este es el archivo prestamos.php:

<?php

    require('../conexion.php');
    include('../menu/menu.php');
    $con=Conectar();

    //recibimos variable que llegan por metodo post o en el arreglo post
    extract ($_REQUEST);
    if (!isset ($_REQUEST['x'])) // si se desconoce la variable x se asigna el 
    valor de 0
    $x=0;

    $sql="SELECT id_prestamo, pre_cliente, fecha, monto, forma_de_pago, fiador, 
    cliente.cedula,cliente.nombre, cliente.apellido from prestamo
    inner join cliente
    on prestamo.pre_cliente=cliente.id_cliente
    ORDER BY id_prestamo ASC";

    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Prestamos</title>
    <meta name="viewport" content="wid=device-wid, user-scalable=no, initial-
    scale=1.0, minium-scale=1.0">

    </head>
    <body>
    <div class="container col-lg-12" >
    <br>
    <div class="panel panel-success">
    <div class="panel-heading" align="center"><h3>PRESTAMOS</h3></div>
    <div class="panel-body">

    <div class="row" align="center">
    <button type="button" class="btn btn-success" data-toggle="modal" data-
    target="#nuevo">
    Nuevo prestamo
    </button></div>
    <br>

    <!--      clase para colocar tabla responsive-->
    <div class="table-responsive">
    <table id="grid" class="table table-hover table-condensed table-bordered 
    nowrap dt-responsive" cellpadding="0">
    <thead>
    <tr class="active">

    <th>Cedula</th>
    <th>Cliente</th>
    <th>Monto $ </th>
    <th>No Cuotas</th>
    <th>Interes %</th>
    <th>Fecha Prestamo</th>
    <th>Fiador</th>
    <th>Forma de pago</th>
    <th>Saldo actual</th>
    <th>Abonos</th>
    <th>Opciones</th>

    </tr>
    </thead>
    <?php

    $stmt=$con->prepare($sql);
    $resultado=$stmt->execute();
    $rows=$stmt->fetchAll(\PDO::FETCH_OBJ);

    foreach ($rows as $prestamo) {
             
    ?>

    <tr>
    <td><?php echo $prestamo->cedula?></td>
    <td><?php echo $prestamo->nombre." ".$prestamo->apellido?></td>
    <td><?php echo $prestamo->monto?></td>
    <td></td>
    <td></td>
    <td><?php echo $prestamo->fecha?></td>
    <td><?php echo $prestamo->fiador?></td>
    <td><?php echo $prestamo->forma_de_pago?></td>
    <td></td>
    
    // este es el enlace que me lleva al archivo para hacer el proceso del query

    <td><a href="../abonos/abono_especifico.php?id_prestamo=<?php echo 
    $prestamo->id_prestamo ?>">Ver abonos</a>

    &nbsp;
    <button type="button" class="btn btn-success btn-sm"><a 
    href="../abonos/frm_abonar.php?id_prestamo=<?php echo $prestamo->id_prestamo 
    ?>" style="text-decoration: none; color:#000;" >Abonar</button></a>
    </td>
    <td align="center"><a href="frm_editar.php?id_prestamo=<?php echo $prestamo-
    >id_prestamo?>"><span class="glyphicon glyphicon-check" title="Editar">
    </span></a>
    &nbsp;
    <a href="eliminar.php?id_prestamo= <?php echo $prestamo->id_prestamo?>">
    <span class="glyphicon glyphicon-remove" title="Eliminar"></span></a></td>
    <?php
    }
    ?>
    </tr>
    </table>
    </div>

    <div align="center">
    <br /><br />

    <?php
    if ($x==1) {
    echo '<div class="alert alert-success alert-dismissable" data-
    dismiss="alert" style="width:300px">Se actualizado el prestamo 
    correctamente</div>';
    }
    if ($x==2) {
    echo '<div class="alert alert-danger alert-dismissable" data-dismiss="alert" 
    style="width:300px">Problemas al actualizar el prestamo</div>';
    }
    if ($x==3) {
    echo '<div class="alert alert-success alert-dismissable" data-
    dismiss="alert" style="width:300px">Se ha eliminado el prestamo 
    correctamente</span>';
    }
    if ($x==4) {
    echo '<div class="alert alert-success alert-dismissable" data-
    dismiss="alert" style="width:300px">Problemas al eliminar el prestamo,  
    Primero elimina el prestamo</div>';
    }
    if ($x==5){
    echo '<div class="alert alert-success alert-dismissable" data-
    dismiss="alert" style="width:300px">Se ha agregado el prestamo correctamente 
    </div>';
    }
    if ($x==6){
    echo '<div class="alert alert-success alert-dismissable" data-
    dismiss="alert" style="width:300px">Problemas al agregar el prestamo</div>';
    }
    ?>
    </div>       
    </div>
    </div> 
    </div>
    </body>
    </html>


Este es el archivo donde realizo las consulta:

abono_especifico.php

<?php

    //archivo para la conexion
    require "../conexion.php";
    $con=Conectar();

    $prestamo=$_REQUEST['id_prestamo'];

    $sql="SELECT a.id_abono, a.abo_prestamo, a.fecha, a.cantidad, a.observacion, 
    p.pre_cliente, c.cedula,c.nombre, c.apellido from abono a, prestamo p, 
    cliente c
    where a.abo_prestamo='$prestamo'
    and p.pre_cliente=c.id_cliente
    ORDER BY id_abono ASC";


    $resultado=$con->prepare($sql);

    $resultado->execute();


    if ($resultado){
    header ("location: abonos.php?x=7");//x=5 abonos encontrado
    }else{
    header ("location: abonos.php?x=8");//x=6 error al buscar el abono
    }
    $resultado->closeCursor();
    ?>


Este es el archivo que me lista los abonos, abonos.php

<?php

    require('../conexion.php');
    include('../menu/menu.php');
    $con=Conectar();

    //recibimos variable que llegan por metodo post o en el arreglo post
    extract ($_REQUEST);
    if (!isset ($_REQUEST['x'])) // si se desconoce la variable x se asigna el 
    valor de 0
    $x=0;

    $sql="SELECT a.id_abono, a.abo_prestamo, a.fecha, a.cantidad, a.observacion, 
    p.pre_cliente, c.cedula,c.nombre, c.apellido from abono a, prestamo p, 
    cliente c
    where a.abo_prestamo=p.id_prestamo
    and p.pre_cliente=c.id_cliente
    ORDER BY id_abono ASC";

    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Abonos</title>
    <meta name="viewport" content="wid=device-wid, user-scalable=no, initial-
    scale=1.0, minium-scale=1.0">
    </head>

    <body>
    <div class="container" >
    <br>
    <div class="panel panel-success">
    <div class="panel-heading" align="center"><h3>ABONOS</h3></div>
    <div class="panel-body">
    <div class="table-responsive">
    <table id="grid" class="table  table-bordered  table-hover table-condensed">
    <thead>
    <tr class="active">
    <th>Cedula</th>
    <th>Cliente</th>
    <th>Descripcion</th>
    <th>Fecha</th>
    <th>Abono $</th>
    <th >Saldo $</th>
    <th>Opciones</th>
    </tr>
    </thead>

    <?php
    $stmt=$con->prepare($sql);
    $resultado=$stmt->execute();
    $rows=$stmt->fetchAll(\PDO::FETCH_OBJ);

    foreach ($rows as $abono) {
    ?>

    <tr>
    <td><?php echo $abono->cedula?></td>
    <td><?php echo $abono->nombre. " ".$abono->apellido?></td>
    <td><?php echo $abono->observacion?></td>
    <td><?php echo $abono->fecha?></td>
    <td><?php echo $abono->cantidad?></td>
    <td></td>

    <td align="center"><a href="frm_editar.php?id_prestamo=<?php echo $prestamo-
    >id_prestamo?>"><span class="glyphicon glyphicon-check" title="Editar">
    </span></a>
    &nbsp;

    <a href="eliminar.php?id_prestamo= <?php echo $prestamo->id_prestamo?>">
    <span class="glyphicon glyphicon-remove" title="Eliminar"></span></a></td>

    <?php
    }
    ?>

    </tr>
    </table>
    <div align="center">
    <br /><br />

    <?php
    if ($x==1) {
    echo '<span style="color:black">Se actualizado el Abono 
    correctamente</span>';
    }
    if ($x==2) {
    echo '<span style="color:black">Problemas al actualizar el Abono</span>';
    }
    if ($x==3) {
    echo '<span style="color:black">Se ha eliminado el Abono 
    correctamente</span>';
    }
    if ($x==4) {
    echo '<span style="color:black">Problemas al eliminar el Abono</span';
    }
    if ($x==5){
    echo '<span style="color:black">Se ha agregado el Abono 
    correctamente</span';
    }
    if ($x==6){
    echo '<span style="color:black">Problemas al agregar el Abono</span>';
    }
    if ($x==7){
    echo '<span style="color:black">Abonos encontrados</span>';
    }
    if ($x==8){
    echo '<span style="color:black">Problema al encontrar los abonos</span>';
    }
    ?>

    </div>
    </div>
    </div>
    </div>
    </div>
    
    </body>
    </html>

Por ultimo dejo el archivo de conexion.php

    <?php

    function Conectar(){
	$conn=null;
	$host='localhost';
	$db='prestamos';
	$us='root';
	$pass='';

	try {
		$conn= new PDO('mysql:host='.$host.';dbname='.$db, $us, $pass);
	} catch (PDOException $e) {
		echo ":( Error al conectar a la base de datos".$e;
		exit;
	}
	return $conn;
    }

    ?>

Se les agradecería una pronta respuesta.


Etiquetas: MySQL - MySQL Desarrollo - PHP - PHP PDO - phpMyAdmin - Pregunta Votos: 0 - Respuestas: 3 - Vistas: 22 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 06-05-2017 09:12:59 Hola Juan
    He mirado por arriba el codigo.

    Te voy a dar unos tips para que investigues un poco y que te puedan guiar para resolver el problema con las buenas prácticas del uso del lenguaje.

    1. Haz una prueba en PHPMYADMIN de la consulta SELECT para saber si el resultado que te arroja es el esperado.

    2. Es desaconsejado el uso de extract() según la doc oficial de PHP hablan de un problema de su uso "Cuidado con la función extract de php"

    3. Es desaconsejado el uso de $_REQUEST, evitar las superglobales es mas saludable utilizar GET/POST/Cookie según corresponda, en tu caso seria $_GET

    4. Creo que no se deberia utilizar header() en tu proyecto ya que no cumple con su propósito. Explicación del uso de header () con locaction (Es para redireccionamiento). En tu caso deberia ser require_once() o include_once() según sea el caso. Diferencias entre include, include_once, require y require_once

    Teniendo en cuenta todo ello habría que reescribir todo el codigo.

    Espero que te sirva como punto de partida.

    Este es mi punto de vista, alguien más podría hacer más luz sobre el tema

    Saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 10-05-2017 03:39:40 Hola, en tu caso agregaría 2 tablas más.

    Abonos --> id int primary key, descripcion varchar(30)
    prestamos --> id int primary key, descripcion varchar(30)

    abonosxprestamos --> id int auto_increment, id_abono int (fk de abonos), id_prestamo (fk de prestamos)
    primary key(id, id_abono, id_prestamo)

    De esa forma puedes hacer un select seleccionando los abonos de determinado prestamo
    por ej...

    select id_abono from abonosxprestamos where id_prestamo = ...

    Eso si, deberías modificar un poquito el php.
    Pero no tendrías problemas! Un saludo
      Votos: 1 - Link respuesta
     
  • Fecha: 10-05-2017 09:24:37 Hola Juan. Mirando el código que estas presentando, principalmente en el sql, noto que no estas usando el JOIN para unir las tablas en las consultas, como si lo haces en el archivo: prestamos.php.

    Un dato que resulta importante es con que motor de bases de datos estas trabajando. Si estas trabajando con MySql, como comento Walter, es recomendable realizar en PHPMYADMIN o en WORKBENCH las consultas a modo de QUERY, con el fin de verificar que nos presente los datos que estamos necesitando.

    Verifica que la base de datos la tengas bien normalizada, esto quiere decir que contenga las tablas necesaria para dichas consultas.

    Según entiendo tu consulta tendría que ser algo similar a esta:
    $sql="SELECT a.id_abono, a.abo_prestamo, a.fecha, a.cantidad, a.observacion, 
        p.pre_cliente, c.cedula,c.nombre, c.apellido from abono a
        join prestamo p on a.abo_prestamo=p.id_prestamo 
        join cliente c on p.pre_cliente=c.id_cliente
        where a.abo_prestamo='$variable'
        ORDER BY id_abono ASC";


    Saludos.
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com