Page 1 sur 1

Bind un param bool avec pdo

Posté : 31 oct. 2020, 20:35
par Stevenhonor
Bonsoir à tous,

Je suis actuellement confronté à un petit problème.
J'ai créer un formulaire qui me permet d'ajouter 1 ligne dans une base de données.
Cette ligne est a chaque fois constitué de 3 champs obligatoire:
Deux colonne de type string et une colonne de type BIT, de longueur 1.

J'ai tapé ce code pour insérer quelque chose dans ma table mais rien ne se passe et je ne reçois pas de message d'erreur mais rien ne s'inscris dans la bdd:
<?php
if(isset($_POST['ADD'])) {

    $nom = htmlspecialchars($_POST['ADD']);
    $categorie = htmlspecialchars($_POST['CATEGORIE']);

    $q = $bdd->prepare('INSERT INTO Matieres(Nom, Categorie, Active) VALUES(:nom, :categorie, :active');
    $q->bindParam(':nom', $nom);
    $q->bindParam(':categorie', $categorie);

    if($_POST['ACTIVE'] == 'Oui') {

        $active = TRUE;

    } else {

        $active = FALSE;

    }

    $q->bindParam(':active', $active, PDO::PARAM_BOOL);
    $q->execute();
    $feedback = "Compétence ajoutée !";

}
?>
J'ai l'impression que le blocage vient du boolean que je tente de passer mais je ne comprend pas pourquoi...
J'ai d'ailleurs essayer plusieurs sortes de syntaxe différente mais rien n'y fais.
Et rien sur internet à ce sujet, mis à part ce que j'ai déjà tester dans mon coin.

Si quelqu'un pouvait m'éclairer ce serais vraiment super sympa ! :)

Re: Bind un param bool avec pdo

Posté : 31 oct. 2020, 22:09
par @rthur
Bonjour,

Pour t'aider dans ton debugage active ERRMODE_WARNING de PDO :
https://www.php.net/manual/fr/pdo.error-handling.php

Re: Bind un param bool avec pdo

Posté : 01 nov. 2020, 00:32
par Stevenhonor
Le problème c'est que justement j'ai écrit ce code d'initialisation à ma bdd:

try {
    GLOBAL $bdd;
    $bdd = new PDO('');
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch(PDOException $e) {
    echo $e;
}
Et pareil si je fais un try catch sur mon code d'ajout en base de données, je n'ai pas de report d'erreur ou d'avertissements

Si ça peut aider, voici un var_dump de toutes mes variables récuperée en $_POST:
 array(3) { ["ADD"]=> string(5) "React" ["CATEGORIE"]=> string(5) "Front" ["ACTIVE"]=> string(3) "Non" } 
voici un var_dump de ma variable $active qui est assigné selon la condition avec le $_POST["ACTIVE"]:
string(5) "FALSE"
OH et si ça peut aider, j'ai créer deux autre formulaire de " débuggage" pour voir si j'arrive à modifier une ligne déjà existante et oui j'y arrive mais je ne comprend pas pourquoi la requete update marche mais pas celle d'insertion :(
je met ici le code des update ( Un pour passer ma colonne active à 0 ( donc en false ) et l'autre pour la passer à 1 (true) :

if(isset($_POST['ON'])) {

    $q = $bdd->prepare('UPDATE Matieres SET Active = TRUE WHERE Nom = ?');
    $q->execute(array($_POST['ON']));
    $feedback = "Compétence mise à jour !";

}

if(isset($_POST['OFF'])) {

    $q = $bdd->prepare('UPDATE Matieres SET Active = FALSE WHERE Nom = ?');
    $q->execute(array($_POST['OFF']));
    $feedback = "Compétence mise à jour !";

}

Et directement sur ma bdd si je rentre cette requete d'insertion et bien ça fonctionne aussi:
INSERT INTO Matieres(Nom, Categorie, Active) VALUES('Test', 'CategorieDeTest', TRUE); 
Le probleme vient bien de ma façon d'écrire la requete d'insertion sur PDO en PHP mais je ne vois pas du tout pourquoi ça fonctionne pas... Je nage et je ne trouve définitivement pas la soluce :(

EDIT: Je suis un gros boulet qui relie mal son code !!
Le problème vient en fait tout simplement de la fermeture de mes parenthese values qui est tout simplement manquante ... Je me desespere parfois...

Ah et aussi, au lieu d'assigner TRUE ou FALSE à ma variable $active, il fallait que je lui assigne l'integer 1 pour TRUE ou l'integer 0 pour FALSE.
Sinon lui assigner directement TRUE ou FALSE fera que la requête SQL ajoutera toujours automatiquement TRUE à ce champs lors de l'insertion ( donc le bit 1 )

Le code fonctionnel final est donc:

if(isset($_POST['ADD'])) {

    $nom = htmlspecialchars($_POST['ADD']);
    $categorie = htmlspecialchars($_POST['CATEGORIE']);
    $q = $bdd->prepare('INSERT INTO Matieres(Nom, Categorie, Active) VALUES(:nom, :categorie, :active)');
    $q->bindParam(':nom', $nom, PDO::PARAM_STR);
    $q->bindParam(':categorie', $categorie, PDO::PARAM_STR);
    if($_POST['ACTIVE'] == 'Oui') {

        $active = 1;

    } else {

        $active = 0;

    }

    $q->bindParam(':active', $active, PDO::PARAM_BOOL);
    $q->execute();
    $feedback = "Compétence ajoutée !";

}