Variables dynamiques

Répondre
Kazimir
le 01/03/2007 à 23:50
Kazimir
Bonjour a tout le monde

je débute en php et je suis entrain de m'embrouiller les neurones avec une vilaine variable.
je dois recuperer des infos dans une db en me servant de 4 variables différentes.
ex:
$tem1 = mysql_query("SELECT * FROM table WHERE id='$id_tem1'");
list($n_tem1, $p_tem1) = mysql_fetch_array($tem1);

$tem2 = mysql_query("SELECT * FROM table WHERE id='$id_tem2'");
list($n_tem2, $p_tem2) = mysql_fetch_array($tem2);

$tem3 = mysql_query("SELECT * FROM table WHERE id='$id_tem3'");
list($n_tem3, $p_tem3) = mysql_fetch_array($tem3);

$tem4 = mysql_query("SELECT * FROM table WHERE id='$id_tem4'");
list($n_tem4, $p_tem4) = mysql_fetch_array($tem4);


je souhaite reduire le code sous forme de boucle FOR, mais j'arrive pas a visualiser la syntaxe.

please, somebody can help me ?
THE Kazzz
jocker
le 02/03/2007 à 00:02
jocker
déjà ta requete

$tem1 = mysql_query("SELECT * FROM table WHERE id='$id_tem1'");
list($n_tem1, $p_tem1) = mysql_fetch_array($tem1);

sous entend qu'il n'y a que 2 champs dans ta table. Une boucle while est sûrement mieux appropriée. Là c'est un peu vague parce qu'on a pas assez d'élément pour savoir ce que tu veux faire exactement. Faire une boucle FOR comme tu veux oui on comprend le principe mais je pense qu'il y a surement d'autre chose plus intéressant à vérifier avant dans le fonctionnement de ton script.

Si tu peux nous en dire plus ca sera bien.

Par ex ton $id_tem1 c'est déjà une variable, tu as plusieurs techniques apres pour récupérer ce dont tu as besoin. par ex faire un tableau associatif du style
$result[$id_tem1] = ton résultat
etc pour toutes tes variables au moins tu réduis à une seule requete SQL.

Enfin pour ma part je ne pense pas avoir assez d'information pour te donenr une réponse plus précise

++
Kazimir
le 02/03/2007 à 00:36
Kazimir
en fait, non, j'ai mis juste 2 champs pour l'exemple, dans mon script, je dois recupérer les valeurs contenues dans 6 champs de la table pour chaque $id_temX

le principe:
je fais un script de genealogie, donc pour une personne donnée, a son mariage peut avoir 4 temoins
pour cette personne, je nomme ses temoins par leur N° id stocké dans les champs id_tem1, id_tem2, id_tem3, id_tem4
connaissant maintenant les id des temoins, je dois aller chercher les infos en lancant une requete par id_temX

le tout en vu de remplir une fiche d'infos.

voila le complement de script (qui ressemble deja a ceux donnés):
$resultats = mysql_query("SELECT * FROM vie WHERE id='$id'");

list($id, $date_mar_civ, $lieu_mar_civ, $date_mar_rel, $lieu_mar_rel, $id_tem1, $id_tem2, $id_tem3, $id_tem4, $id_conjoint, $id_pere_conj, $age_pere_conj, $prof_pere_conj, $id_mere_conj, $age_mere_conj, $prof_pere_conj, $contrat, $notaire, $date_contrat, $lieu_contrat, $date_divorce, $tgi, $date_remarie, $id_conj2, $date_mort, $lieu_mort, $date_inhume, $lieu_inhume) = mysql_fetch_row($resultats); //28 variables

//recuperation desinfos de chaque temoin
$tem1 = mysql_query("SELECT * FROM table WHERE id='$id_tem1'");
list($n_tem1, $p_tem1, $m_t1, $t_t1) = mysql_fetch_array($tem1);

$tem2 = mysql_query("SELECT * FROM table WHERE id='$id_tem2'");
list($n_tem2, $p_tem2, $m_t2, $t_t2) = mysql_fetch_array($tem2);

$tem3 = mysql_query("SELECT * FROM table WHERE id='$id_tem3'");
list($n_tem3, $p_tem3, $m_t3, $t_t3) = mysql_fetch_array($tem3);

$tem4 = mysql_query("SELECT * FROM table WHERE id='$id_tem4'");
list($n_tem4, $p_tem4, $m_t4, $t_t4) = mysql_fetch_array($tem4);


wala, j'espere ne pas etre trop brouillon
THE Kazzz
jocker
le 02/03/2007 à 12:52
jocker
dans ce cas là regarde plutôt des jointures

LEFT JOIN me semble plus approprié à ton besoin.
Kazimir
le 02/03/2007 à 14:32
Kazimir
mmmmmmmm, ca me fait penser a un truc:

J'ai 4 tables accueillants chacunes les infos de la personne.
Donc j'ai dans chaque table l'ID de l'individu.

Vu que je dois recuperer les infos des 4 tables, pour passer de 4 requetes a 1 seule, est-ce que j'ai le droit de faire ca:
remplacer
$result = mysql_query("select * from etat_civil WHERE id='$id'");	
$resulta = mysql_query("SELECT * FROM enfant WHERE id='$id'");
$resultat = mysql_query("SELECT * FROM divers WHERE id='$id'");
$resultats = mysql_query("SELECT * FROM vie WHERE id='$id'");

par ca:
$result = mysql_query("select * from etat_civil, vie, enfant, divers WHERE id='$id'");


j'ai bon ?

pour le LEFT JOIN, je regarde dans le FM que j'ai sur mysql, j'apprend et je repasse (ceci dit, ca a l'aire d'etre sur la bonne voie)

merci plein.
THE Kazzz
Kazimir
le 02/03/2007 à 14:59
Kazimir
je reviens a la charge.

Je pense avoir trouvé pas comment reduire le nombre de requete, mais juste optimiser le code.

Dites moi si ca peut marcher, vu que je connais pas grand chose, LOL

Remplacement de :
//extraction des infos du temoin1
if ($id_tem1 != "")
{
$tem1 = mysql_query("SELECT nom,prenoms FROM etat_civil WHERE id='$id_tem1'");
list($nom_tem1, $prenom_tem1) = mysql_fetch_row($tem1);
$temoin1 = $nom_tem1." ".$prenom_tem1;
$tem1 = "<a href="individu.php?id=$id_tem1" alt="fiche de $nom_tem1">$nom_tem1</a>";
}

//extraction des infos du temoin2
if ($id_tem2 != "")
{
$tem2 = mysql_query("SELECT nom,prenoms FROM etat_civil WHERE id='$id_tem2'");
list($nom_tem2, $prenom_tem2) = mysql_fetch_row($tem2);
$temoin2 = $nom_tem2." ".$prenom_tem2;
$tem2 = "<a href="individu.php?id=$id_tem2" alt="fiche de $nom_tem2">$nom_tem2</a>";
}

//extraction des infos du temoin3
if ($id_tem3 != "")
{
$tem3 = mysql_query("SELECT nom,prenoms FROM etat_civil WHERE id='$id_tem3'");
list($nom_tem3, $prenom_tem3) = mysql_fetch_row($tem3);
$temoin1 = $nom_tem3." ".$prenom_tem3;
$tem3 = "<a href="individu.php?id=$id_tem3" alt="fiche de $nom_tem3">$nom_tem3</a>";
}

//extraction des infos du temoin4
if ($id_tem4 != "")
{
$tem4 = mysql_query("SELECT nom,prenoms FROM etat_civil WHERE id='$id_tem4'");
list($nom_tem4, $prenom_tem4) = mysql_fetch_row($tem4);
$temoin4 = $nom_tem4." ".$prenom_tem4;
$tem4 = "<a href="individu.php?id=$id_tem4" alt="fiche de $nom_tem4">$nom_tem4</a>";
}

Par ceci:
$ID_tem = array($ID_tem1, $ID_tem2, $ID_tem3, $ID_tem4);

for ($i=0, $i<=3, $i++){
$tem[$i] = mysql_query("SELECT nom, prenoms FROM etat_civil WHERE id='$ID_tem[$i]'");
list($nom_tem[$i], $prenoms_tem[$i]) = mysql_fetch_row($tem[$i]);
}
THE Kazzz
LA GLOBULE
le 02/03/2007 à 22:35
LA GLOBULE
Pourquoi une boucle ?
Si tu veux les 4 cas tout le temps, utilise un OR directement en SQL, comme ca tu auras tout en une requete :

$sql = "SELECT nom, prenoms FROM etat_civil WHERE id='".$ID_tem[0]."' OR id='".$ID_tem[1]."' OR id='".$ID_tem[2]."' OR id='".$ID_tem[3]."'";

Ou alors, je n'ai rien compris au problème :/
Kazimir
le 03/03/2007 à 11:31
Kazimir
ben, une boucle tout simplement parce que je dois absolument recuperer les 4 infos et les dispatcher dans les variables associées.

dans ta requete, ca le fait, mais je devrais ensuite faire un WHILE pour placer chaque enregistrement en variable.
donc ca revient au même.
THE Kazzz
LA GLOBULE
le 03/03/2007 à 13:21
LA GLOBULE
Ca revient pas au même pour le nombre de requete que tu fais manger à ton mysql.
Kazimir
le 03/03/2007 à 14:03
Kazimir
alors, si comprend bien:
en faisant
$sql = "SELECT nom, prenoms FROM etat_civil WHERE id='".$ID_tem[0]."' OR id='".$ID_tem[1]."' OR id='".$ID_tem[2]."' OR id='".$ID_tem[3]."'";

il suffira de faire ensuite un truc genre:
$i = 1;
while($rep = mysql_fetch_array($sql)){
$nom_prenom[$i] = $rep['nom']." ".$rep['prenom'];
$i++;
}


avec ca, je n'envoi qu'une requete a mysql (au lieu de 4).
Et je suis sur que les infos contenues dans $nom_prenom1 correspondent bien a l'$id_tem[1] ?
THE Kazzz
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours