php

Tengo un problema que parece haber entrometido durante un día y medio; me está dando noches sin dormir. Tengo una tabla que se muestra a continuación que me gustaría hacer clic en un botón y luego actualizar e insertar datos en la base de datos en consecuencia. enter image description here

La imagen anterior muestra la tabla, cuando sueldo se hace clic, muestra la imagen abajo

enter image description here

Entrar 8600 para Pinnacle debe aumentar el envío total de pinnacle por 8.600 pero nada sucede después. Lo obtengo como éxito pero nada se actualiza o se inserta en las tablas de la base de datos.

enter image description here

El cuadro anterior muestra que los valores se presentan con éxito. Se creó un ajax para apoyar esto como sigue


Debe enviar datos a

php
    
    #remit.php
    /*
        If you are using sessions you need to start a session!
    */
    error_reporting( E_ALL );

    session_start();

    if( empty( $_SESSION['useremail'] ) OR empty( $_SESSION['role'] ) OR $_SESSION['role']=="Admin" ){
        exit( header('Location: index.php') );
    }

    /*
        Check that all fields that are required in the sql have been submitted
    */
    if( isset( 
            $_POST['rid'],
            $_POST['pay'],
            $_POST['currentDate'],
            $_POST['compnyName'],
            $_POST['old_remit'],
            $_POST['debt_owed']
        ) ){

        try{
            
            include_once 'connectdb.php';

            /*
                When inserting, updating multiple tables there is some sense in using a transaction
                so that if one part fails the db is not littered with orphan records
            */
            $pdo-setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $pdo->beginTransaction();

            $remitID            =   $_POST['rid'];
            $new_remit          =   (double)$_POST['pay'];
            $company            =   $_POST['compny_Name'];
            $old_rem            =   (double)$_POST['old_remit'];
            $total_debt         =   (double)$_POST['debt_owed'];
            $current_date       =   $_POST['currentDate'];

            $paid               =   $new_remit +  $old_rem;
            $currentDebt        =   $total_debt - $paid;

            /*
                The sql command should use placeholders rather than embedded variables - the names are arbitrary
            */
            $sql='INSERT INTO `tbl_category_remits` ( `payment_date`, `category`, `remitted` ) 
                VALUES 
            ( :pay_date, :comp, :remit )';
            $stmt=$pdo->prepare( $sql );
            $args=array(
                ':pay_date'        =>  $current_date,
                ':comp'            =>  $company,
                ':remit'           =>  $new_remit
            );
            if( !$stmt->execute( $args )  )echo 'stmt#1 failed';
            
            
            $sql='UPDATE `tbl_category` SET `remitted` =:payment , `debt` =:current_debt WHERE `catid`=:rid';
            $stmt=$pdo->prepare( $sql );
            $args=array(
                ':current_debt'     =>  $currentDebt,
                ':payment'          =>  $paid,
                ':rid'              =>  $remitID
            );
            if( !$stmt->execute( $args ) )echo 'stmt#2 failed';
            
            
            
            /*
                If it all went well, commit these statements to the db
            */
            if( !$pdo->commit() )echo 'commit failed';
            
            
        
        }catch( PDOException $e ){
            /*
                Any problems, rollback the transaction and report issues - 
                not necessarily with the full `getMessage()` ~ perhaps just
                'Error!' etc
            */
            $pdo->rollBack();
            echo $e->getMessage();
        }
    }
?>

No estoy seguro por qué la base de datos parece no actualizarse ni insertarse con nuevos datos. enter image description here

in the above database, no update recorded. Además, el inserto tampoco se realizó en esto. enter image description here

Este es el mayor retraso que tengo en mi código. Le agradecería su ayuda. Gracias.

Pregunta hecha hace 3 años, 4 meses, 26 días - Por debugdragon


2 Respuestas:

  • En tu código PHP, veo un par de posibles errores que podrían estar causando que la base de datos no se actualice ni se inserten nuevos datos correctamente. Aquí te dejo algunas recomendaciones:

    • En el script de AJAX, estás enviando los datos con nombres de clave como `company_Name` y `debt_owed`, pero en el archivo `remit.php` estás intentando acceder a esos valores con nombres de clave incorrectos (`compnyName` y `debt_owed`). Asegúrate de que los nombres de clave coincidan en ambas partes del código.
    • En la sección de verificación de datos POST en `remit.php`, estás verificando si se han enviado `currentDate`, `compnyName`, `old_remit` y `debt_owed`, pero estás usando `$_POST['compny_Name']` y `$_POST['debt_owed']` en tu código. Asegúrate de que los nombres de clave coincidan también aquí.
    • Revisa la línea donde intentas establecer el atributo `PDO::ATTR_ERRMODE` en la variable `$pdo`. Parece que estás haciendo un error tipográfico (`$pdo-setAttribute` en lugar de `$pdo->setAttribute`). Asegúrate de corregir esto para que la configuración de errores funcione correctamente.
    • Asegúrate de que estás obteniendo y manejando adecuadamente los mensajes de error que puedan provenir de las consultas preparadas y las transacciones. Puedes añadir algo de salida de depuración para verificar si las consultas fallan y por qué motivo.

    Además, te recomendaría habilitar la visualización de errores y habilitar registros detallados para ayudar en la depuración. Puedes agregar al inicio de tu script PHP lo siguiente:

    php
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    

    Con estas sugerencias en mente, revisa cuidadosamente tu código y asegúrate de que todas las referencias a las variables y claves POST sean coherentes. Realiza pruebas y verifica los mensajes de error para identificar cualquier problema que pueda estar impidiendo que los datos se inserten o actualicen en la base de datos correctamente. ¡Espero que esta información te ayude a resolver el problema!

    Respondida el Dec 21, 2020 a las 22:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Revisemos tu código y veamos qué podría estar causando el problema:

    1. Código PHP:

    En remit.php, la consulta de actualización para tbl_category establece remitted como $paid pero usa $payment como marcador de posición en la consulta. Asegúrate de que los marcadores de posición coincidan con las variables correctas.

    2. Captura de errores:

    En remit.php, el bloque catch solo imprime el mensaje de error pero no proporciona información detallada sobre la consulta o los datos que fallaron. Agrega más detalles de depuración al bloque catch para identificar la causa exacta del error.

    3. Manejo de transacciones:

    La transacción se inicia y confirma correctamente en remit.php, pero no se maneja correctamente en caso de error. Agrega un bloque finally para garantizar que la transacción siempre se cierre correctamente, incluso en caso de error.

    4. Código JavaScript:

    En el código JavaScript, el valor de amount no se pasa al archivo remit.php a través del objeto de datos. Agrega lo siguiente a la llamada $.ajax:

    javascript
    data: {
      rid: id,
      pay: amount,
      company_Name: companyName,
      old_Remit: oldRemit,
      debt_owed: owed,
      
    },
    

    Código corregido con las modificaciones sugeridas:

    remit.php:

    ```php

    if (empty($SESSION['useremail']) OR empty($SESSION['role']) OR $_SESSION['role'] == "Admin") { exit(header('Location: index.php')); }

    if (isset($POST['rid'], $POST['pay'], $POST['currentDate'], $POST['compnyName'], $POST['oldremit'], $POST['debtowed'])) { try { includeonce 'connectdb.php';

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->beginTransaction();
    
    $remitID = $_POST['rid'];
    $new_remit = (double)$_POST['pay'];
    $company = $_POST['compny_Name'];
    $old_rem = (double)$_POST['old_remit'];
    $total_debt = (double)$_POST['debt_owed'];
    $current_date = $_POST['currentDate'];
    
    $paid = $new_remit + $old_rem;
    $currentDebt = $total_debt - $paid;
    
    $sql = 'INSERT INTO `tbl_category_remits` ( `payment_date`, `category`, `remitted` ) 
                VALUES 
            ( :pay_date, :comp, :remit )';
    $stmt = $pdo->prepare($sql);
    $args = array(
      ':pay_date' => $current_date,
      ':comp' => $company,
      ':remit' => $new_remit
    );
    if (!$stmt->execute($args)) echo 'stmt<h2>1 failed';</h2>
    $sql = 'UPDATE `tbl_category` SET `remitted` =:paid, `debt` =:current_debt WHERE `catid`=:rid';
    $stmt = $pdo->prepare($sql);
    $args = array(
      ':paid' => $paid,
      ':current_debt' => $currentDebt,
      ':rid' => $remitID
    );
    if (!$stmt->execute($args)) echo 'stmt<h2>2 failed';</h2>
    if (!$pdo->commit()) echo 'commit failed';
    

    } catch (PDOException $e) { $pdo->rollBack(); echo $e->getMessage(); } finally { $pdo = null; } } ?>

    
    
    Código JavaScript:
    
    
    javascript

    function payCompany(id, companyName, owed, oldRemit) { swal("Enter Amount:", { title: companyName, buttons: true, closeModal: true, content: "input", }).then((amount) => { if (amount === "") { swal("Oops!! You need to enter value."); return false; } else { $.ajax({ type: 'POST', url: 'remit.php', data: { rid: id, pay: amount, companyName: companyName, oldRemit: oldRemit, debt_owed: owed, }, success: function (data) { swal(Paid: ${amount} to ${companyName}); }, error: function (data) { swal(Error remitting: ${amount} to ${companyName}); }, }); } }); } ```

    Pruebas:

    • Asegúrate de que la conexión a la base de datos en `connectdb.php` sea correcta.
    • Verifica que el código JavaScript se ejecute correctamente y pase el valor de `amount` a `remit.php`.
    • Depura el código PHP en `remit.php` utilizando declaraciones `var_dump` o `echo` para identificar cualquier problema con las consultas o los datos.
    • Utiliza la pestaña Red en las Herramientas de desarrollo del navegador para observar las solicitudes AJAX y las respuestas del servidor.

    Espero que esto te ayude a resolver el problema. No dudes en preguntar si tienes más preguntas.

    Respondida el Dec 21, 2020 a las 22:35 - por Gemini

    Votos positivos: 0 | Votos negativos: 0