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 :

Manipulation de mysql par un script PERL : UPDATE non effectué en sortie du script


Sujet :

SGBD Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Manipulation de mysql par un script PERL : UPDATE non effectué en sortie du script
    Mon cas n'est pas très facile à expliquer, et je suis vraiment bloqué. Je vais essayer d'être clair, et espère y réussir. Je suis évidement prêt à donner toutes informations complémentaires.

    Par un script PERL je manipule une base de données mysql en utilisant le module DBI::

    Ces manipulations se font seulement par des SELECT et UPDATE.

    Une partie de ces maniputalions se fait dans une boucle WHILE parcourue entre une date de début et une date de fin.

    Lorsque le script se termine et que je controle dans mysql ce qui s'est passé, toutes les manipulations faites sur les données de la derniere date de la boucle WHILE n'apparaissent pas. (il s'agit en fait de mettre un champ 'choix' TINYINT à 1. Pour la derniere date ce champ 'choix' reste desesperement à 0)

    Si je fais un UPDATE dans mysql avec les mêmes conditions d'UPDATE que dans le script, le champ 'choix' passe bien à 1.

    Si juste avant de sortir du script PERL ( par un classique : $dbh->disconnect je fais une lecture de la base par un SELECT et des print adéquats, le champ choix est donné à 1.

    En résumé :

    1 Tant que le script PERL tourne, il est possible de trouver et lire (par des commandes PERL) ces données de la derniere date. Mais dés que j'en sors il n'y a plus moyen de retrouver ces données de cette derniere date.

    2 Si je stoppe le script PERL juste avant le '$dbh->disconnect' : les données sont existantes dans PERL (dans quelque buffer, que sais-je ?). Si je vais voir sous mysql, seules les mises à jour de la date de fin n'est pas disponible.

    3 J'ai écrit un script séparé pour relire la base de données : il me donne les mêmes résultats que ceux que j'ai sous mysql : les données de la derniere date ne sont pas à jour.

    Je ne comprends pas.

    Si quelqu'un arrive à m'aider, cela m'enleverais une grosse épine du pied.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    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 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Je pense qu'il serait vachement pratique que tu nous montre ton code car il y a peut être un problème de programmation dans ta boucle while.

    Et sans code, ça va être difficile de trouver où se niche trés exactement ton problème.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    C'est sur, cela a plus de "geulle" ainsi.

    D'ailleurs, je me demandais bien comment d'autres intervenant arrivaient à faire cette 'jolie' presentation.

    Merci

    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
    # $date_debut_saisie, my $date_fin_saisie sont les dates au format AAAA-MM-JJ
     
    sub traitement ()
    {
    ($date_debut_saisie, my $date_fin_saisie) = @_;
     
    # Je fais tout ce traitement sur la date pour traiter l'incrementation de la date dans la boucle for (le balayage peut porter sur plus d'un an)
     
    my $date_calcul;
     
    #
    # Definition de la date de début et de la date de fin du balayage
    #
    my $date_debut_complete =
    	DateTime->new(	year		=> 2004,
    					month		=> 9,
    					day			=> 1,
    					hour		=> 0,
    					minute		=> 0,
    					second		=> 0,
    					nanosecond	=> 0,
    					time_zone		=> "floating",
    					);
    my $date_debut = $date_debut_complete->clone() -> truncate(to => 'day');
    my @date_entree = split /-/, $date_debut_saisie;
    my $date_deb =
    DateTime->new(	year		=> $date_entree[0],
    				month		=> $date_entree[1],
    				day			=> $date_entree[2],
    				hour		=> 0,
    				minute		=> 0,
    				second		=> 0,
    				nanosecond	=> 0,
    				time_zone		=> "floating",
    				); # date de début des calculs
    my @date_entree = split /-/, $date_fin_saisie;
    my $date_fin =
    DateTime->new(	year		=> $date_entree[0],
    				month		=> $date_entree[1],
    				day			=> $date_entree[2],
    				hour		=> 0,
    				minute		=> 0,
    				second		=> 0,
    				nanosecond	=> 0,
    				time_zone		=> "floating",
    				); # date de fin des calculs
    #
    # Dates à Balayer
    #
    for ( my $dt = $date_deb->clone(); $dt <= $date_fin; $dt->add(days => 1)) 
    	{
    	my @date_jour = split /-/, $dt; 
    	my @chaine = split /T/, $date_jour[2]; # pour en extraire la chaine avant le T
    	$date_jour[2] = $chaine[0];
    	my @date_decomposee = ($date_jour[0],$date_jour[1],$date_jour[2]);
    	$date_calcul = join ('-', @date_decomposee);
    #
    # Definition de la liste des villes à balayer
    #
    # Effacement de la table qui contient les villes
    	my $sth = $dbh->do("TRUNCATE TABLE VillesDuJour;");
    # Remplissage de la table contenant les Villes du jour sur lequel porte les calculs
    	my $nb_insert = $dbh->do(qq{INSERT INTO VillesDuJour (Ville) SELECT Ville FROM Globalite_test WHERE Globalite_test.date = '$date_calcul' GROUP BY Ville}, undef, 'DONE') or die $dbh->errstr;
    # recuperation des noms de ces villes
    	$sth = $dbh->prepare("SELECT Ville FROM VillesDuJour;");
    	$sth->execute() or die $sth->errstr;
    	$nb_lignes = 0;
    	while (my $ref = $sth->fetchrow_hashref()) 
    		{
    		my @choix_n_Data;
    		my @choix_Personne;
    # $Ville[] va contenir les differentes villes d'un jour
    		$Ville[$nb_lignes] =  $ref->{'Ville'};
    # mise à zéro de la colonne choix
    #		$sth_1 = $dbh->do("UPDATE Complements SET choix = 0 WHERE date = '$date_calcul' AND ville = '$Ville[$nb_lignes]';");
    		my $ligne = $dbh->do(qq{UPDATE Complements SET choix = 0 WHERE date = '$date_calcul' AND ville = '$Ville[$nb_lignes]'}, undef, 'DONE') or die $dbh->errstr;
    # Param est un entier < 10, RoGJ : est une donnee de classement
    		my $sth_1 = $dbh->prepare("SELECT Ville, date, Param, Personne FROM Complements WHERE date = '$date_calcul' AND Ville = '$Ville[$nb_lignes]' ORDER BY RoGJ DESC;") or die $dbh->errstr;
    		$rv = $sth_1->execute or die $sth_1->errstr;
    		$explo_select = 0;
    		while (my $ref = $sth_1->fetchrow_hashref()) 
    			{
    # $Ville[] va contenir les differentes les villes d'un jour
    			$Param =  $ref->{'Param'};
    			$Personne =  $ref->{'Personne'};
    			if (@choix_n_Data[$Param] == 0) 
    				{
    				@choix_n_Data[$Param] = 1;
    print "Ville : $Ville[$nb_lignes] , date : $date_calcul , parametre : $n_Course, Personne : $Personne \n";
    # permet de vérifier que les valeurs sont bonnes. Elles le sont
    				my $ligne_modifiee = $dbh->do(qq{UPDATE Complements SET choix = 1 WHERE date = '$date_calcul' AND Ville = '$Ville[$nb_lignes]' AND Param = '$Param' AND Personne = '$Personne'}, undef, 'DONE') or die $dbh->errstr;
    if ($ligne_modifiee eq 0) {
    	exit; # il n'y a pas eu d'UPDATE
    	}
    ############  TEST DU BON ENREGISTREMENT DE LA VALEUR DE choix
    # La ou est le SELECT ne renvoie qu'une ligne. Donc cette boucle WHILE n'a qu'un passage. Mais je laisse quand même cette boucle. Ce n'est que du texte 
    my $sth_2 = $dbh->prepare("SELECT Ville, date, param, choix FROM Complements WHERE date = '$date_calcul' AND Ville = '$Ville[$nb_lignes]' AND Param = '$Param' AND Personne = '$Personne' ;") or die $dbh->errstr;
    $rv = $sth_2->execute or die $sth_2->errstr;
    $explo_select_test = 0;
    while (my $ref = $sth_2->fetchrow_hashref()) 
    	{
    	$Ville =  $ref->{'Ville'};
    	$Param =  $ref->{'Param'};
    	$Personne =  $ref->{'Personne'};
    	$choix =  $ref->{'choix'};
    print "Resultat du controle : pour la ville $Ville et le parametre $Param et la Personne $Personne le choix vaut $choix \n ";
    	$explo_select_test++;
    	}
    # et là je constate que le champ choix a bien la valeur voulue.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    En lisant la doc du CPAN sur le module DBI:, dans un exemple du genre :
    $sth = $dbh->prepare(q{INSERT INTO .... }
    la dernière ligne était :

    $dbh->commit or die ...

    Alors qu'un 'prepare' sur un 'INSERT INTO' , si j'ai bien compris, ne nécessite pas de

    $sth->execute

    ils trouvent le besoin de faire un : $dbh->commit or die ...

    J'ai quand même essayé dans mon appli. en mettant ce commit juste avant le disconnect. A première vue, les valeurs de 'choix' de la dernière date sont maintenant mises à jour.

    Je suis bien content, mais étonné. Ceci semblerait dire que dans la boucle while, c'est le déroulement du passage suivant qui va mettre à la base de donnée. Je veux bien, mais cela n'est indiqué nulle part. Enfin, je ne l'ai pas vu.

    Quand on lit le paragraphe de la doc sur 'commit', il est dit que lorsque AutoCommit est 'on' on a un message d'erreur. Je ne sais pas si j'ai reçu ce message, mais apparement.

    Demain je vais bien controler le résultat et si ce fonctionnement se confirme, je fermerais le discussion.

    Que pensez vous de ce fonctionnement bizare ?

    D'avance merçi

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Suite à mon ajout du commit, ls derniers données sont bien transférées vers mysql lorsque je me deconnecte de mysql.

    Je considère donc le problème comme résolu.

    Merci de votre aide.

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

Discussions similaires

  1. [PDO] PDO.sqlite : update non effectué, mais pas d'erreur
    Par Yosko dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/04/2012, 16h55
  2. [SyncFramework 2.1] Update non effectué
    Par Invité dans le forum Framework .NET
    Réponses: 1
    Dernier message: 13/10/2011, 09h56
  3. update non effectué
    Par *alexandre* dans le forum Hibernate
    Réponses: 8
    Dernier message: 11/11/2008, 07h56
  4. Update non effectué
    Par nellynew dans le forum Access
    Réponses: 1
    Dernier message: 13/09/2006, 12h37
  5. [perl/CGI] Ecrire du HTML dans un script perl
    Par LE NEINDRE dans le forum Web
    Réponses: 3
    Dernier message: 02/08/2005, 14h50

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