Problème d'insertion avec PHP

Petit nouveau ! | 6 Messages

17 oct. 2016, 15:10

Bonjour je travaille sur un site d’informations sport sujet de mémoire. Mais j’ai des difficultés avec mes traitements et j’aurais besoin d’aides.
J’ai 2 pages php dont une classe php nommée « Sports_Class.php » qui gére les insertions, modifications et suppressions de sport. Et une page php « Sports.php » qui liste les sports et permet d’ajouter un nouveau sport. Dans « Sports.php » j’ai une fenêtre modale qui gére les insersions. Mais chaque fois que je fais une nouvelle insertion rien ne se passe.
Merci de bien vouloir m’aider.
Sports_Class.php :
<?php
include_once 'connexionBD.php';

class Sports {
private $nomsSports;
    private $codesSports;
    private $ordresSports;
    private $class;
    private $activer;
    private $bdd;

    public function __construct($nomsSports, $codesSports, $ordresSports, $class, $activer) {
        $nomsSports = $nomsSports;
        $codesSports = $codesSports;
        $ordresSports = $ordresSports;
        $class = $class;
        $activer = $activer;

        $this->nomsSports = $nomsSports;
        $this->codesSports = $codesSports;
        $this->ordresSports = $ordresSports;
        $this->class = $class;
        $this->activer = $activer;
        $this->bdd = bdd();
    }

//----------------  Vérification avant Inscription  --------------    
    public function verif() {
        $req = $this->bdd->prepare('SELECT * FROM sports WHERE nomsSports=:nomsSports OR codesSports=:codesSports OR ordresSports=:ordresSports OR class=:class');
        $req->execute(array('nomsSports' => $this->nomsSports, 'codesSports' => $this->codesSports, 'ordresSports' => $this->ordresSports, 'class' => $this->class));
        $rep = $req->fetch();
        if ($rep['nomsSports'] == $_POST['nomsSports']) {
            $erreur = 'Nom du Sport déja utilisé !';
            return $erreur;
        } else if ($rep['codesSports'] == $_POST['codesSports']) {
            $erreur = 'Code du Sport déja utilisé !';
            return $erreur;
        } else if ($rep['ordresSports'] == $_POST['ordresSports']) {
            $erreur = 'Numero d\'Ordre du Sport déja utilisé !';
            return $erreur;
        } else if ($rep['class'] == $_POST['class']) {
            $erreur = 'Classe CSS du Sport déja utilisé !';
            return $erreur;
        } else {
            return 'ok';
        }
    }

//-----------------   FONCTION AJOUTER UN NOUVEAU CLUB   -----------------------------------------------------------------
    public function ajouterSports() {
        $req = $this->bdd->prepare('INSERT INTO sports (nomsSports, codesSports, ordresSports, class, activer VALUES(:nomsSports,:codesSports,:ordresSports,:class,:activer)');
        $req->execute(array('nomsSports' => $this->nomsSports, 'codesSports' => $this->codesSports, 'ordresSports' => $this->ordresSports, 'class' => $this->class, 'activer' => $this->activer));
        return 1;
    }
}
Sports.php :
<?php
session_start();
include_once 'fonctions/connexionBD.php';
include_once 'fonctions/Sports_class.php';
$bdd = bdd();

if (isset($_POST['enregistrer'])) {
//     $erreur = 'message';
    $sports = new Sports($_POST['nomsSports'], $_POST['codesSports'], $_POST['ordresSports'], $_POST['class'], $_POST['activer']);
    $verif = $clubs->verif();
    if ($verif == 'ok') { /* Tous est bon */
        if ($sports->ajouterSports()) {
            $success = ' Sport : "' . $_POST['nomsSports'] . '" ajouté avec succès ';
        } else { /* Erreur lors de l'enregistrement */
            echo 'Une erreur est survenue';
        }
    } else {
        echo $erreur = $verif;
    }
}
?>
<div class="">

    <div>        
        <!-- Button trigger modal -->
        <a href="#" class="btn btn-primary" data-toggle="modal" data-target="#modalAjouterSport" title="Ajouter">
            Ajouter
        </a>
    </div>   

    <table class="table table-bordered table-responsive table-hover" >
        <thead>
            <tr>
                <th>#</th>
                <th>Sports</th>
                <th>Codes</th>
                <th>Ordres</th>
                <th>Classes</th>
                <th>Etats</th>
                <th colspan="3">Actions</th>
            </tr>
        </thead>
        <tbody>
            <?php
            $repListeSports = $bdd->query('SELECT * FROM sports order by ordresSports');
            while ($donListeSports = $repListeSports->fetch()) {
                ?>
                <tr>
                    <td id="idSports"><?php echo $donListeSports['idSports']; ?></td>
                    <td><?php echo $donListeSports['nomsSports']; ?></td>
                    <td><?php echo $donListeSports['codesSports']; ?></td>
                    <td><?php echo $donListeSports['ordresSports']; ?></td> 
                    <td><?php echo $donListeSports['class']; ?></td>
                    <td><?php echo $donListeSports['activer']; ?></td>
                    
                </tr>
                <?php
            }
            $repListeSports->closeCursor(); // Termine le traitement de la requête
            ?>
        </tbody>
    </table> 

</div>

<!-- MODAL AJOUTER SPORT -->
<div class="modal fade" id="modalAjouterSport" tabindex="-1" role="dialog"
     aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <form class="form-horizontal" name="" action="Sports.php" method="POST">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">X</button>
                    <h4 class="modal-title" id="myModalLabel">
                        Ajouter un nouveau Sport
                    </h4>
                </div>
                <div class="modal-body">
                    <div class="row">
                        <div class="form-group col-lg-12">
                            <div class="form-group">
                                <label for="nomsport" class="col-sm-3 control-label">Nom du Sport</label>
                                <div class="col-sm-9">
                                    <input type="text" placeholder="Nom Sport" name="nomsSports" class="form-control" id="nomsport">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="codesport" class="col-sm-3 control-label">Code du Sport</label>
                                <div class="col-sm-9">
                                    <input type="text" placeholder="Code Sport" name="codesSports" class="form-control" id="codesport">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="nomsport" class="col-sm-3 control-label">Numero Ordre</label>
                                <div class="col-sm-9">
                                    <input type="text" placeholder="Ordre Sport" name="ordresSports" class="form-control" id="nomsport">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="codesport" class="col-sm-3 control-label">Classe CSS</label>
                                <div class="col-sm-9">
                                    <input type="text" placeholder="Classe CSS" name="class" class="form-control" id="codesport">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="etat" class="col-sm-3 control-label">Etat</label>
                                <div class="col-sm-9">
                                    <select class="form-control" name="activer" id="etat">
                                        <option>Etat du Sport</option>
                                        <option value="0">Desactiver</option>
                                        <option value="1">Activer</option>
                                    </select>      
                                </div>
                            </div>                            
                        </div>                     
                    </div>
                </div>
                <div class="modal-footer">
                    <?php
                    if (isset($success)) {
                        ?>
                        <div class="alert alert-success"><i class="icon-ok icon-white"></i>
                            <?php echo $success; ?>
                        </div>
                        <?php
                    } else if (isset($erreur)) {
                        ?>
                        <div class="alert alert-danger"><i class="icon-ok icon-white"></i>
                            <?php echo $erreur; ?>
                        </div>
                        <?php
                    }
                    ?>
<!--                    <a href="#" name="enregistrer" onclick="">
                            <img src="images/Icones/btnEnregistrer.png" class="action"/>
                        </a>-->
                    <button type="button" class="btn btn-primary" >
                        <img src="images/Icones/btnEnregistrer.png" />
                        Enregistrer</button>
                    <button type="button" class="btn btn-default" data-dismiss="modal">Fermer</button>
                </div>
            </form>
        </div><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
</div><!-- /.modal -->


<script>
    $(function () {        $('#modalAjouterSport').modal('hide');   });    
</script>
Modifié en dernier par moogli le 17 oct. 2016, 16:30, modifié 1 fois.
Raison : BBcode

ynx
Mammouth du PHP | 586 Messages

17 oct. 2016, 16:31

Salut,

Si ce n'est pas déjà fait, peux tu activer le rapport d'erreur de PDO afin d'afficher les éventuelles erreurs sql ?
Explications et exemples ici : http://php.net/manual/fr/pdo.error-handling.php

Afin de voir les erreurs PHP (et PDO) à l'écran, les options de PHP display_errors et error_reporting doivent être configurées correctement (ce qui est généralement le cas si tu es dans un environnement de développement local tel que wamp). Sinon les erreurs devraient dans tous les cas être consultables dans le journal d'erreur du serveur web (un fichier error.log par exemple).
Quelques explications supplémentaires si besoin : http://www.infowebmaster.fr/tutoriel/af ... erreur-php

Suite à ceci, as tu des erreurs sql et/ou php ?

Bonne journée,

Mammouth du PHP | 2703 Messages

17 oct. 2016, 19:23

$verif = $clubs->verif();
d'où sort cette variable $clubs ?

Petit nouveau ! | 6 Messages

17 oct. 2016, 20:00

OR1 : je l'ai retifié c'est $sports

Petit nouveau ! | 6 Messages

17 oct. 2016, 20:01

ynx : d'accord je vérifie l'activation mais je travaille avec xampp mais je trouve pas pas le fichier php.ini

ynx
Mammouth du PHP | 586 Messages

18 oct. 2016, 16:14

Une méthode simple pour retrouver le fichier de configuration php.ini est de créer une page php contenant uniquement l'instruction phpinfo() :
<?php
phpinfo();
L'accès à cette page va t'afficher toute la configuration de php et tu pourras trouver le fichier php.ini utilisé grâce à l'information "Loaded Configuration File".

Petit nouveau ! | 6 Messages

19 oct. 2016, 14:33

ok ynx c'est réglé mais quand je teste le tout dans une même page, l'insertion est OK.
Par contre avec le modal rien ne se passe y'a même pas d’erreur qui s'affiche. Là je suis hyper bloqué.
On m'a dit que c'est possible d'insérer avec Ajax et php. Mais je ne maîtrise pas ajax.
Si vous pouvez m'aider.

ynx
Mammouth du PHP | 586 Messages

20 oct. 2016, 09:28

Pour que ton code actuel fonctionne, il faudrait remplacer le button type="button" de validation du formulaire par un button type="submit" avec un attribut name="enregistrer" pour satisfaire la condition isset($_POST['enregistrer']) :
<button type="submit" name="enregistrer" class="btn btn-primary"><img src="images/Icones/btnEnregistrer.png" /> Enregistrer</button>
Sans ajax actuellement, la validation du formulaire va recharger la page et le résultat "success" ou "erreur" affiché dans la modale ne sera pas directement visible par l'utilisateur car la modale n'est pas ouverte au chargement de la page.
Une possibilité de pallier à cela est de déplacer l'affichage du résultat "success" ou "erreur" dans la page, au dessus du tableau affichant les sports par exemple.

Ajax permettrait "seulement" de ne pas avoir à recharger la page lors de la validation du formulaire et de pouvoir afficher le message résultat directement dans la fenêtre modale.
Pour maîtriser ajax, tu pourras trouver beaucoup d'infos et tutos à ce sujet via ton moteur de recherche préféré, par exemple : https://developer.mozilla.org/fr/docs/AJAX/Premiers_pas
Puisqu'il semble que tu utilises jQuery, tu peux également sa fonction ajax qui simplifie beaucoup sa mise en place (même s'il peut être intéressant de savoir comment fonctionne ajax sans jQuery).

Petit nouveau ! | 6 Messages

20 oct. 2016, 17:00

ynx :
Merci de votre aide. Je vois ce que vous dites. Mais avec ajax je veux après enregistrement que seule la div contenant le tableau s'actualise .
Rappel: j'ai
- une classe php : contient la fonction ajouter(),
- une page php : contenant un formulaire et le code ajax
Pouvez vous me montrer comment procéder

ynx
Mammouth du PHP | 586 Messages

21 oct. 2016, 11:51

Un début de solution simple avec jQuery :
- on commence par ajouter un élément html dans la page où nous afficherons dynamiquement le résultat (via ajax sans recharger la page)
<div id="result"></div>
- on ajoute du code javascript pour traiter le formulaire via ajax :
$(function () {
    $('#modalAjouterSport').on('submit', function(e) {
        e.preventDefault();
        $.post($(this).attr( "action" ), $(this).serialize() + '&ajax=1').done(function (data) {
            $('#result').html(data);
        });
    });
});
- il faut ensuite adapter le traitement du formulaire pour ne retourner que le résultat ci la requette http est effectuée via ajax. La code js ajoute un paramètre POST['ajax'] à l'envoi du formulaire, on peut donc utiliser ce paramètre pour modifier le code (il ne faut aucun echo ou autre affichage avant) :
if (isset($_POST['enregistrer'])) {
    $sports = new Sports($_POST['nomsSports'], $_POST['codesSports'], $_POST['ordresSports'], $_POST['class'], $_POST['activer']);
    $verif = $clubs->verif();
    if ($verif == 'ok') { 
        if ($sports->ajouterSports()) {
            $success = ' Sport : "' . $_POST['nomsSports'] . '" ajouté avec succès ';
        } else {
            $erreur = 'Une erreur est survenue';
        }
    } else {
        $erreur = $verif;
    }
    
    if (isset($_POST['ajax'])) {
        if ($success) {
            return $success;
        } else {
            return $erreur;
        }
    }
}
Ce début de solution permet uniquement d'afficher le message d'erreur ou de succès sans recharger la page. Pour rafraichir en plus le tableau, il faut adapter le traitement php et l'affichage via javascript.
Tu peux utiliser l'onglet Réseau de la barre de développement de ton navigateur pour analyser la requette ajax à l'envoi du formulaire.

Petit nouveau ! | 6 Messages

21 oct. 2016, 12:41

Merci Ynx de l'aide .
$('#result').html(data); : affiche le div et son contenu et ça n'enregistre pas dans la base de données

ynx
Mammouth du PHP | 586 Messages

21 oct. 2016, 15:22

La variable data correspond au retour de la requête ajax. Il faut adapter le traitement/affichage de php et/ou de javascript pour afficher ce que tu souhaites.

Concernant le problème d'enregistrement, on revient au début : as tu des messages d'erreur PDO ?

Avais tu appliqués les corrections de mon message d'hier (ajout de input type="submit" name="enregistrer") ?
L'enregistrement fonctionne t-il sans le traitement avec ajax ? Si non, tu peux commencer par faire fonctionner ton code sans ajax pour simplifier le débug et le dev (ou analyser la requête dans la barre de développement si tu veux débuger avec le traitement ajax).