Aller au contenu

[perl] sql > table hash multidimensionnel


pierrickg

Messages recommandés

bonjour tous,

j'avais été bien aidé pour le début de mon script, je reviens pour la fin.

je récupère une liste de liens dans une base mysql, je teste leur existence et je mets les faux dans un tableau par site (1 site peut avoir plusieurs liens).

ensuite j'envoie un mail à chaque site avec la liste de SES liens faux.

mon problème : ça liste TOUS les liens de TOUS les sites à chaque fois.

mon code :

# prendre tous les liens
$query = "SELECT * FROM liens";
$sth = $dbh->prepare($query);
$sth->execute;

# enregistrer les url fausses 
my %site_list = {};
while ($data = $sth->fetchrow_hashref()) {
$nb_liens++;
# test url
$etat = &check_url($data->{'url'}); 
if ($etat eq "ok"){
	$nb_ok++;
} else {
	my %h = {};
	#on index chaque url par nom
	$h->{$data->{'lien_nom'}} = $data->{'url'};
	#on index par site
	$site_list->{$data->{'site_id'}} = $h;	
	$nb_bad_liens++;
} 
}
my $list_l;
for my $id (keys %{$site_list}) {
# infos site
$query = "SELECT site_nom FROM sites WHERE site_id = '$id' LIMIT 1";
$sth = $dbh->prepare($query);
$sth->execute;
	$data_site = $sth->fetchrow_hashref();
$site_nom = $data_site->{'site_nom'};

# infos webmestre
$query = "SELECT * FROM webmestres WHERE site_id = '$id' LIMIT 1";
$sth = $dbh->prepare($query);
$sth->execute;
	$data_wbm = $sth->fetchrow_hashref();
$wbm_nom = 	$data_wbm->{'wbm_nom'};
$wbm_prenom = $data_wbm->{'wbm_prenom'};
$wbm_email = $data_wbm->{'wbm_email'};

# liste des liens
$list_l = '';
for my $name (keys %{$site_list->{$id}}){
	$list_l .= "'$name' - " . $site_list->{$id}->{$name} . "\n";	
}

# envoyer l'email
$msg= <<_EOM_;
Bonjour $wbm_prenom $wbm_nom,
Vous êtes webmestre du site "$site_nom" inscrit sur l'annuaire.
Un ou plusieurs liens enregistrés dans l'annuaire pour votre site semblent inaccessibles :
$list_l

#######... (et envoi)

Lien vers le commentaire
Partager sur d’autres sites

en gros, tous les liens sont considérés comme mauvais, c'est ça ? (ou alors j'ai rien compris)

non, je garde bien uniquement les liens faux.

Mais lorsque je passe site par site ( for my $id (keys %{$site_list}) ...) je veux envoyer un email contenant la liste de liens faux uniquement de ce site.

Mais la liste $list_l, pourtant réinitialisés à une valeur vide à chaque site, se remplit de la liste complète des liens faux à l'étape :

for my $name (keys %{$site_list->{$id}}){
	$list_l .= "'$name' - " . $site_list->{$id}->{$name} . "\n";	
}

au lien de mettre que les liens du site identifié par $id.

je ne comprends pas pourquoi, vu que j'appelle déjà la table avec l' $id 'un site à la fois.

pour être clair, j'ai un tableau du genre:

tablo => site1 => nom1 = lien1

tablo => site2 => nom2 = lien2

tablo => site2 => nom3 = lien3

et dans la liste pour site1, j'ai les 3 liens, au lieu du 1er seulement.

Lien vers le commentaire
Partager sur d’autres sites

Tu as toute la liste pour tous les emails que tu envoie, c'est bien ça ?

Ça me semble normal vu que tu pointe vers la structure entière qui contient tous les liens morts :

$site_list->{$data->{'site_id'}} = $h;

Utilise strict (use strict;) ça évite beaucoup d'erreurs. Et là il t'aurait dit que $h n'était pas définit (sauf si tu l'utilises par ailleurs).

Lien vers le commentaire
Partager sur d’autres sites

me revoilà !

en effet, il a suffit de remplacer

		my %h = {};
			$h->{$data->{'lien_nom'}} = $data->{'url'};
			$site_list->{$data->{'site_id'}} = $h;

par

$site_list->{$data->{'site_id'}}{$data->{'lien_nom'}} = $data->{'url'};

si je mets "use strict" je tombe sur une erreur 500 et m'envoi à la page d'erreur du serveur sans m'indiquer les erreurs perls.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...