Aide pour bridger des tables utilisateurs de 2 cms

Bonjour,
je cherche à relier les utilisateurs de deux scripts php différents
et je ne sais pas comment faire.
Il me semble qu'avec la requête sql join c'est possible de dire à la base de données de considérer les deux tables users en une mais le noms des colonnes ne correspondent pas :
Je voudrais que les utilisateurs soient inscrit depuis l'un ou l'autre script.
Dans la table de données je trouve les colonnes :

id user name email password created modified isAdmin status photoURL lastLogin recoverPass backgroundURL

dans la base de donnée ou se trouvent les utilisateurs à conserver j'ai trouvé des colonnes qui correspondent :
uid uname name email pass user_regtime user_lastvisit url

comment faire pour que :

id = uid

user = uname

name = uname

email à déjà le même nom

password = pass

et pour que les enregistrement ne s'écrasent pas.
Est-ce la bonne méthode ?
J'ai aussi pensé à un fichier php qui ferait le lien entre les deux bases mais je ne saurais pas comment faire non plus.

le serveur en question est sous mysql 5.6 php 5.6

Merci d'avance pour votre aide

5 réponses

Résumé de la discussion

La fusion de deux tables d'utilisateurs issues de deux scripts PHP et leurs colonnes divergentes soulève la question de les traiter comme une seule base logique. Plusieurs interventions évoquent l’utilisation de UNION ALL pour aligner les colonnes par alias et éviter l’écrasement tout en restant sur une requête sans table nouvelle. D’autres échanges indiquent que UNION ne crée pas de table ni de vue et qu’il faut une correspondance stricte des noms et des types de colonnes, ou une vue intermédiaire. En pratique, mapper les colonnes avec AS et envisager une vue unifiant les deux ensembles permet de préserver l’indépendance des scripts tout en facilitant l’accès.

Bobot (l’IA à votre service)
  1. Contributeur Ambassadeur
    bonsoir, voudrais-tu créer une nouvelle table qui reprendrait le contenu des deux autres?
    ou bien voudrais-tu garder deux tables, mais les utiliser comme si tout était dans une seule?
    0
    1. Modérateur
      Bonjour,

      comment faire pour que :

      id = uid

      user = uname

      name = uname

      email à déjà le même nom

      password = pass

      Quand tu fais ta requête ... tu peux utiliser des ALIAS pour les champs...

      par exemple
      SELECT champ1 , champ2
      FROM table1
      UNION
      SELECT toto3 as champ1,  truc4 as champ2
      FROM table2
      


      Il faut, bien entendu, que le USER utilisé pour accéder aux données (dans tes deux BDD) aient les droits pour accéder à ces deux bases / tables

      0
      1. Merci pour vos réponses :)

        Oui yg_be , je voudrais garder les deux tables et qu'elles fonctionnent comme si elles étaient dans une seule ce qui je suppose m'éviterai d'avoir à modifier les scripts et si une autre solution est possible je veux bien essayer.

        oui jordan sa à l'air d'être sa,
        mais hélas cela ne fonctionne pas
        Quand j'entre :

        SELECT id , user , name , email , password
        FROM table1_users
        UNION
        SELECT uid as id, user as uname, name as uname, password as pass
        FROM table2_users


        voici ce que me répond le serveur :


        MySQL déclare:
        Unknown column 'user' in 'field list'

        Erreur de demande:
        SELECT id , user , name , email , password FROM table1_users UNION SELECT uid as id, user as uname, name as uname, password as pass FROM table2_users LIMIT 0, 30;


        Pourtant, la colonne user existe bien en deuxième position après id dans la table 1.

        Je ne comprends donc pas pourquoi cela ne fonctionne pas
        0
        1. Modérateur
          Et dans ta table 2 ??
          N'as tu pas inversé les ALIAS et les noms de champs ????
          0
        2. non, je ne crois pas, j'ai fait comme dans l'exemple.
          j'ai essayé l'inverse et là c'est la première colonne qu'il ne trouve pas.
          pour


          SELECT id,user,name,email,password
          FROM _table1_users
          UNION
          SELECT id as uid, uname as user, uname as name, pass as password
          FROM table2_users


          j'ai

          MySQL déclare:
          Unknown column 'id' in 'field list'

          Erreur de demande:
          SELECT id,user,name,email,password FROM table1_users UNION SELECT id as uid, uname as user, uname as name, pass as password FROM table2_users LIMIT 0, 30;
          0
        3. Modérateur
          Donc ... NON... tu ne l'avais pas fait comme dans l'exemple.
          Maintenant c'est mieux.
          Par contre .. en table2 .. le champ c'est id ou uid ?
          0
        4. En fait table 1 :
          id user name email password
          table 2
          uid uname name email pass
          note :
          les deux tables ont plus de colonnes que celles ci-dessus mais je pense que c'est suffisant pour que les utilisateurs soient connectés.
          la table 2 à plus de colonnes que la colonne 1
          je sais pas si sa change quelque chose à la requête
          0
        5. Modérateur
          @tradezone.frLe nombre de champs... peu importe
          Par contre... le nom des champs que tu cites ne sont pas ceux que tu as mis dans ta requête.... relis toi....
          Regarde ta requête
          SELECT id,user,name,email,password 
          FROM table1_users
           UNION 
          SELECT id as uid, uname as user, uname as name, pass as password 
          FROM table2_users 
          LIMIT 0, 30;
          
          0
      2. Contributeur Ambassadeur
        et ainsi?
        SELECT id , user , name , email , password
        FROM table1_users
        UNION
        SELECT uid, uname, uname, email, pass 
        FROM table2_users 
        0
        1. Merci pour votre aide :)
          J'ai bien essayé le code :

          SELECT id , user , name , email , password
          FROM table1_users
          UNION
          SELECT uid, uname, uname, email, pass
          FROM table2_users

          Tout à l'air d'avoir fonctionné donc je suis perdu.
          La requête fonctionne bien, mysqldumper me fait même un rapport de réussite ci dessous.
          Table `bdd`.`users UNION`
          Enregistrements 1 - 2 d'un total de 2 << < > >>
          View: compact L'intérrogation contient 5 colonnes
          # id user name email password
          supprimer 1. 2 letesteur letesteur letesteur@letesteur.org 26b637ed41273425be
          supprimer 2. 6 svanja svanja svanja@tradezone.fr ccmtest


          Par contre impossible de retrouver l'union ensuite.
          Les données de l'autre n'apparaissent dans aucune des deux tables.

          Je pensait qu'une nouvelle table avec un nom différent (`users UNION` comme mentionné au dessus) avait peut-être été créé mais non.
          Je me suis dit que l'union utilise les deux tables sans les lier physiquement mais quand j'essaye de me connecter avec un des scripts il me dit que l'utilisateur n'existe pas.
          0
          1. Modérateur
            Je pensait qu'une nouvelle table avec un nom différent (`users UNION` comme mentionné au dessus) avait peut-être été créé mais non.

            Non. Ca ne créé pas de table... ni de vue....
            Ca exécute simplement une requête qui liste les users de tes deux tables.... rien de plus.

            ais quand j'essaye de me connecter avec un des scripts il me dit que l'utilisateur n'existe pas.

            Et à quoi ressemble le script ?
            Quelle requête lance t-il ?
            0
          2. Le script est visible ici :
            http://www.tradezone.fr/modules/Streaming
            ci dessous voici le fichier user.php
            <?php
            if (empty($global['systemRootPath'])) {
            $global['systemRootPath'] = '../';
            }
            require_once $global['systemRootPath'] . 'videos/configuration.php';
            require_once $global['systemRootPath'] . 'objects/bootGrid.php';

            class User {

            private $id;
            private $user;
            private $name;
            private $email;
            private $password;
            private $isAdmin;
            private $canStream;
            private $canUpload;
            private $status;
            private $photoURL;
            private $backgroundURL;
            private $recoverPass;
            private $userGroups = array();

            function __construct($id, $user = "", $password = "") {
            if (empty($id)) {
            // get the user data from user and pass
            $this->user = $user;
            if ($password !== false) {
            $this->password = $password;
            } else {
            $this->loadFromUser($user);
            }
            } else {
            // get data from id
            $this->load($id);
            }
            }

            function getEmail() {
            return $this->email;
            }

            function getUser() {
            return $this->user;
            }
            function getPassword() {
            return $this->password;
            }
            function getCanStream() {
            return $this->canStream;
            }
            function setCanStream($canStream) {
            $this->canStream = $canStream;
            }
            function getCanUpload() {
            return $this->canUpload;
            }

            function setCanUpload($canUpload) {
            $this->canUpload = $canUpload;
            }

            private function load($id) {
            $user = self::getUserDb($id);
            if (empty($user))
            return false;
            foreach ($user as $key => $value) {
            $this->$key = $value;
            }
            return true;
            }

            private function loadFromUser($user) {
            $user = self::getUserDbFromUser($user);
            if (empty($user))
            return false;
            foreach ($user as $key => $value) {
            $this->$key = $value;
            }
            return true;
            }

            function loadSelfUser() {
            $this->load($this->getId());
            }

            static function getId() {
            if (self::isLogged()) {
            return $_SESSION['user']['id'];
            } else {
            return false;
            }
            }

            function getBdId() {
            return $this->id;
            }

            static function updateSessionInfo() {
            if (self::isLogged()) {
            $user = self::getUserDb($_SESSION['user']['id']);
            $_SESSION['user'] = $user;
            }
            }

            static function getName() {
            if (self::isLogged()) {
            return $_SESSION['user']['name'];
            } else {
            return false;
            }
            }

            static function getUserName() {
            if (self::isLogged()) {
            return $_SESSION['user']['user'];
            } else {
            return false;
            }
            }
            /**
            • return an name to identify the user * @return String */ static function getNameIdentification(){ if(self::isLogged()){ if(!empty(self::getName())){ return self::getName(); } if(!empty(self::getMail())){ return self::getMail(); } if(!empty(self::getUserName())){ return self::getUserName(); } } return __("Unknown User"); } /** * return an name to identify the user from database * @return String */ function getNameIdentificationBd(){ if(!empty($this->name)){ return $this->name; } if(!empty($this->email)){ return $this->email; } if(!empty($this->user)){ return $this->user; } return __("Unknown User"); } static function getUserPass() { if (self::isLogged()) { return $_SESSION['user']['password']; } else { return false; } } function _getName(){ return $this->name; } static function getPhoto($id = "") { global $global; if (!empty($id)) { $user = self::findById($id); if (!empty($user)) { $photo = $user['photoURL']; } } elseif (self::isLogged()) { $photo = $_SESSION['user']['photoURL']; } if(!empty($photo) && preg_match("/videos\/userPhoto\/.*/", $photo)){ $photo = $global['webSiteRootURL'].$photo; } if (empty($photo)) { $photo = $global['webSiteRootURL'] . "img/userSilhouette.jpg"; } return $photo; } static function getMail() { if (self::isLogged()) { return $_SESSION['user']['email']; } else { return false; } } function save($updateUserGroups = false) { global $global; if (empty($this->user) || empty($this->password)) { die('Error : ' . __("You need a user and passsword to register")); } if (empty($this->isAdmin)) { $this->isAdmin = "false"; } if (empty($this->canStream)) { $this->canStream = "false"; } if (empty($this->canUpload)) { $this->canUpload = "false"; } if (empty($this->status)) { $this->status = 'a'; } if (!empty($this->id)) { $sql = "UPDATE users SET user = '{$this->user}', password = '{$this->password}', email = '{$this->email}', name = '{$this->name}', isAdmin = {$this->isAdmin},canStream = {$this->canStream},canUpload = {$this->canUpload}, status = '{$this->status}', photoURL = '{$this->photoURL}', backgroundURL = '{$this->backgroundURL}', recoverPass = '{$this->recoverPass}' , modified = now() WHERE id = {$this->id}"; } else { $sql = "INSERT INTO users (user, password, email, name, isAdmin, canStream, canUpload, status,photoURL,recoverPass, created, modified) VALUES ('{$this->user}','{$this->password}','{$this->email}','{$this->name}',{$this->isAdmin}, {$this->canStream}, {$this->canUpload}, '{$this->status}', '{$this->photoURL}', '{$this->recoverPass}', now(), now())"; } //echo $sql; $insert_row = $global['mysqli']->query($sql); if ($insert_row) { if (empty($this->id)) { $id = $global['mysqli']->insert_id; } else { $id = $this->id; } if ($updateUserGroups) { require_once './userGroups.php'; // update the user groups UserGroups::updateUserGroups($id, $this->userGroups); } return $id; } else { die($sql . ' Error : (' . $global['mysqli']->errno . ') ' . $global['mysqli']->error); } } function delete() { if (!self::isAdmin()) { return false; } // cannot delete yourself if (self::getId() === $this->id) { return false; } global $global; if (!empty($this->id)) { $sql = "DELETE FROM users WHERE id = {$this->id}"; } else { return false; } $resp = $global['mysqli']->query($sql); if (empty($resp)) { die('Error : (' . $global['mysqli']->errno . ') ' . $global['mysqli']->error); } return $resp; } function login($noPass = false, $encodedPass=false) { if ($noPass) { $user = $this->find($this->user, false, true); } else { $user = $this->find($this->user, $this->password, true, $encodedPass); } if ($user) { $_SESSION['user'] = $user; $this->setLastLogin($_SESSION['user']['id']); } else { unset($_SESSION['user']); } } private function setLastLogin($user_id) { global $global; if (empty($user_id)) { die('Error : setLastLogin '); } $sql = "UPDATE users SET lastLogin = now(), modified = now() WHERE id = {$user_id}"; return $global['mysqli']->query($sql); } static function logoff() { unset($_SESSION['user']); } static function isLogged() { return !empty($_SESSION['user']); } static function isAdmin() { return !empty($_SESSION['user']['isAdmin']); } static function canStream() { return !empty($_SESSION['user']['isAdmin']) || !empty($_SESSION['user']['canStream']); } function thisUserCanStream() { return !empty($this->isAdmin) || !empty($this->canStream); } private function find($user, $pass, $mustBeactive = false, $encodedPass=false) { global $global; $user = $global['mysqli']->real_escape_string($user); $sql = "SELECT * FROM users WHERE user = '$user' "; if ($mustBeactive) { $sql .= " AND status = 'a' "; } if ($pass !== false) { if (!$encodedPass || $encodedPass === 'false') { $pass = md5($pass); } $sql .= " AND password = '$pass' "; } $sql .= " LIMIT 1"; $res = $global['mysqli']->query($sql); if ($res) { $user = $res->fetch_assoc(); } else { $user = false; } return $user; } static private function findById($id) { global $global; $sql = "SELECT * FROM users WHERE id = '$id' LIMIT 1"; $res = $global['mysqli']->query($sql); if ($res) { $user = $res->fetch_assoc(); } else { $user = false; } return $user; } static private function getUserDb($id) { global $global; $id = intval($id); $sql = "SELECT * FROM users WHERE id = $id LIMIT 1"; $res = $global['mysqli']->query($sql); if ($res) { $user = $res->fetch_assoc(); } else { $user = false; } return $user; } static private function getUserDbFromUser($user) { global $global; $sql = "SELECT * FROM users WHERE user = '$user' LIMIT 1"; $res = $global['mysqli']->query($sql); if ($res) { $user = $res->fetch_assoc(); } else { $user = false; } return $user; } function setUser($user) { $this->user = strip_tags($user); } function setName($name) { $this->name = strip_tags($name); } function setEmail($email) { $this->email = strip_tags($email); } function setPassword($password) { if (!empty($password)) { $this->password = md5($password); } } function setIsAdmin($isAdmin) { if (empty($isAdmin) || $isAdmin === "false") { $isAdmin = "false"; } else { $isAdmin = "true"; } $this->isAdmin = $isAdmin; } function setStatus($status) { $this->status = strip_tags($status); } function getPhotoURL() { return $this->photoURL; } function setPhotoURL($photoURL) { $this->photoURL = strip_tags($photoURL); } static function getAllUsers() { if (!self::isAdmin()) { return false; } //will receive //current=1&rowCount=10&sort[sender]=asc&searchPhrase= global $global; $sql = "SELECT * FROM users WHERE 1=1 "; $sql .= BootGrid::getSqlFromPost(array('name', 'email', 'user')); $res = $global['mysqli']->query($sql); $user = array(); require_once $global['systemRootPath'] . 'objects/userGroups.php'; if ($res) { while ($row = $res->fetch_assoc()) { $row['groups'] = UserGroups::getUserGroups($row['id']); $row['tags'] = self::getTags($row['id']); $user[] = $row; } //$user = $res->fetch_all(MYSQLI_ASSOC); } else { $user = false; die($sql . '\nError : (' . $global['mysqli']->errno . ') ' . $global['mysqli']->error); } return $user; } static function getTotalUsers() { if (!self::isAdmin()) { return false; } //will receive //current=1&rowCount=10&sort[sender]=asc&searchPhrase= global $global; $sql = "SELECT id FROM users WHERE 1=1 "; $sql .= BootGrid::getSqlSearchFromPost(array('name', 'email', 'user')); $res = $global['mysqli']->query($sql); return $res->num_rows; } static function userExists($user) { global $global; $user = $global['mysqli']->real_escape_string($user); $sql = "SELECT * FROM users WHERE user = '$user' LIMIT 1"; $res = $global['mysqli']->query($sql); if ($res->num_rows > 0) { $user = $res->fetch_assoc(); return $user['id']; } else { return false; } } static function createUserIfNotExists($user, $pass, $name, $email, $photoURL, $isAdmin = false) { global $global; $user = $global['mysqli']->real_escape_string($user); if (!$userId = self::userExists($user)) { if (empty($pass)) { $pass = rand(); } $pass = md5($pass); $userObject = new User(0, $user, $pass); $userObject->setEmail($email); $userObject->setName($name); $userObject->setIsAdmin($isAdmin); $userObject->setPhotoURL($photoURL); $userId = $userObject->save(); return $userId; } return false; } function getRecoverPass() { return $this->recoverPass; } function setRecoverPass($recoverPass) { $this->recoverPass = $recoverPass; } static function canUpload() { global $global, $config; if ($config->getAuthCanUploadVideos()) { return self::isLogged(); } if(self::isLogged() && !empty($_SESSION['user']['canUpload'])){ return true; } return self::isAdmin(); } static function canComment() { global $global, $config; if ($config->getAuthCanComment()) { return self::isLogged(); } return self::isAdmin(); } function getUserGroups() { return $this->userGroups; } function setUserGroups($userGroups) { if (is_array($userGroups)) { $this->userGroups = $userGroups; } } function getIsAdmin() { return $this->isAdmin; } function getStatus() { return $this->status; } /** * * @param type $user_id * text * label Default Primary Success Info Warning Danger */ static function getTags($user_id){ $user = new User($user_id); $tags = array(); if ($user->getIsAdmin()) { $obj = new stdClass(); $obj->type = "info"; $obj->text = __("Admin"); $tags[] = $obj; } else { $obj = new stdClass(); $obj->type = "default"; $obj->text = __("Regular User"); $tags[] = $obj; } if ($user->getStatus() == "a") { $obj = new stdClass(); $obj->type = "success"; $obj->text = __("Active"); $tags[] = $obj; } else { $obj = new stdClass(); $obj->type = "danger"; $obj->text = __("Inactive"); $tags[] = $obj; } require_once 'userGroups.php'; $groups = UserGroups::getUserGroups($user_id); foreach ($groups as $value) { $obj = new stdClass(); $obj->type = "warning"; $obj->text = $value['group_name']; $tags[] = $obj; } return $tags; } function getBackgroundURL() { if (empty($this->backgroundURL)) { $this->backgroundURL = "view/img/background.png"; } return $this->backgroundURL; } function setBackgroundURL($backgroundURL) { $this->backgroundURL = strip_tags($backgroundURL); }}
            0
          3. Contributeur Ambassadeur
            pour le moment, tu as deux tables.
            tu as probablement des programmes qui travaillent avec chacune de ces tables.
            que veux-tu faire avec ces programmes? les remplacer par des programmes qui travailleraient sur la fusion des deux tables?
            ou bien veux-tu créer de nouveaux programmes, qui feraient d'autre choses, tout en gardant les anciens programmes?
            0
          4. Merci pour vos réponses.
            Je veux que les deux programmes accèdent aux même données utilisateurs pour que les membres du programme 1 n'aient pas à se réinscrire dans le programme 2 et que les inscriptions fonctionnent depuis les deux sites et mette à jour la liste des utilisateurs des deux sites simultanément. Je veux qu'ils utilisent la même table pour les membres, ou que les informations que contient une table soit automatiquement copiée dans l'autre afin qu'ils aient les mêmes membres. Si il peuvent rester connecté d'un programme à l'autre sa serait génial.
            0
          5. Contributeur Ambassadeur
            @tradezone.frvoilà, tu commences à expliquer ce que tu veux réaliser, c'est bien.
            jusqu'à quel point es-tu prêt à adapter un des deux sites, ou sans doute les deux, pour réaliser cela?
            tu maîtrises parfaitement les programmes des deux sites?
            0