Page 1 sur 1

Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 06:52
par chegmarco
Bonjour.

J'ai un casse-tête au niveau de ma requête [C]mysqli-prepared[/C] dans mon Code PHP ci-dessous.

Pourtant, je reçois bien afficher le Message à succès Money Deposited:

Image

Le souci, c'est que je n'arrive pas du tout à réussir l'insertion dans la Base de Données:

Image

Code : Tout sélectionner

<?php session_start(); include('conf/config.php'); include('conf/checklogin.php'); check_login(); $admin_id = $_SESSION['admin_id']; //register new account if (isset($_POST['deposit'])) { $tr_code = $_POST['tr_code']; $account_id = $_GET['account_id']; $acc_name = $_POST['acc_name']; $account_number = $_GET['account_number']; $acc_type = $_POST['acc_type']; //$acc_amount = $_POST['acc_amount']; $tr_type = $_POST['tr_type']; $tr_status = $_POST['tr_status']; $client_id = $_GET['client_id']; $client_name = $_POST['client_name']; $client_national_id = $_POST['client_national_id']; $transaction_amt = $_POST['transaction_amt']; $client_phone = $_POST['client_phone']; //$acc_new_amt = $_POST['acc_new_amt']; //Notication $notification_details = "$client_name Has Deposited Ksh $transaction_amt To Bank Account $account_number"; //Insert Captured information to a database table $query = "INSERT INTO iB_Transactions (tr_code, account_id, acc_name, account_number, acc_type, tr_type, tr_status, client_id, client_name, client_national_id, transaction_amt, client_phone) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; $notification = "INSERT INTO iB_notifications (notification_details) VALUES (?)"; $stmt = $mysqli->prepare($query); $notification_stmt = $mysqli->prepare($notification); //bind paramaters $rc = $notification_stmt->bind_param('s', $notification_details); $rc = $stmt->bind_param('ssssssssssss', $tr_code, $account_id, $acc_name, $account_number, $acc_type, $tr_type, $tr_status, $client_id, $client_name, $client_national_id, $transaction_amt, $client_phone); $stmt->execute(); $notification_stmt->execute(); //declare a varible which will be passed to alert function if ($stmt && $notification_stmt) { $success = "Money Deposited"; } else { $err = "Please Try Again Or Try Later"; } } if(isset($_POST['deposit'])) { $account_id = $_GET['account_id']; $acc_amount = $_POST['acc_amount']; //Insert Captured information to a database table $query="UPDATE iB_bankAccounts SET acc_amount=? WHERE account_id=?"; $stmt = $mysqli->prepare($query); //bind paramaters $rc=$stmt->bind_param('si', $acc_amount, $account_id); $stmt->execute(); //declare a varible which will be passed to alert function if($stmt ) { $success = "Money Deposited"; } else { $err = "Please Try Again Or Try Later"; } } ?>
Où me suis-je planté je l'ignore car j'ai beau cherché mais tout semble parfait de mon côté et pourtant les données ne sont aucunement insérées.

Aidez-moi donc à me corriger et réussir mes insertion s'il vous plaît.

Re: Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 13:54
par ynx
Bonjour,

Au lieu d'afficher le message de confirmation si les requêtes sont bien préparées, il faudrait plutôt l'afficher si les requêtes sont bien exécutées. Il faut donc vérifier le retour des fonctions execute() au lieu de vérifier l'état des variables $stmt ou $notification_stmt.

Si une requête ne s’exécute pas correctement, on peut afficher le message d'erreur correspondant :
$query = 'INSERT INTO ...';
$stmt = $mysqli->prepare($query);
$stmt->bind_param('...', ...);

if ($stmt->execute()) {
    $success = "Money Deposited";
} else {
    $err = 'Erreur SQL : ' . $stmt->error;
}

Re: Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 15:26
par chegmarco
Merci pour la réponse. Mais quand, je modifie en:

Code : Tout sélectionner

if ($stmt->execute()) { $success = "Money Deposited"; } else { $err = 'Erreur SQL : ' . $stmt->error; }
Je reçois le même retour d'erreur avec succès mais toujours sans l'insertion dans la BDD et sans l'affichage sur la page web de la moindre erreur SQL:

Image

Re: Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 16:07
par ynx
Et la 2e requête insert notification ?
Je ne sais pas comment tu utilises les variables $success et $err à l'affichage. Le temps de corriger les erreurs, tu peux utiliser die() pour afficher les messages :
if ($stmt->execute()) {
    if ($notification_stmt->execute()) {
        $success = "Money Deposited";
    } else {
        $err = "Please Try Again Or Try Later";
        die('Erreur SQL : ' . $notification_stmt->error);
    }
} else {
    $err = "Please Try Again Or Try Later";
    die('Erreur SQL : ' . $stmt->error);
}

Re: Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 16:54
par chegmarco
Je reçois à présent l'erreur:
Erreur SQL : Field 'acc_amount' doesn't have a default value
,

quand j'ajoute le mysqli->error comme vous venez de me le conseiller:

Code : Tout sélectionner

if ($stmt->execute()) { if ($notification_stmt->execute()) { $success = "Money Deposited"; } else { $err = "Please Try Again Or Try Later"; die('Erreur SQL : ' . $notification_stmt->error); } } else { $err = "Please Try Again Or Try Later"; die('Erreur SQL : ' . $stmt->error); }
Mais le souci c'est que le champs acc_amount du même Utilisateur dont on fait le Deposit, dans mon code est dans la Table iB_bankAccounts de la même BDD contrairement aux autres champs et informations qui sont dans la Table iB_Transactions de la Base de données, et donc, j'ai fait ceci:

Code : Tout sélectionner

if (isset($_POST['deposit'])) { $tr_code = $_POST['tr_code']; $account_id = $_GET['account_id']; $acc_name = $_POST['acc_name']; $account_number = $_GET['account_number']; $acc_type = $_POST['acc_type']; //$acc_amount = $_POST['acc_amount']; $tr_type = $_POST['tr_type']; $tr_status = $_POST['tr_status']; $client_id = $_GET['client_id']; $client_name = $_POST['client_name']; $client_national_id = $_POST['client_national_id']; $transaction_amt = $_POST['transaction_amt']; $client_phone = $_POST['client_phone']; //$acc_new_amt = $_POST['acc_new_amt']; //Notication $notification_details = "$client_name Has Deposited Ksh $transaction_amt To Bank Account $account_number"; //Insert Captured information to a database table $query = "INSERT INTO iB_Transactions (tr_code, account_id, acc_name, account_number, acc_type, tr_type, tr_status, client_id, client_name, client_national_id, transaction_amt, client_phone) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; $notification = "INSERT INTO iB_notifications (notification_details) VALUES (?)"; $stmt = $mysqli->prepare($query); $notification_stmt = $mysqli->prepare($notification); //bind paramaters $rc = $notification_stmt->bind_param('s', $notification_details); $rc = $stmt->bind_param('ssssssssssss', $tr_code, $account_id, $acc_name, $account_number, $acc_type, $tr_type, $tr_status, $client_id, $client_name, $client_national_id, $transaction_amt, $client_phone); $stmt->execute(); $notification_stmt->execute(); //declare a varible which will be passed to alert function if ($stmt->execute()) { if ($notification_stmt->execute()) { $success = "Money Deposited"; } else { $err = "Please Try Again Or Try Later"; die('Erreur SQL : ' . $notification_stmt->error); } } else { $err = "Please Try Again Or Try Later"; die('Erreur SQL : ' . $stmt->error); } } if(isset($_POST['deposit'])) { $account_id = $_GET['account_id']; $acc_amount = $_POST['acc_amount']; //Insert Captured information to a database table $query="UPDATE iB_bankAccounts SET acc_amount=? WHERE account_id=?"; $stmt = $mysqli->prepare($query); //bind paramaters $rc=$stmt->bind_param('si', $acc_amount, $account_id); $stmt->execute(); //declare a varible which will be passed to alert function if($stmt ) { $success = "Money Deposited"; } else { $err = "Please Try Again Or Try Later"; } }
Et pourtant la même erreur: Erreur SQL : Field 'acc_amount' doesn't have a default value.

Comment donc mettre à jour le champs "acc_amount" (qui représente le solde de l'Utilisateur dont on cherche à créditer le compte) et situé dans la Table iB_bankAccounts à chaque fois que je fais un Dépôt ?

Re: Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 18:43
par ynx
D'après le message d'erreur, il semble bien manquer le champ acc_amount dans la requête insert.

Quelle est la structure de la bdd ? Tu es sûr qu'il n'y a pas aussi un champ acc_amount dans la table iB_Transactions (ou iB_notifications) ?

Re: Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 18:51
par chegmarco
D'après le message d'erreur, il semble bien manquer le champ acc_amount dans la requête insert.

Quelle est la structure de la bdd ? Tu es sûr qu'il n'y a pas aussi un champ acc_amount dans la table iB_Transactions (ou iB_notifications) ?
Je l'ai bien précisé précédemment, le Champs acc_amount de chaque utilisateur est dans la Table ib_BankAccounts et non dans la Table iB_Transactions. Mais ce champs contient le solde de l'utilisateur dont on voudrait additionner/soustraire sa valeur à chaque opération (Dépôt/retrait). Voilà pourquoi comme vous pouvez le constatez dans mon code ci-dessus, j'ai ajouté ceci:

Code : Tout sélectionner

if(isset($_POST['deposit'])) { $account_id = $_GET['account_id']; $acc_amount = $_POST['acc_amount']; //Insert Captured information to a database table $query="UPDATE iB_bankAccounts SET acc_amount=? WHERE account_id=?"; $stmt = $mysqli->prepare($query); //bind paramaters $rc=$stmt->bind_param('si', $acc_amount, $account_id); $stmt->execute(); //declare a varible which will be passed to alert function if($stmt ) { $success = "Money Deposited"; } else { $err = "Please Try Again Or Try Later"; }
Et pourtant, le souci reste que ce champs acc_amount reste à 0 sans augmenter ni diminuer:

Image

Comment donc corriger ce bug s'il vous plaît ???

Re: Ma requête SQL (MySQLi Prepared) n'insère pas du tout les données dans la Base données. Aidez-moi

Posté : 26 janv. 2022, 22:23
par ynx
Le message d'erreur sql correspondait à la requête insert. Concernant cette requête, je ne vois pas quoi ajouter : il manque le champ acc_amount dans la requête insert puisqu'il semble bien que tu es aussi un champ acc_amount dans la table iB_Transactions.

Pour la requête update, on peut également vérifier le retour de execute() et afficher l'éventuelle erreur sql.
Attention à ne pas appeler deux fois la méthode execute() pour chaque requête.
Ne pas hésiter à utiliser echo/var_dump/print_r pour déboguer le contenu des variables.
if(isset($_POST['deposit']))
{
    // var_dump($_GET['account_id']);
    // var_dump($_POST['acc_amount']);
    
    $account_id = $_GET['account_id'];
    $acc_amount = $_POST['acc_amount'];
    
    $query = "UPDATE iB_bankAccounts SET acc_amount=? WHERE account_id=?";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param('si', $acc_amount, $account_id);
    
    if($stmt->execute())
    {
        $success = "Money Deposited";
    }
    else
    {
        $err = "Please Try Again Or Try Later";
        die('Erreur Update iB_bankAccounts : ' . $stmt->error);
    }
}