IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Insérer dans ma base de données avec ma requête MySQLi-Preparée


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut Insérer dans ma base de données avec ma requête MySQLi-Preparée
    Bonjour.

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

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

    Nom : IB_TRANSACTION SUCCESS.png
Affichages : 479
Taille : 65,1 Ko

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

    Nom : IB_TRANSACTION VIDE.png
Affichages : 456
Taille : 131,1 Ko


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?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.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Utilise mysqli->error pour voir ce qui bloque => https://www.php.net/mysqli-error


    PS : Et pourquoi ne pas utiliser PDO au lieu de MySQLi ?

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Utilise mysqli->error pour voir ce qui bloque => https://www.php.net/mysqli-error
    Merci pour la réponse. Mais quand, je modifie en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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:

    Nom : IB_TRANSACTION SUCCESS.png
Affichages : 441
Taille : 65,1 Ko

  4. #4
    Membre confirmé Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 345
    Points : 495
    Points
    495
    Par défaut
    à la place du Money Deposited, affichez le texte de la requête envoyée ($query) ... et postez le ici.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    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 ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    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 ?

  6. #6
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 105
    Points : 16 627
    Points
    16 627
    Par défaut
    Salut

    le champs "acc_amount", ne serait il pas un champs calculé par une macro dans la BDs suivant les autres champs, donc non modifiable, mais en lecture seulement

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    Salut

    le champs "acc_amount", ne serait il pas un champs calculé par une macro dans la BDs suivant les autres champs, donc non modifiable, mais en lecture seulement
    Je ne comprends pas ce que vous voulez dire.
    Mais si c'est pour savoir si c'est pour additionner/soustraire sa valeur à chaque opération (Dépôt/retrait), je vous réponds: OUI. Mais le souci reste que ce champs acc_amount reste à 0 sans augmenter ni diminuer:

    Nom : IB_BANKACCOUNT.png
Affichages : 427
Taille : 128,7 Ko

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

  8. #8
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bonsoir,
    Donc votre souci se situe ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $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();
    Que vaut ?
    Pourquoi le passer en string, alors que visiblement c'est un entier que vous attendez ?

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    $_POST['acc_amount']; vaut le montant à ajouter sur le solde (la balance) de l'utilisateur dans la Base de Données qui devrait être un entier et qui devrait être additionné par la valeur de la variable $transaction_amt = $_POST['transaction_amt']; qui représente le montant à déposer sur le solde de l'utilisateur en question.
    Donc, en principe $_POST['acc_amount']; devrait être commenté car il n'est utilisé que pour le récupérer dans la Table iB_bankAccounts et l'additionner au Montant de la transaction ou du dépôt $transaction_amt alors que $transaction_amt n'est pas dans la même Table que acc_amount;. Pour faire simple, $_POST['acc_amount']; représente la balance de l'utilisateur dont on doit déposer donc, additionner le montant de $transaction_amt.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Le problème de dépôt de fond qui se pose actuellement, se pose également lorsque je tente de retirer des fonds du compte utilisateur, j'ai décidé de poster ici le code source pour permettre de voir avec moi là les bugs se trouvent:

    Nom : IB_TRANSACTION PROBLEME.png
Affichages : 410
Taille : 79,7 Ko

    Donc, j'ai trois problème au niveau des transaction ce qui fait que c'est impossible de gérer les transaction de mon côté et ce sont les trois fichiers suivants qui gèrent les transactions qui pose les problèmes:

    • Fichier traitant le dépôt de fond sur le compte utilisateur: admin/pages_deposit_money.php.
    • Fichier traitant le retrait de fond d'un compte utilisateur: admin/pages_withdraw_money.php.
    • Fichier traitant le transfert de fond du compte d'un utilisateur à un autre: admin/pages_transfer_money.php.


    Donc les requêtes SQL de ces trois fichiers traitant les transactions posent problème car impossible de faire ni un dépôt, ni un retrait et encore moins un transfert de compte à compte.

    Le code source ici:

    ebank.zip

    Merci de m'aider s'il vous plaît.

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Je pense qu'on ne se comprend pas.

    Votre souci est : Erreur SQL : Field 'acc_amount' doesn't have a default value.

    Hors dans votre code , vous essayer un update de la table iB_bankAccounts.

    Donc pour moi, l'erreur provient de cet update qui se trouve ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $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();

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Oui mais qu'est-ce que vous me suggérez comme solution ???

    Car de ce que j'ai pu comprendre de vous, vous m'avez montré la requête UPDATE qui pose le problème sauf que je ne vois toujours pas ce que vous me proposez comme solution pour pallier à cette erreur.

    Dois-je supprimer le UPDATE sachant que j'ai bel et bien besoin de faire une addition de sa valeur à chaque fois que je fais un dépôt ce qui veut dire que j'ai forcément besoin de cette requête UPDATE et donc je ne comprends pas ce que je dois corriger dans cette requête ???

    Que dois-je corriger très exactement dans la requête UPDATE pour réussir les dépôt ???

  13. #13
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    je vous demande de faire un var_dump de pour savoir quelle est la valeur exacte.
    Et pourquoi vous passez cette valeur en string ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $rc=$stmt->bind_param('si', $acc_amount, $account_id);

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    1 -
    Citation Envoyé par MaitrePylos Voir le message
    je vous demande de faire un var_dump de pour savoir quelle est la valeur exacte.
    Quand je fais un var_dump($_POST['acc_amount']);, reçois un retour d'erreur suivante:

    Notice: Undefined index: acc_amount in C:\laragon\www\ebank\core\admin\pages_deposit_money.php on line 61
    Pourtant acc_amount ne devrait être défini qu'en le récupérant dans la table iB_bankAccounts pour être additionner avec le nouveau montant de dépôt et enfin être mis à jour avec le résultat de l'addition de la valeur de la variable $transaction_amt = $_POST['transaction_amt'];. Donc acc_amount représente le solde final après addition (dépôt) du nouveau montant $transaction_amt.

    Mais je précise que $transaction_amt est dans la Table iB_Transactions contrairement à acc_amount qui est dans la Table iB_bankAccounts.

    Comment donc résoudre ce problème ???

    2 -
    Citation Envoyé par MaitrePylos Voir le message
    Et pourquoi vous passez cette valeur en string ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $rc=$stmt->bind_param('si', $acc_amount, $account_id);
    Devrais faire simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $rc=$stmt->bind_param('i', $acc_amount, $account_id);
    ???

    Au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $rc=$stmt->bind_param('si', $acc_amount, $account_id);
    ???

  15. #15
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Donc vous me dite que la variable est vide, car rien n'est défini.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Notice: Undefined index: acc_amount in C:\laragon\www\ebank\core\admin\pages_deposit_money.php on line 61
    Ceci n emet donc aucune valeur dans la variable $acc_amount , puisque $_POST['acc_amount'] n'existe pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $acc_amount = $_POST['acc_amount'];
    Et comme $acc_amount est vide et que malgré tout vous essayez de mettre du vide dans votre DB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $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);
    Mysql vous retourne une erreur : Erreur SQL : Field 'acc_amount' doesn't have a default value,
    Vous disant que l'attribut acc_amount, n'a pas de valeur par défaut défini dans votre DB

    CQFD

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    J'ai décidé de réécrire mon code en passant à la variable $acc_amount qui provoquait l'erreur et qui paraissait inexistante, la nouvelle variable $balance que j'essaie de récupérer via la requête SELECT (Ligne 20 à 24). Cette balance que j'ai ensuite additionné à la valeur de la variable $transaction_amt enregistrée dans la variable $total (Ligne 37) pour la fin faire le UPDATE de $acc_amount dans la table iB_bankAccounts de la Ligne 42 à 48 de mon code ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    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";
     
        $balQuery = "SELECT acc_amount FROM iB_bankAccounts WHERE client_id = ? AND account_number = ? AND acc_status = 'Active'";
    	$stmtBal = $mysqli->prepare($balQuery);
        //bind paramaters
        $balance = $stmtBal->bind_param('ii', $client_id, $account_number);
        $stmtBal->execute();
     
    	// var_dump($_POST['acc_amount']);
     
    	if ($stmtBal->execute()) {
    		if ($balance->num_rows == 1) {
    			/* if($type == "debit") {
    				//check if amt is more then $balance
    				if($balance < $amt) {
    					header('Location: index.php?msg=' . urlencode('Solde du compte est inferieur, ne parvient pas a transférer des fonds.'));
    					exit;
    				}
    			} */
    			$total = $balance + $transaction_amt;
    			if($total <= 0) {
    				//return here...
    			}
    			//Insert Captured information to a database table
    			$query="UPDATE iB_bankAccounts SET acc_amount = ? WHERE client_id = ?";
    			$stmt = $mysqli->prepare($query);
    			//bind paramaters
    			$rc=$stmt->bind_param('ii', $total, $client_id);
    			$stmt->execute();
    			//email details...
    			header('Location: pages_dashboard.php');
     
    			//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);
    			}
    		} else {
    			$err = 'The account number is inactive. You cannot transfer funds with an inactive account.';
    			header('Location: pages_dashboard.php');
    		}
    	} else {
    		$err = "Unable to operate fund deposit on this account at this time. Please try again later.";
    		// die('Erreur SQL : ' . $stmt->error);
    		exit;
    	}
    }
    Mais non seulement la mise à jour de la colonne $acc_amount ne s'opère pas dans la table iB_bankAccounts, mais aussi et surtout le message d'erreur ou de succès qui devrait s'afficher en Pop-up (Sweet-Alert) qui s'afficher avant que je ne modifie totalement le code ne s'affiche.
    Seule la redirection vers la Page pages_dashboard.php se faire et là encore, j'ignore lequelle des deux redirections se fait car j'ai demandé la redirection vers cette page pages_dashboard.php deux fois dont la Ligne 48 et celle de la Ligne 77.

    Aidez-moi donc à me corriger et parfaire mon code de sorte à dans un premier réussir finalement le dépôt de fond en réussissant l'addition de balance du compte de l'utilisateur et le montant de la transaction $transaction_amt.

    Et en second, lieu réussir à afficher le message de Succès ou d'erreur qui s'affichait très en Pop-up (Sweet-Alert) mais qui ne s'affiche plus.

  17. #17
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Il faut bien garder à l'esprit qu'on ne peut pas vraiment tester ton script.

    L'affichage des différents messages d'erreur et des différentes variables donne quoi ?




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //email details...
    header('Location: pages_dashboard.php');
     
    //Insert Captured information to a database table
    $query = "INSERT INTO iB_Transactions (tr_code, account_id, acc_n...
    Généralement on place un exit() après un header('Location: ...'), ça évite de mauvaises surprises.

  18. #18
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Merci pour votre réponse.

    Après avoir placé un exit; sous chaque header('Location: ...'), le code nouvellement modifié est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    <?php
    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";
     
        $balQuery = "SELECT acc_amount FROM iB_bankAccounts WHERE client_id = ? AND account_number = ? AND acc_status = 'Active'";
    	$stmtBal = $mysqli->prepare($balQuery);
        //bind paramaters
        $balance = $stmtBal->bind_param('ii', $client_id, $account_number);
        $stmtBal->execute();
     
    	// var_dump($balance);
     
    	echo $balance;
     
    	if ($stmtBal->execute()) {
    		if ($balance->num_rows == 1) {
    			/* if($type == "debit") {
    				//check if amt is more then $balance
    				if($balance < $amt) {
    					header('Location: index.php?msg=' . urlencode('Solde du compte est inferieur, ne parvient pas a transférer des fonds.'));
    					exit;
    				}
    			} */
    			$total = $balance + $transaction_amt;
    			if($total <= 0) {
    				//return here...
    			}
    			//Insert Captured information to a database table
    			$query="UPDATE iB_bankAccounts SET acc_amount = ? WHERE client_id = ?";
    			$stmt = $mysqli->prepare($query);
    			//bind paramaters
    			$rc=$stmt->bind_param('ii', $total, $client_id);
    			$stmt->execute();
    			//email details...
    			header('Location: pages_balance_enquiries.php');
    			exit;
     
    			//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);
    			}
    		} else {
    			die($stmtBal->error);
    			// header('Location: pages_dashboard.php');
    			// exit;
    			$err = 'The account number is inactive. You cannot transfer funds with an inactive account.';
    		}
    	} else {
    		$err = "Unable to operate fund deposit on this account at this time. Please try again later.";
    		// die('Erreur SQL : ' . $stmt->error);
    		exit;
    	}
    }
     
    ?>
    J'ai essaié de placer die($stmtBal->error); au niveau de la ligne 80 avant la redirection qui s'opérait à chaque fois que j'essayais de faire le dépôt d'un montant sur le solde (la balance) de l'utilisateur, je reçois, l'erreur suivante:

    1
    Notice: Trying to get property 'num_rows' of non-object in C:\laragon\www\ebank\core\admin\pages_deposit_money.php on line 39
    1 - Le 1 en dessus de l'erreur vient de l'affichage de la variable $balance via echo (echo $balance;) au niveau de la Ligne 29. Ce qui veut dire que la balance de l'utilisateur que j'essaie de récupéré dans la base de données via ma requête de la Ligne 21, avec $balQuery = "SELECT acc_amount FROM iB_bankAccounts WHERE client_id = ? AND account_number = ? AND acc_status = 'Active'"; donne 1 alors que ce n'est pas du tout 1 mais plutôt 0:

    Nom : IB_TRANSACTION account_id 0.png
Affichages : 390
Taille : 124,0 Ko

    Comment donc bien récupérer acc_amount, qui représente la valeur du solde (la balance) de l'utilisateur dont on cherche à faire un dépôt via la requête MySQLi Préparées ???

    Car je pense que la 1ère erreur vient de la ligne 21 à la Ligne 25 où j'essaie de récupérer le solde qui devrait normalement être 0 mais qui, quand je tente de l'afficher à la Ligne 29 avec echo $balance;, me donne 1.

    2 - L'erreur Notice: Trying to get property 'num_rows' of non-object in C:\laragon\www\ebank\core\admin\pages_deposit_money.php on line 39 vient de ma vérification de la Ligne 32: if ($balance->num_rows == 1) sur laquelle, je tentais de vérifier le nombre de Ligne affectées select qui cherche à récupérer le solde de l'utilisateur concerné, l'équivalent de PDOStatement::rowCount. Mais malheureusement, je reçois Notice: Trying to get property 'num_rows'.

    Comment donc corriger cela dans mon code ???

    Merci de m'aider s'il vous plaît.

  19. #19
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bonjour,

    Il y a il me semble plusieurs erreurs de code.

    je met en commentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     $balQuery = "SELECT acc_amount FROM iB_bankAccounts WHERE client_id = ? AND account_number = ? AND acc_status = 'Active'";
    	$stmtBal = $mysqli->prepare($balQuery);
        //bind paramaters
        $balance = $stmtBal->bind_param('ii', $client_id, $account_number);
        $stmtBal->execute();
     
    	// var_dump($_POST['acc_amount']);
     
    	if ($stmtBal->execute()) { // pourquoi exécuter encore la requête ???????
    		if ($balance->num_rows == 1) { //$balance est une variable de parametre, vous devrez utiliser $stmBal->num_rows() , sinon vous ne rentrerez jamais dans ce if
    			/* if($type == "debit") {
    				//check if amt is more then $balance
    				if($balance < $amt) { //que vient faire de nouveau $balance ici ???????????
    					header('Location: index.php?msg=' . urlencode('Solde du compte est inferieur, ne parvient pas a transférer des fonds.'));
    					exit;
    				}
    			} */
    			$total = $balance + $transaction_amt;
    			if($total <= 0) {
    				//return here...
    			}
    			//Insert Captured information to a database table
    			$query="UPDATE iB_bankAccounts SET acc_amount = ? WHERE client_id = ?";
    			$stmt = $mysqli->prepare($query);
    			//bind paramaters
    			$rc=$stmt->bind_param('ii', $total, $client_id);
    			$stmt->execute();
    			//email details...
    			header('Location: pages_dashboard.php');

  20. #20
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bon on va reprendre depuis le début et y aller pas à pas si vous voulez bien.

    que donne ce résultat et est-ce bien ce que vous attendez ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    <?php
    session_start();
    include('conf/config.php');
    include('conf/checklogin.php');
    check_login();
    $admin_id = $_SESSION['admin_id'];
     
     
    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";
     
        $balQuery = "SELECT acc_amount FROM iB_bankAccounts WHERE client_id = ? AND account_number = ? AND acc_status = 'Active'";
        $stmtBal = $mysqli->prepare($balQuery);
        $stmtBal->execute([$client_id, $account_number]);
        $balance = $stmtBal->fetch_object();
     
        echo "<pre>";
        print_r($balance);
        echo "</pre>";
        die();

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [OpenOffice][Base de données] Récupérer les données d'un fichier .txt et les insérer dans une base de données
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 9
    Dernier message: 05/08/2009, 10h52
  2. Réponses: 1
    Dernier message: 15/04/2009, 18h28
  3. [CKEditor] Insérer dans ma base, les données saisies à partir de FCKeditor
    Par remo dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 16/05/2007, 10h44
  4. Réponses: 4
    Dernier message: 23/04/2007, 12h01
  5. [SQL] Importer un fichier .sql dans une base de données avec PHP
    Par budiste dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/06/2006, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo