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

 MySQL Discussion :

Fusion de 2 requêtes


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut Fusion de 2 requêtes
    Bonsoir à tous !

    Je vous explique la situation : un pseudo "hacker" à eu accès au compte d'un des administrateurs de nos forums et à effacer 2 membres dont lui même. Du coup le forum se retrouve avec plein de messages "orphelins" posté par des anonymous...

    Pour faire le tri entre les posts des 2 membres (qui ont du recrée 2 nouveaux comptes) qui ont le même poster_id (-1 pour anonymous) j'ai eu l'idée d'utiliser les adresses IP. Après quelques vérifications, nous avons constaté que les posts ayant une certaine IP correspondaient bien au posts du membre en question.

    J'ai afficher dans phpmyadmin via la fonction recherche tous les posts pour l'IP correspondant à un des membres (enfin ce qui correspond à l'IP dans la BDD / poster_ip).

    Cependant, en les sectionnant tous d'un coup je ne peux pas leur affecter leur nouveau poster_id (correspondant au nouveau compte). Il faut les faire un par un... et il y a des milliers de posts.

    Donc, je me doute qu'avec une requête SQL ça doit être faisable d'attribuer à tous ces posts leur nouveau poster_id (remplacer le -1 par 330).

    Ci dessous, voici les requête que phpmyadmin m'a sorti lors de la recherche des posts avec l'IP et lors de l'attribution du nouveau poster_id.

    Requete SQL de recherche via adresse IP Wolf Frend :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM `phpbb_posts`
    WHERE `poster_ip` LIKE CONVERT( _utf8 '52e3f1be'
    USING latin1 )
    COLLATE latin1_german2_ci
    LIMIT 0 , 30
    Requete SQL de changement du poster_id=-1 (Anonymous) en poster_id=330 (nouveau compte Wolf) et post_username = NULL au lieu de post_username = Anonymous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE `phpbb_posts` SET `poster_id` = '330',
    `post_username` = NULL ,
    `post_edit_time` = NULL WHERE `post_id` =380 LIMIT 1 ;
    ___________

    Et ça c'est les même requête écrite différemment je crois :

    Requete 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'EXPLAIN SELECT * FROM `phpbb_posts` WHERE `poster_ip` LIKE CONVERT(_utf8 \'52e3f1be\' USING latin1) COLLATE latin1_german2_ci';
    Requete 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'UPDATE `phpbb_posts` SET `poster_id` = \'330\', `post_username` = NULL, `post_edit_time` = NULL WHERE `post_id` = 380 LIMIT 1';

    Merci à tous ceux qui essayeront de m'aider !

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,

    Et bien tu as presque la solution dans tes 2 premières requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE `phpbb_posts` 
    SET `poster_id` = '330',
    `post_username` = NULL ,
    `post_edit_time` = NULL 
    WHERE `poster_ip` LIKE CONVERT( _utf8 '52e3f1be'
    USING latin1 )
    COLLATE latin1_german2_ci
    Ca devrait marcher...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut
    Merci pour ton aide.

    Toutefois, étant totalement débutant voir "newbie" avec MySQL (on va dire que je me débrouille comme je peux), j'aimerais que tu me confirme que la requête que tu me propose attribuera le nouveau poster à TOUS les posts avec cette adresse IP. Si c'est le cas, le nombre total de changements sera-t-il affiché à la fin de la requête? (pour que je puisse re-attribuer le nombre correct de messages au membre)

    Par ailleurs, lorsque je me rends dans phpmyadmin, dois-je executer ma requête ici :


    Je suis dans la "table" phpbb_posts, et j'ai sélectionné à droite les 3 critères poster_id, post_username, post_edit_time). Am I right?

    Merci par avance.

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Ouh là, si tu as le moindre doute sur la requête (je ne garantis pas non plus son résultat sans avoir les tables sous les yeux), tu as deux solutions :
    1/ tes tables sont en InnoDB. Dans ce cas, il faut faire une transaction avant la mise à jour (avec BEGIN ou START TRANSACTION). Si tu vois que le nombre de lignes mises à jour est trop élevé ou te paraît bizarre, tu peux faire un ROLLBACK qui annulera la mise à jour ;
    2/ tes tables sont en MyISAM et tu ne peux pas faire de transaction... Dans ce cas (et même dans le cas précédent d'ailleurs), remplace l'UPDATE par un SELECT et contrôle le résultat renvoyé pour voir ce qui va être mis à jour.
    Exemple de requête de contrôle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT poster_id as id_avant, '330' as id_apres, post_username as user_avant, post_edit_name as edit_avant
    FROM phpbb_posts
    WHERE `poster_ip` LIKE CONVERT( _utf8 '52e3f1be'
    USING latin1 )
    COLLATE latin1_german2_ci
    Je m'en voudrais d'être responsable d'une catastrophe, surtout que je n'ai pas les moyens de tester le résultat de la mise à jour que je t'ai donnée...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut
    Merci Chef !

    J'avoue être un peu perdu dans tes explications.
    Quoi qu'il en soit, j'ai fait des sauvegardes de ma base de données avant toute modification. Je peux la restaurer facilement (j'utilise le script de Ashe pour sauvegarder / récupérer ma BDD phpBB).

    Etant donné que tu es Modérateur je pense que tu es une personne de confiance. Si je n'arrive à rien après toutes tes explications, je pourrais éventuellement te donner les accès à la BDD.

    Pour info, je viens de voir que mes tables sont en MyISAM.
    Dois-je donc essayer avec la dernière requête que tu as laissé?

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Citation Envoyé par Julien1926 Voir le message
    Etant donné que tu es Modérateur je pense que tu es une personne de confiance.
    Ouh là, c'est vite dit .

    Tu peux essayer la dernière requête et regarder les lignes qui sont renvoyées...
    Elle va te renvoyer les colonnes suivantes :
    1/ id_avant : poster_id actuel (avant mise à jour)
    2/ id_apres : la future valeur de poster_id après ta mise à jour, soit '330'
    3/ user_avant : le username avant mise à jour (après, ça vaudra forcément NULL)
    4/ edit_avant : le post_edit avant mise à jour (après, ça vaudra forcément NULL).

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. 'Fusion' de 2 requêtes/colonnes
    Par Czweic dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/05/2009, 14h23
  2. [DML]Fusion de deux requêtes full Outer join colonne null
    Par peuplier dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/01/2009, 15h22
  3. [SQL]Fusion de 2 Requêtes
    Par matb33 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/07/2008, 16h42
  4. Fusion de deux requêtes pour tri partiel
    Par zebiloute dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/12/2007, 11h29
  5. Fusion de deux requètes
    Par florent dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/05/2007, 19h52

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