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

PHP & Base de données Discussion :

Quel est la meilleur pratique pour créer un systeme d'authentification lié à des BDs [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Quel est la meilleur pratique pour créer un systeme d'authentification lié à des BDs
    Bonjour tous,

    J'ai créé une base donnée avec plusieurs tables liées. Une base de donné est attribuée un un client, qui peut avoir plusieurs comptes pour le personnelle.
    Si j'ai un autre client (dans l'agriculture), je souhaite qu'il ait sa base de données qui sera en fait un duplica de la première dans les données (mesures des sols).
    L'URL pour les clients sera
    J'aimerais que lorsqu'un client s'authentifie (client1 , par exemple) il soit redirigé vers http://client1.monsite.ch et surtout que la bonne bose base de donnée soit lié à client1.monsite.ch

    Je me demande quel est la meilleur pratique.

    Est-ce que je crée un table 'base de donnée' ou je renseigne le nom d'utilisateur, le mot de passe, et le nom du fichier de configuration attribuée à l'utilisateur, pour charger la bonne base de donnée

    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
     
    <?php
     
        include(dirname(__FILE__).'/db_config_client1.php');
     
    	$connect = mysqli_connect($hote,$user,$password,$base) or die('Erreur de connexion '.mysql_error());
     
    	// Check connection
    	if (mysqli_connect_errno())
      	{
      		echo "Failed to connect to MySQL: " . mysqli_connect_error();
      	}
     
    ?>

    Puis dans ma base de donnée 'db_client1', je crée un table utilisateur uniquement pour le client (ca me semble déjà complexe d'avoir deux tables d'utilsateurs.

    Ou alors je crée un formulaire avec trois champs 'email', 'password', 'client'. A l'envoi du formulaire, le code PHP va se renseigner sur le nom du client et charger la bonne base de données pour l'authentification, ce qui me semble plus raisonnable.

    Si non, comment font les hébergeurs web, pour que lorsque l'on se log, on est dirigé vers les base de données de notre compte.

    Voilà, avant de commencer, je voulais avoir des conseils pour bien commencer.

    Merci pour vos lumières.
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    En fait il n'est pas absolument nécéssaire d'avoir
    client1.monsite.ch
    client2.monsite.ch
    on peut tres bien avoir, par exmple

    pour tous les clients
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Il n'est pas nécessaire d'avoir une base de données par client si les structures des données sont identiques d'un client à l'autre, à moins que tu ne doives satisfaire des normes extrêmement strictes.

    Ce sera un cauchemar si tu as 100 clients et qu'il faut modifier la structure des tables et qu'il faut faire des migrations ou des modifications des données existantes, sans compter que tu dois jongler avec 100 username, password et nom de base.

    Il faut faire plus simple:

    - une table client, qui représente les données d'identification du client, le plus simple étant: id, nom.
    - une table compte, qui représente les données des employés qui peuvent accéder à la table client, et qui contient une clé étrangère ves la table client. id, login, password, client_id (la clé étrangère)
    - une ou plusieurs tables pour les données réelles (les mesures des sols), et qui contient une clé étrangère vers la table client. id, client_id, donnees1, donnees2...

    Quand un employé se connecte (avec son propre login et mot de passe), tu regarde la valeur de la clé étrangère pour décider à quel client il a le droit d'accéder (puisque la clé étrangère client_id doit corresponder à un id d'un client)

    Puis ensuite tu récupères toutes les données (mesures des sols) depuis leurs tables en utilisant la valeur de la clé étrangère, puisque la clé étrangère client_id doit corresponder à un id d'un client. Et à chaque fois que tu crées une nouvelle table, tu dois rajouter une clé étrangère client_id à cette table, que tu utiliseras ensuite dans tes select, insert et update pour séparer les données de chaque client.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il n'y a pas de "bonne méthode" universelle.
    La "bonne méthode" à appliquer dépend avant tout de tes besoins (du "cahier des charges").

    1- D'abord, il faut définir clairement ce que tu entends par "client", ainsi que ses droits et privilèges.
    • doit-il avoir une gestion totalement indépendante de "son site" ?
    • doit-il pouvoir accéder à sa base de données via phpMyAdmin ? Pouvoir la télécharger ?

    • Si oui, alors il faut effectivement créer une base de données PAR client.
    • Si non, alors une seule base peut suffire (cf. message de Tsilefy)

    2- Le "site client" :
    • est-ce une sorte de portail, avec des "sous-rubriques" (un par client), et un accès client du genre "Espace membre/client" ?
    • ou des sites bien distincts et indépendants (à l'instar des "sites perso" de free.fr) ?

    • client1.monsite.ch, client2.monsite.ch : donc, chaque client aurait un sous-domaine de ton site www.monsite.ch ?
    • http(s)*://[/url]dashboard.monsite.ch : là, tous les clients ont accès à leur panel admin via une seule interface : il te faut UNE SEULE table de connexion** pour tous tes clients

    * Il faut au minimum que les sites soient en https.

    ** table de connexion : ça, c'est une table de TON admin PERSO, à laquelle les clients NE doivent PAS avoir accès !
    • login_client
    • mdp_client (hash)
    • sous_domaine_name
    • bdd_name
    • bdd_login
    • bdd_mdp (hash)
    • ....
    • date_last_connect
    • ...
    Dernière modification par Invité ; 28/09/2019 à 10h59.

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour,
    Merci pour vos réponses. Je pense que je cherche à faire trop compliqué.

    Pour répondre à certaines questions. Un client est un agriclteur qui a plusieurs parcelles. Donc plusieurs stations.
    Au départ, je voulais faire une base de données par client, pour discocier les données récoltées et les stations. Car en effet, un client peut avoir 2 stations, plus ou moins de sondes, vouloir des couleurs différentes (paramétrage).


    Dans cette optiques je pense clairement qu'il faudrait avoir plusieurs base de données par client. Mais après, en effet, la gestion , galère. Surtout si une fois je dois ajouter un champs dans une table.

    Idem pour le site internet. Je préfère avoir dashboard.monsite.ch que clientX.monsite.ch. Ainsi le client s'authentifie et il est chargé que les données du client.

    Le client n'aura pas accès au PhPadmin. Il aura une interface web pour gérer ses parcelles, stations, sondes. Et s'il quitte, je pourrais développer un petit code, pour qu'il parte avec ses mesures en format xml, par exemple.

    Donc je me dis qu'une base de données pour tous les clients, pourquoi pas finalement, ca me sera aussi plus facile à développer les comptes en créant une nouvelle table associée au parcelles.

    N'est-ce pas?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Une base de données unique pour tous les clients conviendra parfaitement.

    Je te conseille également d'apprendre les types de relations/associations ainsi que la normalisation des bases de données car ça te sera beaucoup utile et t'évitera beaucoup de travail inutile.

    Enfin, tu peux absolument utiliser clientX.monsite.ch si tu veux en créant un sous-domaine wildcard (*) dans tes enregistrements DNS et dans la configuration du serveur (Apache ou Nginx ou autre). Tu peux ensuite récupérer le sous-domaine (clientX) dans PHP (avec $_SERVER['HTTP_HOST']) et l'utiliser dans un SELECT (après authentification) pour retrouver les données du client.

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Merci beaucoup pour vos clarifications.
    Je vais me pencher la dessus demain, durant mes 3 heures de voyages dans le train
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Je pensais faire comme cela

    Nom : Screenshot 2019-10-01 at 18.09.44.png
Affichages : 203
Taille : 975,8 Ko

    Ainsi je pourrais attribuer plusieurs utilisateurs à un champs, et un utilisateur pourra avoir plusieurs champs.

    Par contre, je ne vais écraser ma base de donnée existantes et je créerai les deux nouvelles tables. Que me conseillerez-vous de faire en terme d'indexation?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    On ne peut pas savoir à l'avance ce qu'il faut indexer, tout dépend des requêtes que tu vas écrire.

    En principe, tout ce qui est utilisé comme critère dans un WHERE (Select, Update), ON (jointures), ORDER BY sont des candidats pour l'indexation, encore faut-il vérifier ensuite que MySQL les utilise bien.

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    La question que je me pose maintenant concerne la table 'fields_has_users' (n:m identifying relationship)

    Un site peut avoir plusieurs utilisateur
    Un utilisateur peut avoir plusieurs site.

    Si j'ai cinq site et trois utilisateurs

    Ma table 'fields_has_users' peut etre remplie de la sorte

    fields_id_field - users_is_user

    1-1
    1-3
    2-1
    2-3
    2-3
    3-1
    3-2

    Est-ce qu'il est nécessaire d'ajouter un champs id qui est non null, primary et autoincrement ? (id_fields_has_field)
    Ceci de manière à avoir une colonne avec des valeurs unique de 1 à x.
    Images attachées Images attachées  
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Non. Tu peux utiliser fields_id_field et users_id_user comme clé primaire composite.

    En pratique, je mets toujours une clé primaire séparée sauf si je sais que cette table n'évoluera jamais. Ce genre de table jointe a tendance à grandir.

    Un cas typique est l'ajout d'une colonne "active", pour déterminer si l'utilisateur a accès à ce fields ou pas, en fonction de certains critères (paiement d'un abonnement par exemple). Ou encore d'un champ "created_at" ou "updated_at", et on se retrouve avec une "vraie" table, qui va être associée par clé étrangère à une autre table etc...

    Dans ce cas, je mets une clé primaire séparée (autoincrement ou autre), et utilise les deux autres ids comme index unique.

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Hello, merci pour ta réponse.

    Alors j'ai une nouvelle question, qu'est-ce qu'une clé primaire composite?
    Est-ce mettre des deux champs en cochant "clé prinaire"? (c'est déjà le cas)
    J'ai supprimé donc le champs (id_fields_has_users)

    Dans mon tableau 'users' j'ai prévu un champs 'user_active'

    Mon tableau 'fields' est en fait, ce que j'ai défini précédemment un Site. Donc l'utilisateur 2 à accès au site (field) 3, dans le tableau 'fields_has_users' il y aura
    3-2
    S'il n'a plus accès, cette ligne sera supprimé. Est-ce bien?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Oui, une clé composite utilise deux ou plusieurs colonnes. C'est utilisé lorsque ces deux colonnes sont toujours utilisés ensemble comme critère de recherche.

    Oui, tu peux supprimer la ligne dans fields_has_users puisque la relation n'existe plus.

  14. #14
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour
    J'arrive pas à comprendre pourquoi mon deuxième insert (dans la boucle foreach) me retourne une erreur MySQL sur ma table 'fields_has_users'

    Voici mon code

    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
    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
     
     
    		if($form->errors()) {
    			//print_r($form->errors());
    			echo '<pre>';
    			echo $form->messages();
    			echo '</pre>';
    		}
    		else
    		{
    			// Prepare the request
                $sql_user ='INSERT into users (
                        	id_user,
                            roles_id_role,
                            user_email,
                            user_mdp,
                            user_active,
                            user_create,
                            user_lastlogin,
                            user_failedlogin
                            )VALUES (
                            "",
                            "'.$roles.'",
                            "'.$email.'",
                            "'.$pwd_h.'",
                            "0",
                            "'.gmdate("Y-m-d H:i:s").'",
                            "0000-00-00 00:00:00",
                            "0"
                );';
     
    			echo '<pre>';
                print_r($sql_user);
                echo '</pre>';
     
     
                try{
     
                    if (!$connect->query($sql_user) )
                    {
                    	echo "<h4>ERROR user</h4>";
                        echo $connect->error;
                        $lastUser_inserted = 0;
                        exit();
                    }
                    else
                    {
                    	$lastUser_inserted = $connect->insert_id;
                    }
                }catch(Exception $e){
                	echo 'Exception reçue : ',  $e->getMessage(), "\n";
                }
     
    //            echo $lastUser_inserted;
     
     
     
                foreach ($field as $key => $values) {
     
                	$sql_fields = 'INSERT into fields_has_users {
                				fields_id_field,
                				users_id_user
                			}VALUES{
                				"'.$values.'",
                				"'.$lastUser_inserted.'"
                			};';
     
     
        			echo '<pre>';
        			print_r($sql_fields);
        			echo '</pre>';
        			try{
     
    	                if (!$connect->query($sql_fields) )
    	                {
    	            	    echo "<h4>ERROR fields</h4>";
    	                    echo $connect->error;
    	                    exit();
    	                }
    	            }catch(Exception $e){
    	            	echo 'Exception reçue : ',  $e->getMessage(), "\n";
    	            }
                }
     
     
        	echo '<h3>Saved</h3>';
     
    		}

    ERROR fields
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ fields_id_field, users_id_user ' at line 1
    J'ai beau avoir comparer les deux INSERT, je ne vous pas d'erreur de syntaxe

    $filed est bien un array. Est-ce la boucle foreach qui cause un problème? Est-ce le type de champs (int(4))?

    Voici le $_POST qui conteint le field

    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
     
    Array
    (
        [fname] => Sssss
        [lname] => Rrrrrr
        [email] => sssss@ccccc.ch
        [pwd] => San
        [pwd_conf] => San
        [field] => Array
            (
                [0] => 1
                [1] => 2
            )
     
        [roles] => 2
        [submit] => Submit
    )


    Code PHPH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $field = $form->post('field','Field',''); // recuper la valuer du champs field
    print_r($field);
    m'affiche
    Array
    (
    [0] => 1
    [1] => 2
    )
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  15. #15
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Salut,

    Des accolades {} dans la requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {fields_id_field,users_id_user}...
    Il faut les remplacer par des parenthèses, attention à ce que tu fais.

  16. #16
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Ha mais oui, grrrr Faut que change de lunnette
    Merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel est le meilleur SGBD pour Delphi ?
    Par Giovanny Temgoua dans le forum Bases de données
    Réponses: 58
    Dernier message: 02/04/2020, 20h21
  2. Quel est le meilleur langage pour la portabilité : Windows & Linux (voire Mac) ?
    Par iubito dans le forum Débats sur le développement - Le Best Of
    Réponses: 57
    Dernier message: 26/11/2007, 23h45
  3. Quel est le meilleur EDI pour C++ ?
    Par ecnirp dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 23/05/2006, 02h42
  4. Réponses: 9
    Dernier message: 13/05/2006, 23h43
  5. quel est le Meilleur language pour piloter le port serie ?
    Par flyfab dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 21/07/2003, 10h03

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