Bdd relationnelles

Résolu/Fermé
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 - 13 mars 2008 à 17:11
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 - 16 avril 2008 à 18:53
Bonjour,

Voici une mini-colle:

j'ai cet appel à ma bdd:
"SELECT item.id AS itid,item.document AS itdoc,item.object AS itobj,item.backgroundattachment AS itbckatt,item.backgroundrepeat AS itbckrep,
item.backgroundcolor AS itbckcolor,item.backgroundimage AS itbckimg,item.border AS itborder,item.listype AS itlistype,
position.id AS posid, position.document AS posdoc, position.object AS posobj, position.position AS pospos, position.floater AS posflo,
position.zindex AS poszin, position.lefter AS poslef, position.toper AS postop, position.righter AS posrig, position.bottomer AS posbot,
position.margin AS posmar, position.padding AS pospad, position.width AS poswid, position.height AS poshei,
style.id AS stid, style.document AS stdoc, style.object AS stobj, style.fontfamily AS stff, style.fontsize AS stfsz, style.fontstretch AS stfstr,
style.fontstyle AS stfst, style.fontvariant AS stfv, style.fontweight AS stfw, style.color AS stcol, style.textdecoration AS sttd,
style.textalign AS stta, style.texttransform AS sttt, style.letterspacing AS stls, style.wordspacing AS stws FROM item,position,style
WHERE item.object='".$what."' AND position.object='".$what."' AND style.object='".$what."'
AND item.document='".$where."' AND position.document='".$where."' AND style.document='".$where."'
ORDER BY item.id,position.id,style.id"

il doit me sélectionner un élément commun à ces trois tables, imaginons l'élément "ex", et en sortir toutes les propriétés qui sont réparties dans ces trois tables (item,position,style), grâce à une fonction qui génère un tableau. Lorsque j'affiche la requête dans mon navigateur, elle s'affiche bien, tout est okay. Dès que j'regarde le code source pour voir le fonctionnement de la fonction, je me rend compte qu'au lieu de me sortir 3 lignes pour mes 3 éléments qui ont tous une part de leur description dans chacune des 3 tables, il me pond 26 fois le résultat de ma requête (j'ai compté).

Quelqu'un aurait-il une idée?

Merci pour votre aide^^

4 réponses

Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58
14 mars 2008 à 13:26
up
1
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
14 mars 2008 à 13:44
Bonjour,

Il te manque qqch dans la clause WHERE pour préciser comment tu fais correspondre les lignes dans tes trois tables.

Par exemple (il faudrait mieux connaître le schéma de ta base pour être certain) :

WHERE item.object='".$what."' AND position.object=item.object AND style.object=item.objet

Ta clause WHERE actuelle provoque un "produit cartésien" qui génére beaucoup d'enregistrement.
0
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58
14 mars 2008 à 15:28
Bonjour Croy, et merci de te pencher sur mon problème^^


J'ai fais la modification que tu m'as indiquée, et voici ce que je constate:

-sous myadmin6 en requête sql ça fonctionne impecc, ça me récupère la ligne comme il faut^^

-sous un navigateur, le problème persiste :s...

En fait, cette requête est incluse dans une fonction, et cette fonction est appellée via un mysql_fetch_array qui est supposé me balayer les enregistrements de la bdd, donc je suppose que le problème viendrait de l'appel à cette fonction^^ qu'en pense tu? Voici l'appel:

<?php
$sqlCALLER="SELECT item.document AS itdoc,item.object AS itobj, position.document AS posdoc, position.object AS posobj,
style.document AS stdoc, style.object AS stobj
FROM item,position,style
WHERE item.document='main' AND position.document='main' AND style.document='main'";

$query=mysql_query($sqlCALLER);
?>
<style type="text/css">
<?php

while($recall=mysql_fetch_array($query))
{

bckplus($recall['itobj'],main);

};
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114 > Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011
14 mars 2008 à 15:43
Dans ton script, la clause where n'a pas été modifiée et génère donc toujours un produit cartésien.

Modifie la comme indiqué plus haut.

La suite de ton script est un peu bizarre : pourquoi une balise <style à cet endroit ?

Pourrais-tu me donner le source de ta fonction bckplus.
0
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58 > croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012
14 mars 2008 à 15:48
Okay, j't'envoi la sauce^^


Comme tu as déjà du le comprendre, il s'agit de récupérer dynamiquement les propriétés css d'une page, d'où la présence d'une balise "<style" dans le script^^
J'ai déjà fait le test avec une seule table, qui enregistre quelques propriétés css, et les restituer dynamiquement: ça fonctionne^^ c'est juste avec plusieurs tables que ça fonctionne pas, or j'ai du en créer plusieurs pour conserver l'intérêt de ce système avec les css^^






function bckplus($what,$where)
{

//on récupère les propriétés en fonction de l'objet et du document auquel il est associé
$sql="SELECT item.id AS itid,item.document AS itdoc,item.object AS itobj,item.backgroundattachment AS itbckatt,item.backgroundrepeat AS itbckrep,
item.backgroundcolor AS itbckcolor,item.backgroundimage AS itbckimg,item.border AS itborder,item.listype AS itlistype,
position.id AS posid, position.document AS posdoc, position.object AS posobj, position.position AS pospos, position.floater AS posflo,
position.zindex AS poszin, position.lefter AS poslef, position.toper AS postop, position.righter AS posrig, position.bottomer AS posbot,
position.margin AS posmar, position.padding AS pospad, position.width AS poswid, position.height AS poshei,
style.id AS stid, style.document AS stdoc, style.object AS stobj, style.fontfamily AS stff, style.fontsize AS stfsz, style.fontstretch AS stfstr,
style.fontstyle AS stfst, style.fontvariant AS stfv, style.fontweight AS stfw, style.color AS stcol, style.textdecoration AS sttd,
style.textalign AS stta, style.texttransform AS sttt, style.letterspacing AS stls, style.wordspacing AS stws FROM item,position,style
WHERE item.object='".$what."' AND position.object=item.object AND style.object=item.object
AND item.document='".$where."' AND position.document=item.document AND style.document=item.document";
$query=mysql_query($sql);



while($css=mysql_fetch_array($query))
{

if($css['itobj'])
{
echo $css['itobj']." { ";
};

if($css['itbckatt'])
{
echo "background-attachment:".$css['itbckatt']."; ";
};

if($css['itbckrep'])
{
echo "background-repeat:".$css['itbckrep']."; ";
};

if($css['itbckcol'])
{
echo "background-color:".$css['itbckcol']."; ";
};

if($css['itbckimg'])
{
echo "background-image:url('".$css['itbckimg']."'); ";
};

if($css['itborder'])
{
echo "border:".$css['itborder']."; ";
};

if($css['itlistype'])
{
echo "list-style-type:".$css['itlistype']."; ";
};

if($css['pospos'])
{
echo "position:".$css['pospos']."; ";
};

if($css['posflo'])
{
echo "float:".$css['posflo']."; ";
};

if($css['poszin'])
{
echo "z-index:".$css['poszin']."; ";
};

if($css['poslef'])
{
echo "left:".$css['poslef']."; ";
};

if($css['postop'])
{
echo "top:".$css['postop']."; ";
};

if($css['posrig'])
{
echo "right:".$css['posrig']."; ";
};

if($css['posbot'])
{
echo "bottom:".$css['posbot']."; ";
};

if($css['posmar'])
{
echo "margin:".$css['posmar']."; ";
};

if($css['pospad'])
{
echo "padding:".$css['pospad']."; ";
};

if($css['poswid'])
{
echo "width:".$css['poswid']."; ";
};

if($css['poshei'])
{
echo "height:".$css['poshei']."; ";
};

if($css['stff'])
{
echo "font-family:".$css['stff']."; ";
};

if($css['stfsz'])
{
echo "font-size:".$css['stfsz']."; ";
};

if($css['stfstr'])
{
echo "font-stretch:".$css['stfstr']."; ";
};

if($css['stfst'])
{
echo "font-style:".$css['stfst']."; ";
};

if($css['stfv'])
{
echo "font-variant:".$css['stfv']."; ";
};

if($css['stfw'])
{
echo "font-weight:".$css['stfw']."; ";
};

if($css['stcol'])
{
echo "color:".$css['stcol']."; ";
};

if($css['sttd'])
{
echo "text-decoration:".$css['sttd']."; ";
};

if($css['stta'])
{
echo "text-align:".$css['stta']."; ";
};

if($css['sttt'])
{
echo "text-transform:".$css['sttt']."; ";
};

if($css['stls'])
{
echo "letter-spacing:".$css['stls']."; ";
};

if($css['stws'])
{
echo "word-spacing:".$css['stws']."; ";
};
//fin de la ligne de propriétés
echo " }";

?>

<!-- espace qui permet le saut à la ligne entre 2 css^^ -->


<?php
};//fin du while de récupération des propriétés

};//fin de la fonction bckplus qui récupère les propriétés de what et where


//fonction de récupération de chaque élément de css
$sqlCALLER="SELECT item.document AS itdoc,item.object AS itobj, position.document AS posdoc, position.object AS posobj,
style.document AS stdoc, style.object AS stobj
FROM item,position,style
WHERE item.document='main' AND position.document='main' AND style.document='main'";

$query=mysql_query($sqlCALLER);
?>
<style type="text/css">
<?php
//cette fonction retourne le résultat multiplié par le nombre de tables.
while($recall=mysql_fetch_array($query))
{

bckplus($recall['itobj'],main);

};
?>
</style>
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
14 mars 2008 à 16:30
Première chose à faire (recommandation) clarifier ton code en le présentant mieux : tabulations montrant les blocs logiques, suppression des accolades et ; inutiles....

AInsi :
if($css['stfst'])
{
echo "font-style:".$css['stfst']."; ";
};

sera remplacé par :
if( $css[ 'stfst' ] )
echo "font-style:" . $css[ 'stfst' ] . "; ";

Ceci permet de mieux comprendre la structure.

Il me semble qu'il devrait être prossible de faire un seul select :
$sql="SELECT item.id AS itid,item.document AS itdoc,item.object AS itobj" // ici variables supprimées pour mieux voir
. " FROM item,position,style"
. " WHERE item.document='main' AND position.document='main' AND style.document='main'"
. " AND position.object=item.object AND style.object=item.object";

Puis ensuite de boucler directement sur les résultats. Peutêtre un ORDER BY sera nécessaire.

Je te recommande d'aller dans cette direction en te limitant à qqes variables pour la mise au point.
0
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58
14 mars 2008 à 17:44
L'indentation est un réflexe long à mettre en place chez moi ;) surtout qu'il faut que j'trouve la méthode qui me correspondra le mieux^^ ceci dit, l'apprentissage de javascript que je suis depuis quelques temps m'oriente vers une méthode plus aboutie, qui n'est pas reflétée dans ce script -il est plus ancien. Ceci pour dire: tu as raison :D

Pour les expressions "if" simplifiées, c'est une méthode que j'ai déjà vue quand j'apprennais ça, mais que je n'ai pas retenue, vu que j'voulais apprendre en me consolidant de bonnes bases^^ mais je retiens, ça me sera utile pour transformer ce script -et bien d'autres^^

Pour le select et tes recommandations, je n'aurais pas l'occasion de bosser dessus avant la semaine prochaine, mais j'en prends bonne note ;) je posterais ici mes résultats :)

Cheers^^
0
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58
16 avril 2008 à 18:53
problème résolu
0