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 SQL Discussion :

Clause WHERE ignorée à tort


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 53
    Points : 40
    Points
    40
    Par défaut Clause WHERE ignorée à tort
    Bonjour à tous,

    Mon problème est simple, je travaille sur une base de donnée assez longue, que je suis en train de mettre en place.
    J'écris des scripts PHP qui me génèrent des requêtes, que je copie/colle dans PHPMyAdmin.
    Je cherche actuellement à faire s’exécuter correctement un bloc de requêtes, qui concernent 286 lignes de ma base (impossible donc de le faire à la main).
    Ce sont des UPDATE, qui possèdent tous une clause WHERE, permettant de ne modifier que les lignes concernées.
    Cependant, après l’exécution de mes requêtes, aucune ligne n'est modifiée, alors même que PHPMyAdmin me confirme la bonne exécution de la requête.
    J'ai tout essayé, il n'y a aucune erreur de syntaxe (quand je retire la clause WHERE, l'ensemble des lignes sont mises à jour), j'ai changé les encodages, les types...j'y suis depuis des heures, mais mes requêtes ne veulent toujours pas mettre correctement à jour les lignes qui les concernent.

    Quelqu'un a-t-il déjà été concerné par ce genre de problème ?
    Si oui, comment puis-je faire ?

    Dans la comparaison entre la chaîne du WHERE et la chaîne présente dans la BDD, le problème semble venir de cette présente dans la BDD, car quand je tape la requête à la main, celle-ci ne fonctionne pas mieux.
    J'ai également essayé d'exporter la base, de changer l'encodage du dump, etc... là je suis un peu dépourvu.

    En attendant de l'aide,
    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Si tu veux être aidé, il est nécessaire de nous donner le code de ta requête.

    L'anomalie provient certainement de la clause WHERE, mais pour comprendre il faut l'analyser.

    A+

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je vois que vous parlez de chaînes de caractère et d'encodage, il y a de fortes chances qu'effectivement le problème vienne de là. La requête et un peu de jeu de données permettraient d'y voir plus clair !

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    D'accord, je vous envois ça. Ne faites pas attention à la bizarrerie des données, c'est pour un jeu.

    La table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `do_monstre` (
      `id_archi` int(11) NOT NULL,
      `nom_archi` varchar(250) NOT NULL,
      `nom_mob` varchar(250) NOT NULL,
      `niveau_min` int(11) NOT NULL,
      `niveau_max` int(11) NOT NULL,
      `url_image` varchar(100) NOT NULL,
      `zone` varchar(100) NOT NULL,
      `sous_zone` varchar(100) NOT NULL,
      `etape` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Les deux premiers INSERT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO `do_monstre` (`id_archi`, `nom_archi`, `nom_mob`, `niveau_min`, `niveau_max`, `url_image`, `zone`, `sous_zone`, `etape`) 
    VALUES (121, 'Aboudbra le Porteur', 'Dopeul Osamodas', 0, 0, '', '', '', 26),
    (67, 'Fourapin le Chaud', 'Fourbasse', 0, 0, '', '', '', 23)
    Les quatre premiers UPDATE, visant à mettre à jour les niveaux min et max des deux lignes précédentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE do_monstre SET niveau_min = 35 WHERE nom_mob = "Aboudbra le Porteur";
    UPDATE do_monstre SET niveau_max = 47 WHERE nom_mob = "Aboudbra le Porteur";
    UPDATE do_monstre SET niveau_min = 20 WHERE nom_mob = "Fourapin le Chaud";
    UPDATE do_monstre SET niveau_max = 24 WHERE nom_mob = "Fourapin le Chaud";
    Seulement, après l’exécution des UPDATE, les niveaux des lignes précédentes sont toujours à 0...

  5. #5
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Bonjour,

    Vous n'avez pas confondu nom_archi et nom_mob ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous vous êtes trompé dans les requêtes update, "Aboudbra le Porteur" et "Fourapin le Chaud" ne sont pas dans la colonne "nom_mob" mais dans "nom_archi".
    De plus, les chaînes de caractères sont délimitées par des apostrophes et non des guillemets.
    De plus, vous pouvez mettre à jour deux colonnes en un seule syntaxe.

    Pour résumer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE do_monstre
       SET niveau_min = 35
         , niveau_max = 47
     WHERE nom_archi  = 'Aboudbra le Porteur';
     
    UPDATE do_monstre
       SET niveau_min = 20
         , niveau_max = 24
     WHERE nom_archi  = 'Fourapin le Chaud';
    De plus, il vaudrait mieux que vous fassiez les mises à jour sur une colonne indexée ou mieux encore, sur la clef primaire (dans votre script on ne voit pas id_archi étant défini comme clef primaire, je suppose que c'est le cas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE do_monstre
       SET niveau_min = 35
         , niveau_max = 47
     WHERE id_archi   = 121;
     
    UPDATE do_monstre
       SET niveau_min = 20
         , niveau_max = 24
     WHERE id_archi   = 67;

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Haaan... quel idiot. Shame on me.
    D'accord, c'est toujours les erreurs les plus bêtes qui passent le plus inaperçues, j'ai effectivement inter-changé les deux colonnes

    Par contre Waldar, si j'avais pu utiliser l'id plutôt que le nom pour mes UPDATE, je me serais fait une joie de le faire, mais je n'ai comme information que nom => niveau, et je ne peux pas réinventer des id puisque ceux-ci seront différent de ceux de la base.
    Cependant, la syntaxe que tu me donnes est effectivement plus légère, et gagne à être utilisée, merci.
    (Quoi qu'en l’occurrence les requêtes sont générées en PHP, donc 572 ou 286 requêtes...ça change pas grand chose^^ )

    Merci à tous pour vos réponses très rapides !

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Ok, mais posez quand même un index sur la colonne nom_archi s'il n'y en a pas.
    Au niveau PHP le nombre de requêtes ne change pas grand-chose, mais ça joue sur le SGBD, qui fera moins d'opérations.
    Je vous l'accorde, le nombre étant faible ça reste imperceptible pour un humain.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    En général, je pose les clefs étrangères/primaires lorsque j'ai terminé ma base de donnée, c'est plus confortable. Je poserai une clef primaire sur id_archi, car une fois toutes les informations entrées dans la base, ce sera l'id qui représentera la ligne, et plus le nom.

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

Discussions similaires

  1. Comment ignorer la sélection de la clause WHERE.
    Par ABandApart dans le forum Requêtes
    Réponses: 6
    Dernier message: 11/06/2012, 11h05
  2. Ordre des tests dans la clause WHERE
    Par Tans98 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/09/2004, 10h52
  3. Problème clause WHERE
    Par nesbla dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/06/2004, 15h07
  4. probleme avec le caractere 'Z' dans ma clause WHERE
    Par dibox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/04/2004, 12h21
  5. [ character en simple cote ] clause Where
    Par hocinema dans le forum DB2
    Réponses: 3
    Dernier message: 20/02/2004, 10h17

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