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

Requete SQL vers base MySQL


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut Requete SQL vers base MySQL
    Bonjour,
    Après avoir bataillé pour installer le module DBI et DBD-mySQL, j'ai enfin trouvé comment faire mon script.

    J'ai cependant des erreurs à l'execution, mais pas a la compilation.

    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
    18
    19
     
    ##### ouverture session #####
    Content-type: text/htmlnnDBD::mysql::st execute 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 ')' at line 1 at F:/export_data_sql_V4.pl line 302.
     
    DBD::mysql::st execute 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 'VALUES (2014-6/3/11/29 )' at line 1 at F:/export_data_sql_V4.pl line 308.
     
    DBD::mysql::st execute 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 ')' at line 1 at F:/export_data_sql_V4.pl line 302.
     
    DBD::mysql::st execute 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 'VALUES (2014-6/3/11/29 )' at line 1 at F:/export_data_sql_V4.pl line 308.
     
    DBD::mysql::st execute 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 ')' at line 1 at F:/export_data_sql_V4.pl line 302.
     
    DBD::mysql::st execute 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 'VALUES (2014-6/3/11/29 )' at line 1 at F:/export_data_sql_V4.pl line 308.
    je pose aussi la partie code des requetes :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    sub session () 
     
        {
     
    		#Chemin d'acces aux adresses des IP Serveur, à modifier au besoin
    		my @servers = make_servers_list('F:/adresses_ip.txt'); 
    		my %params = make_params_list();
    		my $time = get_time();
     
    		foreach (@servers)
     
    		{
    			my $connection = start_connection($_);
    			my $dbh = start_connection_sql($_);
    			next unless ($connection);
    			my %values = get_values($connection, %params);
     
    			# log_write(%values);
    			end_connection($connection);
                                    foreach (@servers)
     
    			{
     
    			my $query = "INSERT INTO puissance( ID_Compteur, Puissance_P, Puissance_Q, Puissance_S, Dephasage) VALUES (";
    		  		foreach (keys %values) 
    				{ 
    		        	$query .= $values{$_}.", "; 
    		   		} chop; chop;
    				$query .= " )"; 
     
    	$sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
    	$sqlQuery->execute(); 
     
    	$query = "INSERT INTO puissance(Date VALUES (".$time." )"; 
     
    	$sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
     
    	$sqlQuery->execute(); }
    	}
    }

    Les requetes me paraissent bonnes, et la compile marche, du coup, je suis en galère pour mon script, j'ai tenté pas mal de versions mais pas d'avancée . . .

    Merci pour votre aide

    Ju

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    alors déjà à moins d'une erreur de recopie, il manque une parenthèse après Date
    $query = "INSERT INTO puissance(Date VALUES (".$time." )";
    ensuite il faut probablement entourer tes valeurs par des quotes, pour les non numériques au moins

    ensuite, pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach (keys %values) 
    				{ 
    		        	$query .= $values{$_}.", "; 
    		   		} chop; chop;
    				$query .= " )";
    tu devrais consulter la méthode join

    enfin, l'opérateur keys ne garantit pas l'ordre de tes clés donc elles ne seront peut-être pas dans l'ordre dans lequel tu souhaites les entrer.
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut MySQL
    Merci pour les réponses.
    J'ai donc rajouté les parenthese pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "INSERT INTO puissance(Date VALUES (".$time." )";
    Et pour le quote, c'est noté. $
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO puissance(Date VALUES ('".$time."'))";
    Et en faisant un print de mes requetes, j'obtiens bien les valeurs que je dois remonter.

    Cependant, lorsque je crois envoyer tout cela vers ma Bdd, j'ai toujours les erreurs de :


    ##### ouverture session #####
    DBD::mysql::st execute failed: You have an error in your SQL syntax; check the man
    ual that corresponds to your MySQL server version for the right syntax to use ne
    ar ')' at line 1 at F:/export_data_sql_V4.pl line 303.

    DBD::mysql::st execute 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 'VALUES ('14:33/3/6/2014'))' at line 1 at F:/export_data_sql_V4.pl line 309.

    DBD::mysql::st execute 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 ')' at line 1 at F:/ex
    port_data_sql_V4.pl line 303.

    DBD::mysql::st execute 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 'VALUES ('14:33/3/6/2014'))' at line 1 at F:/export_data_sql_V4.pl line 309.

    DBD::mysql::st execute 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 ')' at line 1 at F:/export_data_sql_V4.pl line 303.

    INSERT INTO Puissance(Date VALUES ('14:33/3/6/2014'))
    DBD::mysql::st execute 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 'VALUES ('14:33/3/6/2014'))' at line 1 at F:/export_data_sql_V4.pl line 309.

    Content-type: text/htmlnnContent-type: text/htmlnn

    ##### Fin session #####
    Press Enter to continue

    J'avouej e sche un peu là, car je ne vois pas pourquoi cela ne fonctionne pas, car les requetes sont bonnes, mais ne rentre pas dans ma Bdd.

    Merci pour votre coup de main

  4. #4
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    ta requête n'est toujours pas correcte, n'hésite pas à te référer à la documentation mysql.

    query = "INSERT INTO puissance(Date) VALUES ('".$time."')";
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut a
    Ok, merci pour la doc. Je regarde ça dans l'apres-midi.

    Juste une derniere chose, j'ai rajoutais les quotes pour les exports, ainsi que la parenthese pour (Date).

    Alors, mes erreurs ont changés, et j'obtiens cela :

    " You have an error in your SQL synthax" => je regarderais la doc sur les requetes SQL

    La parcontre, aucune idée d'ou cela peut venir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Can't execute INSERT INTO (Puissance_P  . . . ) DBI::db=HASH(0xf5ff94)->errstrn at line 306.
    Problème de mémoire dans la base ? ou autre chose alors ?

    Merci
    @+

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je n'utilise pas mySQL, mais cette requête paraît être du SQL suspect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "INSERT INTO puissance( ID_Compteur, Puissance_P, Puissance_Q, Puissance_S, Dephasage) VALUES (";
    La parenthèse ouvrante juste à la fin de la requête, suivie du guillemet, ne me semble pas correcte.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut SQL / PERL
    En fait, je me suis inspiré de cela,
    http://www.tizag.com/perlT/perlmysqlquery.php et aussi
    http://djibril.developpez.com/tutoriels/perl/perl-dbi/ pour mes requetes,
    Le souci, est, je pense dans la fonction execute(), car lorsque je mets execute() en commentaire, tout marche et compile.

    Lorsque j enleve le commentaire sur execute(), alors le script bug et ne renvoie rien.
    Je vais y regarder un peu plus du coup.



    Merci pour votre aide, si vous pensez à autre chose qui pourrais m aider, je suis preneur

    Meci
    @+

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut sql
    J'ai refaits un bout du code:

    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
    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
    {
     
    			my $query = sprintf
    			"INSERT INTO Puissance(Puissance_P, Puissance_Q, Dephasage, Puissance_S) 
    			 VALUES 
    			 (";
     
    				foreach (keys %values) 
    				{ 
    		        	$query .= $values{$_}.","; 
    		   		} chop; chop;   # pour virer le  "," final; 
    				$query .= 
    			  ")"; 
     
     
    	my $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
    	#print ($sqlQuery);
    ###essai
    	$dbh->do($query);	
    ###essai
    	#$sqlQuery->execute() or die "Can't execute $query: $dbh->errstrn";
     
    	#$query = "INSERT INTO Puissance(ID_Compteur VALUES ('".$fichier $_."'))";  
            #print ($query);
    	#$sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
     
    	#$sqlQuery->execute(); 
     
     
     
    	$query = sprintf "INSERT INTO Puissance(Date) VALUES ('".$time."')"; 
            #print ($query);
    	$sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
     
     
    ###essai
    	$dbh->do($query);	
    ###essai
     
     
    	#$sqlQuery->execute(); 
    	$dbh->disconnect();

    et j'obtients ces erreurs ci :


    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
    18
    19
    20
    21
    ##### ouverture session #####
     
     
    Content-type: text/htmlnnDBD::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 ')' at line 3 at F:/export_data_sql_V5.pl line 311.
    DBD::mysql::db do failed: Duplicate entry '' for key 'PRIMARY' at F:/export_data
    _sql_V5.pl line 329.
    DBD::mysql::db do failed: MySQL server has gone away at F:/export_data_sql_V5.pl
     line 311.
    DBD::mysql::db do failed: MySQL server has gone away at F:/export_data_sql_V5.pl
     line 329.
    DBD::mysql::db do failed: MySQL server has gone away at F:/export_data_sql_V5.pl
     line 311.
    DBD::mysql::db do failed: MySQL server has gone away at F:/export_data_sql_V5.pl
     line 329.
    Content-type: text/htmlnnContent-type: text/htmlnn
     
     
    ##### Fin session #####
    Press Enter to continue

    Ce qui me confirme que j'ai des soucis dans la requete au niveau de execute.

    Si quelqu'un voit un peu plus clair que moi,

    Merci
    @+

  9. #9
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Si tu loggais les requêtes SQL que tu envoies, tu perdrais moins de temps.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut SQL / PERL
    C'est a dire logger des requetes ?

    Merci
    @+

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17

  12. #12
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,

    Sans voir les requêtes construites c'est effectivement difficile...
    Tu devrais nous laisser les
    Ceci étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = sprintf "INSERT INTO Puissance(Date) VALUES ('".$time."')";
    me semble suspect.

    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = sprintf "INSERT INTO Puissance(Date) VALUES ('"'.$time.'"')";

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut Code complet ^^
    C'est long certes, mais au moins, vous avez le code en entier :

    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    #!/usr/bin/perl
    #use strict;
    use warnings;
    use autodie;
    use DBI();
     
    use IO::Socket;
    use IO::Select;
    use Errno qw(EINPROGRESS);
    use Data::Dumper;
     
     
    ######################################## Ensemble des fonctions de connexion SQL
     
    sub start_connection_sql($) 
    { 
        print "Content-type: text/htmlnn"; 
     
    ## mysql user database name 
        my $db ="energie_ste"; 
     
    ## mysql database user name 
        my $user = "jmoulin"; 
     
    ## mysql database password 
        my $pass = "jmoulin"; 
     
    ## user hostname : @ IP 
        my $host="172.16.9.96"; 
     
        my $dbh;  
     
     $dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass) or die "Unable to connect: $DBI::errstr\n";
        return $dbh; 
    } 
     
    ######################################## Ensemble des fonctions de connexion MODBUS
    sub start_connection($) 
    	{
     	my $server_ip = shift;
      	my $server_port = 502;    # MODBUS port
     	my $timeout = 5; # délai de 5s pour établir une connection, a ajuster en fonction de vos besoins
     
     
    #creation d'une socket tcp et d'un indicateur d'état  
    	my $socket = IO::Socket::INET->new(Proto => 'tcp', Type => SOCK_STREAM);
      		unless ($socket) 
    		{
        			return 0;
      		}
     
    # et d'un indicateur d'état pour remonter les erreurs
      	my $select = IO::Select->new($socket);
      	unless ($select) 
    		{
        		return 0 ;
      		}
     
      	my $ip_address = inet_aton($server_ip);
      	unless ($ip_address) 	
    		{
        		return 0;
     		}
     
    $socket->blocking(0);    # mode non-bloquant pour pouvoir vérifier le time-out <5s
     
      	unless ($socket->connect(pack_sockaddr_in($server_port, $ip_address))) 
    			{
        		unless ($! == EINPROGRESS and 
            		$select->can_write($timeout) and 
            		$socket->connected) {         # vérification du statut
          		$! = $socket->sockopt(SO_ERROR);
          		$socket->close();
          return 0;
        			}
        # connection etablie dans le délai imparti
      		}
     
      # repasser en mode bloquant pour la suite
      	$socket->blocking(1);
      		# verification que la socket est disponible
     	 unless ($select->can_write($timeout)) {
       	$socket->close();
        	return 0;
     	}
     
       return { "socket" => $socket, "select" => $select };
    }
     
     
    	sub end_connection($) {
      	my $connection = shift;
      	$connection->{"socket"}->shutdown(2);
      	$connection->{"socket"}->close();
    }
     
     
    sub modbus_make_packet($$) 
    		{
      		my ($address, $size) = @_;
     		my ($tx_hd_tr_id, $tx_hd_pr_id, $tx_hd_length, $tx_hd_unit_id);
     
    use constant READ_HOLDING_REGISTERS => 0x03; # command code
      	$tx_hd_tr_id = int(rand 65536);
      	$tx_hd_pr_id = 0;
      	$tx_hd_length = 6;
      	$tx_hd_unit_id = 1;
     
    		my $tx_hd  = pack("nnnC",    $tx_hd_tr_id, $tx_hd_pr_id, $tx_hd_length, $tx_hd_unit_id);
     		 my $packet = pack("nnnCCnn", $tx_hd_tr_id, $tx_hd_pr_id, $tx_hd_length, $tx_hd_unit_id, READ_HOLDING_REGISTERS, $address, $size);
      	return ($tx_hd, $packet);
    		}
     
     
    sub modbus_check_packet($$) 
    		{
      	my ($tx_hd, $rx_hd) = @_;
      	my ($tx_hd_tr_id, $tx_hd_pr_id, $tx_hd_length, $tx_hd_unit_id) = unpack("nnnC", $tx_hd);
      	my ($rx_hd_tr_id, $rx_hd_pr_id, $rx_hd_length, $rx_hd_unit_id) = unpack("nnnC", $rx_hd);
      	# Vérifie la cohérence de l'entête
      		if (($rx_hd_tr_id == $tx_hd_tr_id) and
          			($rx_hd_pr_id == $tx_hd_pr_id) and
          			($rx_hd_unit_id == $tx_hd_unit_id) and
          			($rx_hd_length < 256)) 
    			{
        		return $rx_hd_length;
      			}
      		return 0;
    		}
    ######################################## Ensemble des fonction de connexion MODBUS
     
     
     
    sub get_value($$) 
    # Get value qui interroge le compteur, recoit la requete et en fonction des parametres, calcule la bonne valeur de variable (Mots)
    		{
     	my ($connection, $param) = @_;
      	my ($socket, $select) = ($connection->{"socket"}, $connection->{"select"});
      	my $timeout = 1;        # delai de 1s a ajuster selon besoin.
     
      	my ($tx_hd, $packet) = modbus_make_packet($param->{"address"}, $param->{"size"});
     
    	# Emission de la requête vers le serveur
      	send($socket, $packet, 0);
      	# Attente d'une réponse échec si timeout
      	unless ($select->can_read($timeout)) 
    			{
        			return (0, 0);
      			}
     
    	my $buffer;
      	# Réception de l'entête depuis le serveur
      	recv($socket, $buffer, 7, 0);
      	# vérification de l'en tête
     	 my $datalength = modbus_check_packet($tx_hd, $buffer);
     	 unless ($datalength ) 
    			{
        			return (0, 0);
      			}
      	# Réception du corps du message
      	recv($socket, $buffer, $datalength-1, 0);
      	# Décodage du corps du message
      	my ($rx_bd_fc, $rx_body) = unpack "Ca*", $buffer;
      	# Vérification du statut d'exception
      		if ($rx_bd_fc > 0x80) 	
    			{
        			return (0, 0);
      			}
     	 ## Lecture de mot
      	my ($rx_bd_bc, $rx_read_word_data) = unpack "Ca*", $rx_body;
      	my ($val1, $val2, $val3);
      	my $result;
     
      		if ($param->{"size"} == 1) 
    			{
    			$result = unpack 'n', $rx_read_word_data;
       			if ($param->{"signed"}) {
         				$result -= 2**16;}
      			}
     
     
    			elsif ($param->{"size"} == 2) 
    				{
        				($val1, $val2) = unpack 'nn', $rx_read_word_data;
        				$result = $val1 * (2**16) + $val2;
     
        				if ($param->{"signed"}) 
    					{$result -= 2**32;}
     
    			} elsif ($param->{"size"} == 3) 	
    				{
        				($val1, $val2, $val3) = unpack 'nnn', $rx_read_word_data;
        				$result = $val1 * (2**32) + $val2 * (2**16) + $val3;
        				if ($param->{"signed"}) 
    					{$result -= 2**48;}
     
     
      				}
      			return (1, $result);
    			}
     
     
     
    sub get_values($%) 
    #sub qui retourne la valeur par parametre
    {
     	my ($connection, %params) = @_;
      	my %values;
      		foreach (sort {$a cmp $b} (keys %params)) {
        			my ($status, $val) = get_value($connection, $params{$_});
        			next unless ($status);
        			$values{$_} = $val;
      		}
      	return %values;
    }
     
     
    sub make_servers_list ($) 
    #sub qui retourne l'adresse IP du serveur a interroger
    {
      	my @servers;
      	my $fh;
     
      		if (open($fh, "<", shift)) 
    	{
        		@servers = grep {s/^\s*(.*)\s*;\s*/$1/} <$fh>;
        		close $fh;
      	}
     
      return @servers;
    }
     
     
    sub make_params_list () 
    #Liste des variables à interroger
    {
      	# paramètres pour les différentes requêtes effectuées
      	my %params;
      	#déphasage
    	$params{"Dephasage  "} = {address => 0x01B, size => 1, signed => 0};
     
      	# puissance
      	$params{"Puissance P"} = {address => 0x109, size => 3, signed => 0};
      	$params{"Puissance Q"} = {address => 0x151, size => 3, signed => 0};
    	$params{"Puissance S"} = {address => 0x121, size => 3, signed => 0};
      	return %params;
    }
     
     
    # création de la variable timestamp pour les horodatages :
     
    sub get_time() 
    {my ($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
     
     $mois += 1 and $annee += 1900;
     $jour = sprintf("%0d",$jour);
     $mois = sprintf("%0d",$mois);
     
    my $time = "$heure:$min-$jour/$mois/$annee";
    return ($time);
     
    }
     
     
     
    sub session () 
    # Sub session appelée dans le main 
    # Il gere : requete + dialogue_reseau + lecture_données + décodage_donnée + affichage + export_csv
    # A appeler dans le fichier main du script
     
        {
     
    		#Chemin d'acces aux adresses des IP Serveur, à modifier au besoin
    		my @servers = make_servers_list('F:/adresses_ip.txt'); 
    		my %params = make_params_list();
    		my $time = get_time();
     
     
    		foreach (@servers)
     
    		{
    			my $connection = start_connection($_);
    			my $dbh = start_connection_sql($_);
    			next unless ($connection);
    			my %values = get_values($connection, %params);
     
    			# log_write(%values);
    			end_connection($connection);
     
     
    		#foreach (@servers)
     
    			{
     
    			my $query =
    			"INSERT INTO Puissance(Puissance_P, Puissance_Q, Dephasage, Puissance_S) 
    			 VALUES 
    			 ('";
     
    				foreach (keys %values) 
    				{ 
    		        	$query .= $values{$_}.","; 
    		   		} chop; chop;   # pour virer le  "," final; 
    				$query .= 
    			  "')";
     
     
    	my $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
    	$sqlQuery->execute() or die "Can't execute $query: $dbh->errstrn";
     
     
     
     
    	$query = "INSERT INTO Puissance(Date) VALUES ('"'.$time.'"')"; 
    	$sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
    	$sqlQuery->execute(); 
     
    	$dbh->disconnect();
     
     
    			}
    		}
        }   
     
     
     
     
    ####################### Fonction main ()  #######################
     
    print("\n##### ouverture session #####\n");
    print("\n \n");
     
    ####################### test de connexion #######################
    session();
    print("\n \n");
    ####################### test fin connexion #######################
    print("\n##### Fin session #####\n");
    La modification de '"'.$time.'"' ne fonctionne pas, et me retourne <== syntax error.

    J'ai trouvé plusieurs methode d'export avec le INSERT INTO sur différents sites, et du coup, je me demande si mon code fonctionne ou s'il y a
    des fautes dans mes synthaxes.

    Je continue à regarder tout cela de plus près.

    Merci @ vous.

  14. #14
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Avant de lire le code :

    [EDIT 17:29]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = sprintf "INSERT INTO Puissance(Date) VALUES '("'.$time.'")'";

  15. #15
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Je ne connais pas MySQL
    Mais si Puissance(Date) est du format DATE il y a probablement une conversion à faire...

    [EDIT 17:32]
    A la fin ça devrait ressembler à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO DATE_FORMAT(Puissance(Date), '%h') VALUES ("$time")";
    et pour avoir :
    de mémoire chancelante... :

  16. #16
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Je n'ai pas lu tout ton code, et me suis seulement attardé sur le pb qui me semble être de syntaxe SQL.
    La gestion des quottes n'est pas évidente au début.
    Je te conseille de faire une coupe franche dans ton code de façon à n'avoir plus que l' INSERT dans Puissance(Date) afin de valider une syntaxe simple dans un premier temps.

    J'ai récupéré une vieillerie, du PHP qui insère une ligne dans une base MySQL :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    $serveur = "xxxxx.free.fr";
    $db = "xxxxx";
    $utilisateur = "xxxxx";
    $mdp = "xxxxxx";
    $type = "texte";
     
    $referer = getenv('HTTP_REFERER');
    //echo "HTTP_REFERER : ". $referer ."<br>\n";
     
    //// Récupération de la date actuelle ////
    $date = date("Y-m-j H:i:s");
     
    //// Connexion à la base mySQL ////
    @MYSQL_CONNECT($serveur,$utilisateur,$mdp) or die ('Connexion impossible');
    @MYSQL_SELECT_DB($db) or die ('Connexion à la base $db impossible');
     
     
    //// On récupère l'adresse IP du visiteur ////
    $adress = $_SERVER['REMOTE_ADDR'];
     
    //// on ajoute  une ligne////
    // echo "Adresse : ". "$adress". " Date : ". "$date". " Pgm : ". "$pgm". "<br>";
     
    $insert = 'INSERT INTO compteur (ip,date,pgm,referer) VALUES("'.$adress.'", "'.$date.'", "'.$pgm.'", "'.$referer.'")';
     
    if ($referer != ""){
    	$query = mysql_query($insert);
    }
    // On ferme la connexion à la base mySQL ////
     
    mysql_close();
    ?>
    Remarque la date est déjà formatée pour MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date = date("Y-m-j H:i:s");
    mais çà, c'est du formatage PHP, il faut jongler...

    La syntaxe de l' INSERT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $insert = 'INSERT INTO compteur (ip,date,pgm,referer) VALUES("'.$adress.'", "'.$date.'", "'.$pgm.'", "'.$referer.'")';
    on commence par ' de façon à conserver les " nécessaires à la syntaxe SQL
    A la lumière de celle-ci qui fonctionne la tienne devrait ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = sprintf 'INSERT INTO Puissance(Date) VALUES ("'.$time.'")';
    pour peu que $time soit déjà au format MySQL.

    Tu vérifieras aussi, il doit y avoir des doublons dans les INSERT, pb de PRIMARY KEY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DBD::mysql::db do failed: Duplicate entry '' for key 'PRIMARY' at F:/export_data
    _sql_V5.pl line 329.
    Bon courage !

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut Sql
    Je vous remercie tous de m'aider;
    C'est très sympa !!

    Je retraville dessus actuellement.

    Je reposterais des scripts dans la journée si ça avance bien

    Merci
    @+

  18. #18
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bonjour,

    Je n'ai rien lu de ton code, mais un conseil, quand tu manipules du SQL dans du Perl ou autre language, dès qu'il y a souci, il faut afficher ta requête et la tester indépendamment de Perl par exemple.
    Tu extrait ta requête et la teste sous PHPMyadmin ou sous console. La plupart du temps ce sont des soucis SQL et non Perl.
    Une façon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $ma_requete = "INSERT INTO ********";
    Voilà !

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut Sql
    Ok, pour PhpMyAdmin, je vais l installer sur mon PC.
    J'ai faits des print de mes requetes avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sqlQuery  = $dbh->prepare($query)
    Et j'obtiens bien les bonnes valeurs à exporter. Du coup, le souci doit venir de :
    La synthaxe des requetes en SQL (a tester avec la methode de djibril) et puis je reviendrais là si ça avance bien

    Merci
    @+

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 51
    Points : 17
    Points
    17
    Par défaut Sql
    Re-hello

    Bon, bonne nouvelle, avec tous vos conseils, j'ai bien reussi à compiler le script.
    Du coup, avec ces modifs, je reçois bien les bonnes valeurs et les bons serveurs sont interrogés.

    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
    ##### ouverture session #####
     
    Content-type: text/htmlnnINSERT INTO Puissance(Puissance_P, Puissance_Q, Dephasa
    ge, Puissance_S)
                             VALUES
                             ("38173768,47807648,814,24458688,")Content-type: text/h
    tmlnnINSERT INTO Puissance(Puissance_P, Puissance_Q, Dephasage, Puissance_S)
                             VALUES
                             ("381517,0,65428,0,")Content-type: text/htmlnnINSERT IN
    TO Puissance(Puissance_P, Puissance_Q, Dephasage, Puissance_S)
                             VALUES
                             ("106655360,114967210,982,28581966,")
     
    ##### Fin session #####
    Press Enter to continue

    Les requetes SQl ont toutes été réécrites, et maintenant
    Le dernier 'hic' se situe apres la fonction execute.
    je pense qu'il y a un souci dans l'export ou alors dans la constitution de ma bdd sql : j'ai ces erreurs pour l'export :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    ##### ouverture session #####
    
    
    Content-type: text/htmlnnINSERT INTO Puissance(Puissance_P, Puissance_Q, Dephasa
    ge, Puissance_S)
                             VALUES
                             ("38177368,47812188,813,24460544,")DBD::mysql::st execu
    te failed: Column count doesn't match value count at row 1 at F:/export_data_sql
    _V5.pl line 310.
    Content-type: text/htmlnnINSERT INTO Puissance(Puissance_P, Puissance_Q, Dephasa
    ge, Puissance_S)
                             VALUES
                             ("381520,0,65433,0,")DBD::mysql::st execute failed: Col
    umn count doesn't match value count at row 1 at F:/export_data_sql_V5.pl line 31
    0.
    Content-type: text/htmlnnINSERT INTO Puissance(Puissance_P, Puissance_Q, Dephasa
    ge, Puissance_S)
                             VALUES
                             ("106660140,114972170,961,28582494,")DBD::mysql::st exe
    cute failed: Column count doesn't match value count at row 1 at F:/export_data_s
    ql_V5.pl line 310.
    
    
    
    ##### Fin session #####
    Press Enter to continue
    Je vais appronfonidr cela . . . .

    Merci
    @+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probleme de date dans requete SQL vers base de donnée MS Access
    Par Uren dans le forum Persistance des données
    Réponses: 1
    Dernier message: 04/08/2008, 13h06
  2. Réplication données depuis Base SQL Server vers Base MYSQL
    Par elspliffo dans le forum Réplications
    Réponses: 2
    Dernier message: 27/09/2007, 14h02
  3. Réplication données depuis Base SQL Server vers Base MYSQL
    Par elspliffo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/09/2007, 14h02
  4. Requete SQL sur base SQL Server VB6
    Par Yanmeunier dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/11/2005, 12h30
  5. Exporter des données d'un requete SQL vers excel (csv)
    Par PrinceMaster77 dans le forum ASP
    Réponses: 9
    Dernier message: 08/10/2005, 22h28

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