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

SGBD Perl Discussion :

Probléme de requête.


Sujet :

SGBD Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut Probléme de requête.
    Bonjour a tous je réalise un script perl pour aliment une base de donnée.
    A l'éxécution j'ai droit à un :
    "DBD::mysql::db do failed: 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 'where ip like '195.83.247.241'' at line 1 at insert_mac_database.pl line 20, <FICH> line 51."

    Voila ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query="insert into machine(mac) values('".$elements[1]."') where ip like ".$elements[0]."";
    Merci d'avance de vos réponses.

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Je suppose que le problème vient des données quotés ? Ma suggestion est d'utiliser des placeholders plutôt qu'une simple concaténation, c'est bien plus sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $query= 'insert into machine(mac) values( ? ) where ip like ?';
    my $sth = $dbh->prepare( $query);
    $sth->execute($elements[1], $elements[0]);
    Et tu peux maintenant réutiliser $sth sans que la DB ait besoin de repréparer la requête.

    EDIT : Euh... Tu es sûr que ta requête est valide ? Qu'est censé faire ta clause "where" ici ?

    --
    Jedaï

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    Ma base do donnée contient des adresse ip de machine.
    Le fichier que je lit contient adresse ip et mac de certaines machines.
    Je veut parcourir le fichier et pour chaque ligne insérer dans la base l'adresse mac corespondant a la bonne adresse ip.

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Selon la structure de ta base, tu veux soit un "update", soit un "insert into machine (ip, mac) values (?, ?)", mais certainement pas un insert avec un where (ça n'existe pas a priori), je te conseille d'aller poser la question sur le forum SQL.

    --
    Jedaï

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 606
    Par défaut
    Citation Envoyé par Gad29
    Ma base do donnée contient des adresse ip de machine.
    Le fichier que je lit contient adresse ip et mac de certaines machines.
    Je veut parcourir le fichier et pour chaque ligne insérer dans la base l'adresse mac corespondant a la bonne adresse ip.
    Alors dans ce cas, c'est pas un insert mais un update que tu dois faire car d'après ce que tu dis, une table de ta base de données contient déjà les adresses IP et que tu veux mettre à jour ces adresses IP en leur affectant l'adresse MAC trouvée dans ton fichier.

    A ta place, je procéderais comme suit :

    - charger dans un hash toutes les adresses IP existants dans ta table (clé = une adresse IP)
    - lire ton fichier et y récupérer les adresses MAC avec leur lien vers l'adresse IP
    - si l'adresse IP existe (test du hash sur la clé (adresse IP)), tu fais un update
    - dans le cas contraire, tu crées l'enregistrement dans ta table

    Si tu ne souhaites pas récupérer de prime abord les adresses IP déjà stockées dans ta table, il va falloir que tu puisses récupérer les messages d'erreur que la base te retournera si tu fais un update sur un enregistrement n'existant pas. Dans ce cas précis, je te recommande fortement d'encapsuler ta requète d'update dans un bloc eval afin de pouvoir tester le retour d'erreur d'eval (variable $@) et ainsi garder trace de tout update ne s'étant pas réalisé.

    Pas trés propre ceci dit, je préfère la méthode décrite au début de mon post.

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/08/2003, 16h32
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 11h33
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 17h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 15h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 19h02

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