Vous n'êtes pas identifié(e).
Bonjour
Je suis très novice en php/Mysql, je me débrouille un peu pour changer certaines choses par essais/erreurS mais je ne suis pas compétente au point de pouvoir écrire moi-même des codes qui pourraient s'exécuter.
J'utilise un script, très bien fait, pour une énorme base de données généalogiques. Le script est TNG (http://lythgoes.net/genealogy/software.php) et mon site est ici :
http://www.genhcn.net/genealogie
Voici mon problème. Avec ce script, on peut générer des "reports", un de ces "reports" est de pouvoir classer les familles, des plus nombreuses aux moins nombreuses, à l'aide de ce script dans l'espace administration. On ne peut pas réellement l'utiliser directement sur le site, trop gros dans mon cas. Mais je sais bien qu'il doit être la base même de ce que j'ai besoin.
concat('<a href="familygroup.php?familyID=',f.familyid, '&tree=genhcn">', IF(isnull(h.lastname), ' ',h.lastname),'/ ',
IF(isnull(w.lastname), ' ',w.lastname),'</a>') AS FamilyName, COUNT(c.personid) AS Nombre_enfant,
concat('<a href="getperson.php?personID=',f.husband, '&tree=genhcn">',h.firstname,' ',h.lastname,'</a>') AS Père,
concat('<a href="getperson.php?personID=',f.wife,'&tree=genhcn">',w.firstname,' ',w.lastname,'</a>') AS Mère
FROM tng_families AS f
LEFT JOIN tng_people AS h ON f.gedcom = h.gedcom AND f.husband = h.personid
LEFT JOIN tng_people AS w ON f.gedcom=w.gedcom AND f.wife = w.personid
LEFT JOIN tng_children AS c ON f.gedcom=c.gedcom AND f.familyid = c.familyid
WHERE f.gedcom = 'genhcn'
GROUP BY c.gedcom,c.familyid
ORDER BY Nombre_enfant DESC
Voici l'image du résultat que je veux avoir :
[img align=c]http://img689.imageshack.us/img689/3588/image1fkf.jpg[/img]
La structure des deux tables probablement concernées par ce code, enfin, j'espère que je n'en oublie pas.
CREATE TABLE IF NOT EXISTS `tng_children` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`gedcom` VARCHAR(20) NOT NULL,
`familyID` VARCHAR(22) NOT NULL,
`personID` VARCHAR(22) NOT NULL,
`frel` VARCHAR(20) NOT NULL,
`mrel` VARCHAR(20) NOT NULL,
`sealdate` VARCHAR(50) NOT NULL,
`sealdatetr` DATE NOT NULL,
`sealplace` text NOT NULL,
`haskids` tinyint(4) NOT NULL,
`ordernum` SMALLINT(6) NOT NULL,
`parentorder` tinyint(4) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `familyID` (`gedcom`,`familyID`,`personID`),
KEY `personID` (`gedcom`,`personID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=31063 ;
Ce que je veux, principalement ça serait de pouvoir faire un include dans ma page d'accueil. J'aimerais qu'on puisse y voir les 10 familles les plus nombreuses ou les familles ayant plus de X enfants.
Une âme charitable pour m'aider avec ce fichu code?
Du moins, des indices comment l'utiliser. J'ai fouillé mais je n'y comprend strictement rien.
Dernière précision.
Si je suis ici, c'est que le seul forum existant pour ce script est anglophone. Donc, pour une novice en php, c'est un lourd handicap!
Ça fait des semaines que je regarde, fouille, mais je n'y comprend pas grand chose, ça me dépasse un peu disons.
Je vous remercie d'avance pour toute aide qui pourrait me faire avancer avec ce bout de code.
Nat
Hors ligne
Saluton,
Il nous manque la description de la table `tng_people`, en toute rigueur.
Le reste est assez basique :
La table de référence est la table tng_families qui est en double jointure avec la table tng_people via les colonnes gedcom husband et wife et personid.
Elles est aussi en jointure avec la table tng_children via les colonnes gedcom et familyid.
Il suffit de faire un GOUP BY familyid et COUNT(*) pour récupérer le nombre d'enfants qu'on aliasse en `effectif`
On fait un test sur `effectif`, pour qu'il soit supérieur à X ou bien un ORDER BY `effectif` DESC LIMIT 10
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Bonjour Maljuna Kris
Le reste est assez basique?
Je veux bien te croire! Sauf que comme je l'ai écrit, pour modifier quelques points dans un code, je suis extra mais pour en créer un au complet, c'est une autre histoire!
J'suis plus compétente en histoire régionale qu'en php/mysql disons!
Donc, la table tng_people est ainsi constituée :
Ce sont les jointures comme tu dis où je me perd, j'ai lu sur le sujet. Fait des tentatives mais j'n'arrivais à rien. Je refermais le tout, laissais passer une journée ou deux me disant que je finirais par comprendre! Niet! J'n'y arrive pas!
J'étais prête à laisser tomber sauf que plusieurs personnes autour me parle de cette liste qu'ils aimeraient bien voir, donc je m'y remettais, sans succès. Ce week-end, j'ai tenté ma chance afin de trouver de l'aide.....
Hors ligne
Si je ne m'abuse ça devrait donner quelque chose comme ça.
Bien entendu X dans HAVING Nombre_enfant > X doit être remplacer par la valeur choisie, qui peut être passée en paramètre à la requête par PHP.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Ok!
Sauf que....
Te l'ai dit, novice, très novice!
Ce merveilleux code, je le place comment en final?
Entre des balises?
<?php ?>
Pour l'entête du fichier, je dois faire appel à ma base et tout, ça, je sais.
Mais pour code comme tel?
Merci pour ton aide... enfin, à ce stade, ce n'est plus de l'aide, c'est carrément tout me dire!
Nat
Plusieurs tentatives de faites. Au mieux, ça m'affiche le code dans la page!
Je persiste!
Dernière modification par genhcn (15-06-2010 17:18:53)
Hors ligne
Comme POO ne me dit absolument rien, te dirais Mysql!
:mdr:
C'est bien ça?
$database_host = "localhost";
$database_name = "nom de la base";
$database_username = "user";
.......
Hors ligne
Non ce sont des variables. ^^
Pour mysql tu dois donc utiliser la fonction $ressource = mysql_query($requete);
Mais à la vue de ce que tu connais je te conseillerai d'aller lire les cours du site sur comment faire des requêtes SQL.
Cela ne fait pas énormément en lecture et cela t'aidera bien mieux que de te donner un code tout fait. (surtout vu la facilité du code)
Hors ligne
Te remercie mais ça fait un bout que je lis et je ne comprend pas plus.
Je lis présentement sur $ressource = mysql_query($requete);
Si je comprend, je dois utiliser :
$requete = "SELECT CONCAT('<a .............
Sauf que j'ai toujours un message d'erreur directement dans la première ligne de ce code, donc, j'suis dans le champ! Je n'ai pas la bonne méthode.
Hors ligne
Parse error: parse error in G:\xampp\htdocs\genealogie\000.php on line 25
la ligne 25 étant
Hors ligne
J'ai essayé plusieurs choses dans les derniers jours, et c'est toujours là que ça accroche. A moins que ça soit la structure même de la requête?
Sais pas, je pose des questions, m'y connais pas vraiment.
Hors ligne
C'est ce que j'ai en total
$db = mysql_connect('localhost','user','mdp') or die("Database error");
mysql_select_db('nom-base', $db);
(ligne 12 )$query = "SELECT CONCAT('<a href="familygroup.php?familyID=',f.familyid,'&tree=genhcn">', f.familyid,'</a>') AS familyid,
CONCAT('<a href="familygroup.php?familyID=',f.familyid, '&tree=genhcn">', IF(isnull(h.lastname), ' ',h.lastname),'/ ',IF(isnull(w.lastname), ' ',w.lastname),'</a>') AS FamilyName,
COUNT(c.personid) AS Nombre_enfant,
CONCAT('<a href="getperson.php?personID=',f.husband, '&tree=genhcn">',h.firstname,' ',h.lastname,'</a>') AS Père,
CONCAT('<a href="getperson.php?personID=',f.wife,'&tree=genhcn">',w.firstname,' ',w.lastname,'</a>') AS Mère
FROM tng_families AS f
LEFT JOIN tng_people AS h ON f.gedcom = h.gedcom AND f.husband = h.personid
LEFT JOIN tng_people AS w ON f.gedcom=w.gedcom AND f.wife = w.personid
LEFT JOIN tng_children AS c ON f.gedcom=c.gedcom AND f.familyid = c.familyid
WHERE f.gedcom = 'genhcn'
GROUP BY c.gedcom,c.familyid
HAVING Nombre_enfant > 16
ORDER BY Nombre_enfant DESC LIMIT 10
";
?>
Parse error: parse error in G:\xampp\htdocs\genealogie\000.php on line 12
Dernière modification par genhcn (15-06-2010 20:58:33)
Hors ligne
Problème de guillemets dans ta requête. Utilises un logiciel qui fait met de la couleur syntaxique, tu trouverai facilement ce genre d'erreur.
$query = "SELECT CONCAT('<a href=\"familygroup.php?familyID=',f.familyid,'&tree=genhcn\">', f.familyid,'</a>') AS familyid,
CONCAT('<a href=\"familygroup.php?familyID=',f.familyid, '&tree=genhcn\">', IF(isnull(h.lastname), ' ',h.lastname),'/ ',IF(isnull(w.lastname), ' ',w.lastname),'</a>') AS FamilyName,
COUNT(c.personid) AS Nombre_enfant,
CONCAT('<a href=\"getperson.php?personID=',f.husband, '&tree=genhcn\">',h.firstname,' ',h.lastname,'</a>') AS Père,
CONCAT('<a href=\"getperson.php?personID=',f.wife,'&tree=genhcn\">',w.firstname,' ',w.lastname,'</a>') AS Mère
FROM tng_families AS f
LEFT JOIN tng_people AS h ON f.gedcom = h.gedcom AND f.husband = h.personid
LEFT JOIN tng_people AS w ON f.gedcom=w.gedcom AND f.wife = w.personid
LEFT JOIN tng_children AS c ON f.gedcom=c.gedcom AND f.familyid = c.familyid
WHERE f.gedcom = 'genhcn'
GROUP BY c.gedcom,c.familyid
HAVING Nombre_enfant > 16
ORDER BY Nombre_enfant DESC LIMIT 10
";
?>
Dernière modification par xTG (16-06-2010 06:05:21)
Hors ligne
J'utilise Notepad2 qui met de la couleur.
Mais comme je l'ai déjà écrit, je suis novice, je travaille à l'aveugle plus que d'autre chose pour faire ça, pas mon domaine une minute. Je sais que les couleurs sont importantes...
Donc, une erreur de guillemets?
Je vais chercher.....
Hors ligne
Je vais chercher.....
il vient de te donner la réponse !!!!
MERCI de lire le mode d'emploi avant de poster !!
Hors ligne
Mais, ça ne fonctionne pas plus!
J'avais essayé les \ hier.
Me donne une page blanche
J'viens de faire un copier/coller intégral, pas mieux
Hors ligne
J'allume!
Si ça me donne une page blanche, c'est que ma requête passe. Je dois donc la faire s'afficher.
Sauf que, ça ce n'est pas fait!
Car habituellement, je n'ai qu'à ramasser le code comme $personid et lui dire où s'afficher. Mais dans ce cas-ci, ce n'est pas la même chose.........
Je repars à la recherche.
Merci pour votre aide...............
Hors ligne
Quand tu liras les cours, penses bien au fait que tu cherches à récupérer un tableau de résultats.
Car des fonctions pour récupérer ce qui provient d'une requête il y en a plusieurs, mais toutes ne sont pas bonnes à prendre.
Hors ligne
Suis-je sur la bonne voie ou complètement dans le champ?
echo '<table bgcolor="#FFFFFF">'."\n";
// première ligne on affiche les titres prénom et surnom dans 2 colonnes
echo '<tr>';
echo '<td><b><u>#</u></b></td>';
echo '<td><b><u>FamilyName</u></b></td>';
echo '<td><b><u>Père</u></b></td>';
echo '<td><b><u>Mère</u></b></td>';
echo '<td><b><u>nombre</u></b></td>';
echo '</tr>'."\n";
{
echo '<tr>';
echo '<td>'.$count.'</td>';
echo '<td>'.$row["c.familyid"].'</td>';
echo '<td>'.$row["w.personid"].'</td>';
echo '<td>'.$row["h.personid"].'</td>';
echo '<td>'.$row["Nombre_enfant"].'</td>';
echo '</tr>'."\n";
}
echo '</table>'."\n";
}
else echo 'Pas d\'enregistrements dans cette table...';
Hors ligne
Plutôt dans le champs. ^^
$query est ta requête textuelle, son interprétation se fait via mysql_query() qui va te renvoyer une ressource MySQL.
C'est cette ressource qu'il faut exploiter avec les fonctions de résultat.
Hors ligne
ouf!
Je recommence
mdr
Hors ligne
if (!$result) {
$message = 'Requête invalide : ' . mysql_error() . "\n";
$message .= 'Requête complète : ' . $query;
die($message);
}
while ($row = mysql_fetch_assoc($result)) {
echo '<table width="80%">'."\n";
echo '<td>';
echo $row['familyid'];
echo '</td>';
echo '<td>';
echo $row['Nombre_enfant'];
echo '</td>';
echo '<td>';
echo $row['Père'];
echo '</td>';
echo '<td>';
echo $row['Mère'];
echo '</td>';
echo '</table>'."\n";
}
Vous m'avez fait forcer les boys!
Quoi que... vous n'aviez pas tort... sauf que j'avais besoin de vrrrraiment beaucoup d'aide pour ce code.
Ma question maintenant, mon code est-il "propre"?
C'est à dire, qu'il ne demande pas trop à ma base?
Le voici en entier, sans la mise en page.
// Exécution de la requête
$result = mysql_query($query);
if (!$result) {
$message = 'Requête invalide : ' . mysql_error() . "\n";
$message .= 'Requête complète : ' . $query;
die($message);
}
while ($row = mysql_fetch_assoc($result)) {
echo '<table width="80%">'."\n";
echo '<td>';
echo $row['familyid'];
echo '</td>';
echo '<td>';
echo $row['Nombre_enfant'];
echo '</td>';
echo '<td>';
echo $row['Père'];
echo '</td>';
echo '<td>';
echo $row['Mère'];
echo '</td>';
echo '</table>'."\n";
}
?>
Dernière modification par genhcn (16-06-2010 16:35:40)
Hors ligne
bah, c'est une de mes habitudes mais ton pavé de echo ' '; successif peut s'abréger par un petit appel à la concaténation :
voir même tout passer par le même echo '' ... mais après, on dit de moi que c'est maladif
MERCI de lire le mode d'emploi avant de poster !!
Hors ligne
J'avais vu mais j'savais pas comment m'y prendre!
Trouvais qu'y en avait beaucoup moi aussi!
Mon problème est toujours de faire un entête, j'réussis mais tout meurt après la première ligne, le reste est hors du tableau..... je travaille, je travaille..........
Hors ligne