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.
La imagen anterior muestra la tabla, cuando sueldo se hace clic, muestra la imagen abajo
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.
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.
in the above database, no update recorded. Además, el inserto tampoco se realizó en esto.
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 paratbl_category
estableceremitted
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 bloquecatch
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 bloquecatch
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 bloquefinally
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 archivoremit.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; } } ?>
javascriptCódigo 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