Erreur !: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_type_ [Résolu]

Signaler
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020
-
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
-
Bonjour, je cherche une solution à ce problème et je pense que le problème vient de là:


Les variables sont instancié par $_POST via un formulaire :


PS: id_type_cour est une clé étrangère

5 réponses

Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
2 610
Bonjour,

Commence par nous poster ton code correctement ( en utilisant les balises de code)
Explications ( à lire ENTIEREMENT... ) disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Donnes nous également le message d'erreur complet.

Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020

Le formulaire:
<form method="post" id="saisie" action="./?action=couter" onsubmit="return valider()">
        <br/>
        <div class="form-group">
            <label for="quotient"class="label">Cout</label>
            <input type="text" class="form-control" name="montant" id="montant" placeholder="0">
            </br>
            <label for="">Tranches: </label>
            <select name="tranchesC" id="tranchesC">
            <option value="">..Tranche..</option>
                <?php for ($i = 0; $i < count($getTranche); $i++) {?>
                    <option value="<?= $i; ?>">
                        <?= $getTranche[$i]["id"];?>
                    </option>
                <?php } ?>
            </select>
            <label for="">Type de Cours: </label>
            <select name="typeCour" id="typeCour">
            <option value="">..Type de cour..</option>
                <?php for ($i = 0; $i < count($getTypeCour); $i++) {?>
                    <option value="<?= $i; ?>">
                        <?=$getTypeCour[$i]["libelle"];?>
                    </option>
                <?php } ?>
            </select>
        </div>
        <button name="bouton" id="bouton" type="submit" class="btn btn-primary">Envoyer</button>
</form>

Les variables :
$couter = $_POST['montant'];
$tranche=$_POST['tranchesC'];
$typeCour=$_POST['typeCour'];


Et la fonction qui permet de mettre les donnée dans la bdd:
function InsertCouter($couter,$tranche,$typeCour){
    try {
        $cnx = connexionPDO();
        $req = $cnx->prepare("Insert into couter(montant,id_tranches,id_type_cour) Value(:montant,(Select id from tranches where id=:tranche),(Select id from type_cour where id=:typeCour))");
        $req->bindValue(':montant', $couter, PDO::PARAM_INT);
        $req->bindValue(':tranche', $tranche, PDO::PARAM_INT);
        $req->bindValue(':typeCour', $typeCour, PDO::PARAM_INT);

        $resultat = $req->execute();
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage();
        die();
    }
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
2 610
Visiblement...... tu n'as pas lu le lien que je t'ai donné.
Donc.. merci de nous poster ton code correctement.
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020
>
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020

j'étais en train de la faire
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
2 610
Je remarque au passage quelques erreurs....
$req = $cnx->prepare("Insert into couter(montant,id_tranches,id_type_cour) Value(:montant,(Select id from tranches where id=:tranche),(Select id from type_cour where id=:typeCour))");

Sachant que tu fais :
Select id from type_cour where id=:typeCour

.... id=:typeCour ..... donc pourquoi faire une sous-requête ??

Idem pour Tranche....

Où vas tu chercher ta requête ??
Il suffit de faire
$sql = "Insert into couter(montant,id_tranches,id_type_cour)
             Value(:montant, :tranche, :typeCour )";
$req = $cnx->prepare($sql);

Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020

J'ai essayé de le faire mais sa me fait exactement la même erreur sur un autre formulaire, donc j'ai due faire une sous requête vu comme c'est sur une table étrangère
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
2 610

donc j'ai due faire une sous requête vu comme c'est sur une table étrangère

Ben... non... y'a aucun intérêt.

Par contre, tant que tu ne nous donneras pas le message d'erreur EXACT et COMPLET ... difficile de t'en dire plus....

La structure des tables pourrait également nous servir....
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020

La structure de la table


J'ai modifié comme tu me l'a dis mais sa met maintenant ça comme erreur: Erreur !: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`stage`.`couter`, CONSTRAINT `couter_type_cour_FK` FOREIGN KEY (`id_type_cour`) REFERENCES `type_cour` (`id`))
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
2 610 >
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020

C'est marrant.... vu ton code... je pense que ça commence à 0 ..
<select name="typeCour" id="typeCour">
            <option value="">..Type de cour..</option>
                <?php for ($i = 0; $i < count($getTypeCour); $i++) {?>
                    <option value="<?= $i; ?>">
                        <?=$getTypeCour[$i]["libelle"];?>
                    </option>
                <?php } ?>
            </select>

Il serait préférable de le modifier comme ceci
<select name="typeCour" id="typeCour">
            <option value="">..Type de cour..</option>
                <?php 
                    foreach($getTypeCour as $T ) {
                 ?>
                    <option value="<?php echo  $T['id']; ?>">
                        <?php echo $T["libelle"]; ?>
                    </option>
                <?php
                    } 
                ?>
            </select>
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020
>
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020

Les valeur 1 et 2 sont dans la base de donnée et pour la boucle for on est obligé de commencer à 0
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
2 610 >
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020

Essaye de comprendre le code que tu écris.... et encore plus important.... essaye de comprendre celui que je te donne !
Quand tu auras réussi.... tu auras fais un grand pas en avant !
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020
>
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020

La boucle foreach permet de récupérer les données d'un tableau ici les donnée de la base de donnée et le mettre dans le <select> Au passage j'ai modifié le code de la boucle for en foreach et sa marche merci Jordane45
Messages postés
28942
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juillet 2020
2 610 >
Messages postés
22
Date d'inscription
samedi 21 avril 2018
Statut
Membre
Dernière intervention
17 juin 2020

Il n'y a pas que ça.....
Tu aurais pu continuer à utiliser ta boucle for ... mais là .. Tu utilisais, dans le "value" de tes <option> la valeur de $i ......
hors... c'est
$getTypeCour[$i]["id"]
qu'il aurait fallu utiliser

PS: Si le problème est réglé, pense à mettre le sujet en RESOLU