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 :

Impossible de déclencher une fonction en cascade


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut Impossible de déclencher une fonction en cascade
    Bonjour à tous,

    Dans la fonction ci dessous je voudrais retourner la valeur $retour pour pouvoir l'exploiter dans le fichier loginFormFn.php qui, si condition vérifiée déclenche ma deuxième fonction "checkCredentials.php"...


    Si je rajoute un return json_encode($retour) en ligne 27 cela marche et déclenche bien la deuxième fonction mais rend inexploitable cette fonction dans le script ajax pour le deuxième formulaire qui pourrait l'exploiter car le return placé devant le die dont a besoin le code Ajax est éxécuté avant celui-ci et du coup arrête le code sans que le die puisse retourner de résultat...

    J'ai essayé en mettant le return en dernière ligne du 'try' cela ne retourne aucun résultat...

    Avez vous une idée de comment faire ? Peut être que je n'utilise pas la bonne méthode ?

    fonction userCheck()

    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
    <?php
    /*Retourne uniquement un nom d'utilisateur pour en vérifier l'existence dans la base
    (fonction devenant disponible aussi dans le formulaire d'inscription)*/
    function userCheck()
    {
        global $displayName;
        global $conn;
        global $retour;
        $retour = [];
     
        try {
            $sql = "SELECT userName from users 
                                    WHERE userName = :displayName
                                    UNION 
                                    SELECT bankerName from bankers 
                                    WHERE bankerName = :displayName";
            $result = $conn->prepare($sql);
            $result->bindValue(':displayName', $displayName, pdo::PARAM_STR);
            $result->execute();
     
            if ($result->rowCount() == 0) {
                $retour["reponsePHP"] = "userDoesNotExists";
                die(json_encode($retour));
            } else {
                $retour["reponsePHP"] = "userExists";
                //On retourne la variable pour pouvoir continuer à vérifier le couple user/password
                //dans la fonction checkCredentials()            
                die(json_encode($retour));
            };
        } catch (PDOException $e) {
            $e->getMessage();
            die();
        };
    };
    loginFormFn.php

    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
    <?php
    require_once $_SERVER['DOCUMENT_ROOT'] . '/functions-php/connexion.php';
     
    if (isset($_POST['displayNameLogin']) && isset($_POST['userPassword'])) {
     
        $displayName = $_POST['displayNameLogin'];
        $userPassword = $_POST['userPassword'];
     
        require_once $_SERVER['DOCUMENT_ROOT'] . '/functions-php/userCheck.php';
        userCheck();
     
        //Si l'utilisateur est reconnu comme existant alors on continue avec la vérification du couple user/password
        if ($retour['reponsePHP'] == "userExists") {
            require_once $_SERVER['DOCUMENT_ROOT'] . '/functions-php/checkCredentials.php';
            checkCredentials();
        }
    };
    loginForm.js

    Code javascript : 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
    $(document).ready(function () {
        $("#submitLogin ").on('click', function (event) {
     
            $("#userAlert").html("")
            var displayName = $("#displayNameLogin").val();
            var userPassword = $("#userPassword").val();
     
            if (displayName == "" || displayName.length < 5) {
     
                alert("Veuillez renseigner un nom d'utilisateur (min 5 caractères)")
                return false
            }
            if (userPassword == "") {
                alert('Veuillez renseigner un mot de passe')
                return false
            }
     
            $.ajax(
                {
                    url: '/includes/loginForm.php',
                    method: "POST",
                    dataType: "json",
                    data: {
                        displayNameLogin: displayName,
                        userPassword: userPassword
                    },
                    success: function (response) {
                        console.log(response.reponsePHP)
     
                        switch (response.reponsePHP) {                       
     
                            case "userDoesNotExists":
                                $("#userAlert").html("Aucun utilisateur n'a été trouvé avec ce nom, veuillez vérifier votre nom d'utilisateur svp.")
                                event.preventDefault()
                                event.stopPropagation()
                                break
     
                            case "wrongCredentials":
                                $("#userAlert").html("Le mot de passe fourni ne correspond pas à celui enregistré dans votre compte... Veuillez vérifier votre mot de passe svp.")
                                event.preventDefault()
                                event.stopPropagation()
                                break
     
                            case "banker":
                                $("#userAlert").html("Connexion à la console d'administration en cours ...")
                                setTimeout(function () { window.location.href = "/views/adminConsole.php" }, 2000);
                                break
     
                            case "user":
                                $("#userAlert").html("Connexion à votre compte en cours ...")
                                setTimeout(function () { window.location.href = "/views/clientAccounts.php" }, 2000);
                                break
     
                            /*default:
                                $("#userAlert").html("Retour à la page d'accueil ...")
                                setTimeout(function () { window.location.href = "/index.php" }, 2000);*/
                        }
     
                    },
                    error: function (response) {
                        alert(response + "Erreur xhr")
                    }
                });
        });
    });
     
    /*var displayName = document.getElementById('displayName')
     
     
    myLoginForm.addEventListener('submit', function (event) {
        if (myLoginForm.checkValidity() === false) {
            console.log('Une erreur est survenue')
            event.preventDefault()
            event.stopPropagation()
     
        } else {
            myLoginForm.classList.add('was-validated')
            alert("Données envoyées")
        }
    })
     
    // Empêche la fermeture du formulaire inclus dans le dropdown
    document.getElementById("dropDownLoginForm").addEventListener('click', function (event) {
        event.stopPropagation();
    });*/
     
    //alert(userRolePHP);*/

    registrationForm.js

    Code javascript : 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
    93
    94
    95
    96
    97
    98
    99
    100
    //Empêche la fermeture du formulaire inclus dans le dropdown
    /*document.getElementById("dropDownRegistrationForm").addEventListener('click', function (event) {
        event.stopPropagation();
    });*/
     
    $(document).ready(function () {
        $("#submitRegistration").on('click', function (event) {
            event.preventDefault
            var displayName = $("#displayNameRegistration").val()
     
            /*if (displayName == "" || displayName.length < 5) {
     
                alert("Veuillez renseigner un nom d'utilisateur (min 5 caractères)")
                return false
            }
            //var userFirstName = $("#userFirstName").val();
            //console.log('Prénom : ' + userFirstName)*/
     
            $.ajax(
                {
                    url: '/includes/registrationForm.php',
                    method: "POST",
                    dataType: "json",
                    data: {
                        displayNameRegistration: displayName
                    },
                    success: function (response) {
     
                        switch (response.reponsePHP) {
                            case "userDoesNotExists":
                                alert('Nom disponible !')
                                break
     
                            case "userExists":
                                //$("#userAlert").html("Ce nom d'utilisateur existe déjà, veuillez en choisir un autre (min 5 caractères.")
                                alert('Nom non disponible !')
                                event.preventDefault
                                event.stopPropagation
                                break
     
                        }
                    },
                    error: function (response) {
                        alert('probleme avec la response : ' + response + " " + displayName)
                    }
                })
     
        });
    });
     
     
     
    //const myRegistrationForm = document.getElementById('registrationForm')
     
    /*myRegistrationForm.addEventListener('submit', function (event) {
        if (myRegistrationForm.checkValidity() === false) {
            event.preventDefault()
            event.stopPropagation()
        }
        myRegistrationForm.classList.add('was-validated')
    })*/
     
     
    /*form.classList.add('was-validated')
    var userLastName = document.getElementById('userLastName').value
    alert(userLastName)
    })*/
     
    /*function formValidation() {
        var userLastName = document.getElementById('userLastName').value
        alert(userLastName)
    }
     
    //Validation des champs, contrôle de la date de naissance
    /*var form = document.querySelector('.needs-validation');
     
    form.addEventListener('submit', function(event) {
        var userBirthDate = document.getElementById('userLastName').Value
     
        alert('Date naissance renseignée :' + userBirthDate)
    })
     
    function getAgeFromBirthDate(year, month, day) {
        const date = new Date();
        date.setFullYear(date.getFullYear() - year);
        date.setMonth(date.getMonth() - month);
        //date.setDate(date.getDate() - day);
        return date;
    };
     
    console.log(getAgeFromBirthDate(1969, 10, 7).getFullYear());
     
    function birthDateValidation() {
        if (birthdate < 18) {
            alert('La date de naissance renseignée : ' + birthDate + 'indique que vous n\'êtes pas encore majeur(e), veuillez corriger la date ou bien annuler votre demande.')
     
            event.preventDefault()
            event.stopPropagation()
        }
    }*/

    checkCredentials.php :

    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
    <?php
    function checkCredentials()
    {
        /*Recherche les utilisateurs et banquiers ayant nom et mot de passe 
        qui correspondent avec les données présentes dans la base de données*/
     
        global $displayName;
        global $userPassword;
        global $conn;
        global $retour;
     
        $retour = [];
     
        try {
     
            $sql = "SELECT userName, userPassword, userRole
                            FROM users 
                            WHERE userName = :displayName 
                            AND userPassword = :userPassword
                            UNION
                            SELECT bankerName, bankerPassword, userRole
                            FROM bankers
                            WHERE bankerName = :displayName
                            AND bankerPassword = :userPassword";
     
            $result = $conn->prepare($sql);
            $result->bindValue(':displayName', $displayName, pdo::PARAM_STR);
            $result->bindValue(':userPassword', $userPassword, pdo::PARAM_STR);
            $result->execute();
        } catch (PDOException $e) {
            $retour['reponsePHP'] = "La requête n'a retourné aucune donnée...";
            die(json_encode($retour));
        }
     
        //Si la requête est fructueuse on ouvre une session et on précise le rôle de l'utilisateur
        //(banquier ou simple utilisateur : information remontée par la requête ($userRole))
        $row = $result->fetchObject();
     
        if ($result->rowCount() == 0) {
            $retour['reponsePHP'] = 'wrongCredentials';
            die(json_encode($retour));
        } else {
     
            session_start();
            $userRole = $row->userRole;
     
            $_SESSION['loggedIn'] = true;
            $_SESSION['displayName'] = $displayName;
            $_SESSION['userRole'] = $userRole;
     
            //On envoie le type d'utilisateur en réponse pour traitement dans le switch Ajax
            $retour['reponsePHP'] = $userRole;
            die(json_encode($retour));
        }
    }

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    A priori, ne mets pas de "die" dans ta fonction "userCheck" et renvoie le résultat avec des return. Inclus tes "exit" (plutôt que "die" puisque "die" n'est qu'un alias de "exit") dans la page qui appelle cette fonction (loginFormFn.php) suivant les circonstances.

    Aussi, tu peux différencier l'origine d'un appel ajax vers un script php en mettant une variable dans l'url d'appel par exemple $.ajax({url: '/includes/loginForm.php?origin=loginFormjs' ... et ensuite tu peux adapter ton code suivant $_GET['origin'].

    Enfin bref si tu veux qu'une fonction puisse être utilisée dans différents contextes, il faut qu'elle soit générique et n'utilise que des return. C'est ensuite que tu définiras le comportement du script mais pas dans la fonction elle-même (sinon elle n'est plus générique).

    Sinon c'est pas top les variables global dans ta fonction, mais c'est un autre problème.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci beaucoup ABCIWEB pour tes conseils clairs et pertinents !

    Voici où j'en suis :

    Je voudrais utiliser que des bonnes pratiques et donc éviter l'utilisation de variables globales dans le code ...

    Ci dessous ce que j'ai modifié : j'utilise une fonction pour se connecter à la base qui est sensée me permettre de remonter les données et variables de connexion en tant que paramètre pour n'importe quelle autre fonction or, cela ne marche pas, j'ai beau mettre ou retirer '$conn' en paramètre la variable continue à ne pas être lisible dans le code malgré qu'elle est été retournée (toutes les autres variables provenant du require_once 'connexion.php' semblent être disponibles, bizarre !)

    connexion.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    // Connexion à la base de données
    function connexion($conn)
    {
        try {
            $conn = new PDO('mysql:host=localhost;dbname=ECF-Banque', 'root', '');
            $conn->setAttribute(PDO::ATTR_ERRMODE, pdo::ERRMODE_EXCEPTION);
            return $conn;
        } catch (PDOException $e) {
            echo 'Un problème est survenu : impossible de se connecter à la base de données.';
        }
    }
    userCheck.php :

    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
    <?php
    /*Retourne uniquement un nom d'utilisateur pour en vérifier l'existence dans la base
    (fonction devenant disponible aussi dans le formulaire d'inscription)*/
     
    function userCheck()
    {
        try {
            require_once $_SERVER['DOCUMENT_ROOT'] . '/functions-php/connexion.php';
            connexion($conn);
     
            $sql = "SELECT userName from users 
                                    WHERE userName = :displayName
                                    UNION 
                                    SELECT bankerName from bankers 
                                    WHERE bankerName = :displayName";
            $result = $conn->prepare($sql);
            $result->bindValue(':displayName', $displayName, pdo::PARAM_STR);
            $result->execute();
     
            if ($result->rowCount() == 0) {
                $retour["reponsePHP"] = "userDoesNotExists";
                return json_encode($retour);
            } else {
                $retour["reponsePHP"] = "userExists";
                //On retourne la variable pour pouvoir continuer à vérifier le couple user/password
                //dans la fonction checkCredentials()            
                return json_encode($retour);
            };
        } catch (PDOException $e) {
            $e->getMessage();
            die();
        };
    };
    loginFormFn.php

    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
    <?php
    if (isset($_POST['displayNameLogin']) && isset($_POST['userPassword'])) {
     
        $displayName = $_POST['displayNameLogin'];
        $userPassword = $_POST['userPassword'];
     
        require_once $_SERVER['DOCUMENT_ROOT'] . '/functions-php/userCheck.php';
        userCheck();
     
        //Si l'utilisateur est reconnu comme existant alors on continue avec la vérification du couple user/password
        if ($retour['reponsePHP'] == "userExists") {
            require_once $_SERVER['DOCUMENT_ROOT'] . '/functions-php/checkCredentials.php';
            checkCredentials();
        }
    };

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Tu peux utiliser une classe de connexion statique pour faire ta connexion. L'avantage est qu'elle utilise la connexion déjà ouverte si une connexion a déjà été ouverte. Le require sert pour récupérer les variables $hostname, $database, $username et $password dont les valeurs sont définies (dans cet exemple) dans le fichier '/Connexions/base_connexion.php'. Eventuellement tu peux renseigner ces variables directement dans cette classe mais il est plus sécurisé de travailler avec des scripts qui n'exposent pas directement ces variables sensibles.

    L'autre avantage de faire une classe c'est que tu pourrais la mettre dans un fichier distinct et la charger automatiquement avec spl_autoload_register. Mais chaque chose en son temps, tu pourras le faire plus tard si tu veux et supprimer le require vers ce fichier (puisque spl_autoload_register fera l''équivalent).

    Dans tous les cas tu tu peux initialiser la connexion en faisant $conn = C_PDO::getC();
    Code php : 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
    <?php
    class C_PDO 
    {	
    	private static $connexion;
     
    	private function __construct() 
    	{
    		try
    		{	// Fichier dans lequel sont enregistrées les variables de connexion : $hostname, $database, $username et $password
    			require($_SERVER['DOCUMENT_ROOT'] .'/Connexions/base_connexion.php');
     
    			// mode d'erreurs
    			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    			$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;	
    			// Permet d'utiliser l'émulateur pdo spécifique au sgbdd. Indispensable pour éviter que la fonction execute() formate le tableau de valeurs (correspondant aux marqueurs) passés en paramètre en "string"  (sinon bug avec la clause limit)
    			$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
     
    			self::$connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);
    		}
    		catch (PDOException $e)
    		{
    			// message en production
    			exit('Serveur de base de données en dérangement, veuillez réessayer ultérieurement.');
     
    			// message complet en développement
    			//exit($e->getMessage());
    		}
    	}
     
    	public static function getC() 
    	{
    		if(self::$connexion == NULL) {new self();}
    		return self::$connexion;
    	}	 
    }
    ?>

    Et donc attention tu n'avais pas utilisé la bonne syntaxe pour définir ta connexion (même erreur dans les deux scripts)

    Code php : 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
    function userCheck()
    {
        try {
            // A supposé que la classe C_PDO se trouve dans le fichier '/functions-php/connexion.php';
            require_once $_SERVER['DOCUMENT_ROOT'] . '/functions-php/connexion.php';
            $conn = C_PDO::getC();
     
            $sql = "SELECT userName from users 
                                    WHERE userName = :displayName
                                    UNION 
                                    SELECT bankerName from bankers 
                                    WHERE bankerName = :displayName";
            $result = $conn->prepare($sql);
            $result->bindValue(':displayName', $displayName, pdo::PARAM_STR);
            $result->execute();
     
            if ($result->rowCount() == 0) {
                $retour["reponsePHP"] = "userDoesNotExists";
                return json_encode($retour);
            } else {
                $retour["reponsePHP"] = "userExists";
                //On retourne la variable pour pouvoir continuer à vérifier le couple user/password
                //dans la fonction checkCredentials()            
                return json_encode($retour);
            };
        } catch (PDOException $e) {
            $e->getMessage();
            die();
        };
    };

    Notes qu'en mode production il vaudrait mieux remplacer $e->getMessage(); par un message d'erreur plus vague (genre exit('erreur dans la vérification du login');) afin de donner un minimum d'information aux éventuels pirates, ton code actuel dans le catch ne devrait être utilisé qu'en mode développement.

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    les conseils de ABCIWEB sont pertinents.

    Pour l'autoloader : https://www.developpez.net/forums/bl...09/autoloader/

    Pour gérer proprement la bdd MySQL avec PDO : https://www.developpez.net/forums/bl...dutiliser-pdo/ et pour les dernières versions de PDOPlusPlus : https://github.com/rawsrc/PDOPlusPlus.
    Si on utilise cette classe (qui est un bijou), on respecte tous les conseils de ABCIWEB.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Pour l'autoloader : https://www.developpez.net/forums/bl...09/autoloader/

    Pour gérer proprement la bdd MySQL avec PDO : https://www.developpez.net/forums/bl...dutiliser-pdo/ et pour les dernières versions de PDOPlusPlus : https://github.com/rawsrc/PDOPlusPlus.
    Si on utilise cette classe (qui est un bijou), on respecte tous les conseils de ABCIWEB.
    Oui enfin dans un premier temps il vaut mieux commencer par des choses simples pour comprendre le fonctionnement et automatiser si besoin par la suite. J'ai déjà inclus une classe statique dans mon exemple, à mon avis c'est suffisant pour l'instant.

    Pour l'autoloader au début je conseille de faire au plus simple, par exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Charge les classes du dossier Classes (à supposé que Classes soit dans le même répertoire que le script) avec spl_autoload_register*/
    spl_autoload_register(function ($class) {if(is_file('Classes/' . $class . '.php')) require 'Classes/' . $class . '.php';});
     
    /* ou si les classes sont dans plusieurs dossiers, ici Classes et  ClassesPage:*/
    spl_autoload_register(function ($class) {
        if(is_file('Classes/' . $class . '.php')) require 'Classes/' . $class . '.php';
        else
        if(is_file('ClassesPage/' . $class . '.php')) require 'ClassesPage/' . $class . '.php';
    });
    Ensuite si l'on veut aller plus loin et utiliser des namespace, autant se baser sur la convention PSR-4 puisque cela a été conçu par le groupe de travail PHPFIG pour une bonne interopérabilité entre les différents framework PHP.

    Pour le reste je n'ai jamais été un grand fan des classes CRUD, et je déconseille de les utiliser en phase d'apprentissage. A part la connexion qui pouvait être améliorée, les requêtes écrites par clickandgo sont correctes : requêtes préparées exécutées dans un bloc try/cacth, c'est suffisant. Et même pour un niveau plus avancé je n'ai jamais trouvé que l'on gagnait beaucoup à utiliser des classes CRUD pour des requêtes "basiques" (sauf dans le cadre d'un framework qui possède ses conventions). Bien entendu, je dis ça sur le principe, et c'est sans rapport avec la qualité de la classe proposée dans ton lien.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Pour le reste je n'ai jamais été un grand fan des classes CRUD, et je déconseille de les utiliser en phase d'apprentissage.
    pas vraiment d'accord, car ça me permet de faire du PDO sans maîtriser cette technologie.

    Un exemple simple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ppp = new PDOPlusPlus();
     
    $sql="une_requête_SELECT";
     
    $ret = $ppp->select();
    Pas besoin de s'occuper de la connexion à la bdd ; elle est gérée par le constructeur de la classe.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    pas vraiment d'accord, car ça me permet de faire du PDO sans maîtriser cette technologie.

    Un exemple simple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ppp = new PDOPlusPlus();
     
    $sql="une_requête_SELECT";
     
    $ret = $ppp->select();
    Pas besoin de s'occuper de la connexion à la bdd ; elle est gérée par le constructeur de la classe.
    Je parlais de la phase d'apprentissage et apprendre cela veut justement dire chercher à maitriser.

    Quant à ton exemple il n'est pas très convaincant car si je reprend mon exemple c'est pas beaucoup plus long de faire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
    {
        $sql = "une_requête_SELECT";
     
        $result = C_PDO::getC()->query($sql);
    }
    catch (PDOException $e)
    {
        // code à exécuter en cas de problème;
    }
    En fait tu ne gagnes que l'écriture de try/catch (et des accolades correspondantes) qui je suppose doit être inclus dans la classe PDOPlusPlus, mais niveau connexion c'est égal, pas besoin de s'en occuper non plus puisque c'est la classe de connexion C_PDO qui la gère. Et encore une fois, en phase d'apprentissage, c'est bien de voir ce que l'on fait tout en restant au plus près des exemples du manuel php pour mieux comprendre.

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    4h26 ! T'as oublié de dormir ?

    Citation Envoyé par ABCIWEB Voir le message
    Quant à ton exemple il n'est pas très convaincant car si je reprend mon exemple c'est pas beaucoup plus long de faire
    Certes, il était un peu trop simple, mais il équivaut à un peu plus :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try
    {
        $sql = "une_requête_SELECT";
     
        $stmt = C_PDO::getC()->query($sql);//on suppose que la méthode query retourne un PDOStatement
        $result = $stmt->FetchAll();
    }
    catch (PDOException $e)
    {
        // code à exécuter en cas de problème;
    }

    Un exemple un peu plus élaboré :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ppp     = new PDOPlusPlus(PDOPlusPlus::MODE_PREPARE_PARAMS);
    $in  = $ppp->injector(); // injecteur de référence
    $ids = [];
    $sql     = <<<sql
    INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) 
         VALUES ({$in($title)}, {$in($support)}, {$in($multilingual, 'bool')}, {$in($chapter, 'int')}, {$in($year, 'int')}, {$in($summary)}, {$in($stock, 'int')})
    sql;
     
    foreach ($data as $film) {
        extract($film);
        $ids[] = $ppp->insert($sql);    // à la fin : [1, 2, 3] : nos 3 films ont bien été ajoutés
    équivaut à :
    Code php : 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
    <?php
    $pdo = C_PDO::getC(); //Crée un objet PDO qui représente une connexion à la base. 
    $ids = [];
     
    $sql = <<<sql
    INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) 
         VALUES (:title, :support, :multilingual, :chapter, :year, :summary, :stock)
    sql;
    try {
        $stmt = $pdo->prepare($sql);
        // à ce stade on défini des variables ($title, $support...) sans aucune valeur mais avec une existence en mémoire (une simple référence ou adresse mémoire)
        // par la suite notre code ira rattacher des valeurs à ces variables mais PDO ne lira que la valeur contenue à l'adresse mémoire qui a été définie
        $stmt->bindParam(':title', $title, PDO::PARAM_STR);
        $stmt->bindParam(':support', $support, PDO::PARAM_STR);
        $stmt->bindParam(':multilingual', $multilingual, PDO::PARAM_BOOL);
        $stmt->bindParam(':chapter', $chapter, PDO::PARAM_INT);
        $stmt->bindParam(':year', $year, PDO::PARAM_INT);
        $stmt->bindParam(':summary', $summary, PDO::PARAM_STR);
        $stmt->bindParam(':stock', $stock, PDO::PARAM_INT);
     
        foreach ($data as $film) {
            // on déstructure notre tableau pour coller aux variables attendues par bindParam() : $titre, $support...
            // avantageusement les nom des variables correspondent aux noms des clés du tableau $film
            // donc PHP offre un raccourci : extract()
            extract($film); // chaque clé du tableau devient une variable ayant pour valeur celle définie dans le tableau
            // on exécute la requête autant de fois que nécessaire sans l'étape de la préparation
            // à chaque tour de boucle, les valeurs des variables sont mises à jour grâce à extract()
            $stmt->execute();
            $ids[] = $pdo->lastInsertId(); // à la fin : [1, 2, 3] : nos 3 films ont bien été ajoutés
        }
    } catch (PDOException $e) {
        throw $e;
    }
    Cet exemple est tiré du blog de rawsrc. La classe gère elle-même l'échappement des valeurs passées à la requête donc plus besoin des bindValue ou bindParam...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Bonjour à vous ... les experts

    Comme le mentionne ABCIWEB, je préfère pour l'instant m'en tenir aux choses simples / non complètement automatisées car je n'ai pas encore le niveau...

    Cependant je te remercie Laurent et je reviendrai sur tes posts pour faire évoluer mon code...

    Pourriez-vous m'expliquer pourquoi et malgré avoir fait un return de la variable $conn celle-ci n'est toujours pas valide (hors création de classe) en tant que paramètre ?

    Dois-je en déduire que pour qu'une connexion à la bdd soit atteignable dans une fonction externe on serait obligés de passer par une classe ?

    Est-ce le fait de pouvoir déclarer le type de variables dans une classe plus précisément qui la rend pertinente dans un cas comme celui-ci ?.

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par clickandgo Voir le message
    Bonjour à vous ... les experts
    ABCIWEB, ça fait pas de doute, mais moi, mon statut, c'est une sacré supercherie...Même si avec le temps (15 années de développement web), je commence à connaître 2/3 trucs...

    Citation Envoyé par clickandgo Voir le message
    Pourriez-vous m'expliquer pourquoi et malgré avoir fait un return de la variable $conn celle-ci n'est toujours pas valide (hors création de classe) en tant que paramètre ?
    Pour qu'on puisse te répondre, donne ton code de connexion.

    Citation Envoyé par clickandgo Voir le message
    Dois-je en déduire que pour qu'une connexion à la bdd soit atteignable dans une fonction externe on serait obligés de passer par une classe ?
    Pas du tout. Même si la variable qui te permet d'accéder à la bdd est une instance de la classe PDO, le reste du code peut être procédural.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  12. #12
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    ABCIWEB, ça fait pas de doute, mais moi, mon statut, c'est une sacré supercherie...Même si avec le temps (15 années de développement web), je commence à connaître 2/3 trucs...


    Pour qu'on puisse te répondre, donne ton code de connexion.


    Pas du tout. Même si la variable qui te permet d'accéder à la bdd est une instance de la classe PDO, le reste du code peut être procédural.
    Voici le code de connexion qui n'accepte pas de fonctionner dans la fonction externe même en retournant $conn (la variable $conn n'est pas reconnue ...)
    A noter que hors fonction, en tant qu'include la connexion fonctionne parfaitement mais mon but est de rendre cela générique car deux fonctions en ont besoin, userCheck() et checkCredentials.php (voir plus haut):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    // Connexion à la base de données
    function connexion($conn)
    {
        try {
            $conn = new PDO('mysql:host=localhost;dbname=ECF-Banque', 'root', '');
            $conn->setAttribute(PDO::ATTR_ERRMODE, pdo::ERRMODE_EXCEPTION);
            return $conn;
        } catch (PDOException $e) {
            echo 'Un problème est survenu : impossible de se connecter à la base de données.';
        }
    }

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Fais voir le code qui appelle cette fonction, STP.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  14. #14
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Fais voir le code qui appelle cette fonction, STP.
    Bonjour LaurentSC

    Les deux fonctions qui devront utiliser cette fonction de connexion sont en haut dans le premier post (userCheck.php et checkCredentials.php)...

    Je te rappelle mon but premier : décentraliser les données de connexion et les rendre disponibles dans d'autres fonctions externes évitant aussi de ce fait des includes (chacune disposant d'un sql différent...)

    La fonction userCheck() permet de vérifier l'existence de l'utilisateur aussi bien au moment de se loguer sur loginForm.php que sur le formulaire registrationForm.php permettant de prévenir le futur utilisateur que le pseudo existe déjà dans la base, bref du classique ...

    Mon problème étant que la variable $conn n'est pas reconnue dans la fonction usercheck(), les autres variables par contre oui apparament ...

    checkCredentials() est sous l'ancienne forme, avec des globales, je me suis arrêté là en transformant d'abord la fonction userCheck qui sera utilisée par la fonction de connexion... si cela marchait alors j'appliquais la même méthode sur la 2ème...

    A noter que les deux fonctions marchent parfaitement si j'utilise un include contenant les données de connexion mais je voudrais aller plus loin avec les bonnes pratiques...

    Merci à toi d'avance pour ta patience et dévouement

  15. #15
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Au post #4, ABCIWEB t'a proposé la classe de connexion C_PDO. Je t'encourage à l'utiliser.
    Par exemple, pour la fonction userCheck(), ça donnerait :
    Code php : 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
    function userCheck()
    {
        require "connexion.php"; //à faire si on a pas d'autoloader
     
        global $displayName;
        global $retour;  
        //j'ai viré le global $conn;
        $retour = [];
     
        try {
            $conn = C_PDO::getC();
     
            $sql = "SELECT userName from users 
                                    WHERE userName = :displayName
                                    UNION 
                                    SELECT bankerName from bankers 
                                    WHERE bankerName = :displayName";
    etc
    et connexion.php contenant le code donné par ABCIWEB au post #4.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  16. #16
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Une petite remarque au passage: pour pouvoir utiliser deux fois le même placeholder :displayName dans une requête, l'option PDO::ATTR_EMULATE_PREPARES doit être à true.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  17. #17
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par clickandgo Voir le message

    A noter que les deux fonctions marchent parfaitement si j'utilise un include contenant les données de connexion mais je voudrais aller plus loin avec les bonnes pratiques...

    Merci à toi d'avance pour ta patience et dévouement
    Oui donc comme je te le disais au post n°4, la bonne pratique est de faire une classe de connexion, c'est plus pratique et te permettras de faire évoluer ton code plus tard en chargeant cette classe avec un autoloader. Notes bien que la classe que je t'ai montrée est minimaliste, en fait elle fait la même chose que ta fonction avec simplement quelques options supplémentaires et la déclaration utf-8 dans la connexion. L'autre avantage est qu'elle n'établit la connexion qu'une seule fois et se sert de la connexion existante par la suite si tu l'appelles plusieurs fois. Et enfin elle est statique pour des raisons pratiques pour pouvoir l'utiliser directement toujours avec la même syntaxe plutôt que d'avoir à passer par une instanciation de classe.

    Comme expliqué au début de mon post tu n'es pas obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Fichier dans lequel sont enregistrées les variables de connexion : $hostname, $database, $username et $password
    			require($_SERVER['DOCUMENT_ROOT'] .'/Connexions/base_connexion.php');
    En fait mon fichier "base_connexion.php" contient juste les variables $hostname, $database, $username et $password sous la forme (par exemple) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    $hostname = 'localhost'; 
    $database = 'ECF-Banque';
    $username = 'root';
    $password = '';
    ?>
    Donc si tu supprimes le require il te suffit d'écrire en dur ces mêmes variables dans la ligne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    self::$connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);

    Mais évidemment c'est plus sécurisé de ne pas indiquer ces variables sensibles dans un script, et le fait de passer par un fichier qui les contient te permettras de changer uniquement les variables dans ce fichier plutôt que dans la classe de connexion.

    Pour faire un test, recopies le code de cette classe dans un fichier séparé (en utilisant ou non le require) et à la suite du code utilises var_dump() pour contrôler que la connexion est correcte :
    Code php : 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
     
    <?php
    class C_PDO 
    {	
    	private static $connexion;
     
    	private function __construct() 
    	{
    		try
    		{	// Fichier dans lequel sont enregistrées les variables de connexion : $hostname, $database, $username et $password
    			require($_SERVER['DOCUMENT_ROOT'] .'/Connexions/base_connexion.php');
     
    			// mode d'erreurs
    			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    			$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;	
    			// Permet d'utiliser l'émulateur pdo spécifique au sgbdd. Indispensable pour éviter que la fonction execute() formate le tableau de valeurs (correspondant aux marqueurs) passés en paramètre en "string"  (sinon bug avec la clause limit)
    			$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
     
    			self::$connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);
    		}
    		catch (PDOException $e)
    		{
    			// message en production
    			exit('Serveur de base de données en dérangement, veuillez réessayer ultérieurement.');
     
    			// message complet en développement
    			//exit($e->getMessage());
    		}
    	}
     
    	public static function getC() 
    	{
    		if(self::$connexion == NULL) {new self();}
    		return self::$connexion;
    	}	 
    }
     
    var_dump(C_PDO::getC());
    ?>

    Quand cela fonctionnera tu pourras utiliser cette classe à la place de ta fonction, et faire C_PDO::getC(); depuis n'importe où dans ton code pour établir une connexion. Je t'ai montré un exemple d'utilisation dans la deuxième partie du poste n°4.

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Une petite remarque au passage: pour pouvoir utiliser deux fois le même placeholder :displayName dans une requête, l'option PDO::ATTR_EMULATE_PREPARES doit être à true.
    Merci j'ignorais complètement ce détail (je n'utilise quasiment jamais de placeholder). Et cela ne pose plus de problèmes dans le cas d'utilisation de marqueurs dans la clause limit ?

  19. #19
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Je viens de réaliser que le code que j'avais donné au post #15 était faux (ligne 11) vu que j'instanciais une classe "statique". J'ai corrigé.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  20. #20
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    D'après ce que j'en ai compris (en mode PDO::ATTR_EMULATE_PREPARE à true):
    • si tu utilises PDOStatement::bindValue avec PDO::PARAM_INT et en veillant à ce que la valeur soit bien de type int, tout va bien.
    • par contre PDOStatement::execute() avec un tableau associatif, il semblerait que tu puisses oublier.


    À vérifier.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. déclencher une fonction ASP en Jscript
    Par zooffy dans le forum ASP
    Réponses: 4
    Dernier message: 31/01/2007, 14h04
  2. Impossible d'éxecuter une fonction
    Par lahilla dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/12/2006, 11h52
  3. Réponses: 3
    Dernier message: 11/07/2006, 17h45
  4. Réponses: 29
    Dernier message: 09/02/2006, 17h11
  5. DAO impossible d'utiliser une fonction dans un requete
    Par exter666 dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/09/2005, 17h15

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