SELECT MySQL dynamique

Eléphant du PHP | 248 Messages

10 déc. 2007, 20:48

Bonjour,

dans ma base de donné j'ai ces données

Code : Tout sélectionner

[u]nom[/u] [u]Parent[/u] dossier - dossier/dos2 dossier/ dossier/dos2/dos3 dossier /dos2 dossier/dos2/dos3/dos4 dossier /dos2/dos3
Je cherche un moyen pour que quand je souhaite par exemple effacé dossier/dos2 cela supprime aussi les dossiers du dessous c'est à dire dossier/dos2/dos3, dossier/dos2/dos3/dos4

J'ai pensé à faire une selection dynamique c'est à dire si je sélectionne comme dossier de départ dossier/dos2 ca fait une recherche sur la base pour voir le dossier où il est parent en occurence dossier/dos2/dos3 puis chercher où dossier/dos2/dos3 est parent et ainsi de suite. Je ne sais pas si c'est réalisable.


Avez vous une idée?

Merci d'avance pour votre aide

Eléphanteau du PHP | 40 Messages

10 déc. 2007, 20:57

essais plutot de faire un DELETE table WHERE nom LIKE 'dossier/dos2%'
cela t'effacera tout les enregistrement de la table 'table' qui commence par dossier/dos2
en construction http://plus2site.fr

Eléphant du PHP | 248 Messages

10 déc. 2007, 21:00

oui mais si j'ai un autre dossier qui contient dossier/dos2 exemple dossier1/dossier/dos2 ca laissera beaucoup d'erreur


Merci pour ton aide j'ai réussi à trouver les solution pour supprimer mais j'ai toujours besoin d'aide pour la selection multiple

Eléphant du PHP | 248 Messages

12 déc. 2007, 18:20

Enfait j'aimerai trouver un moyen pour faire ceci:


exemple je sélectionne /dossier (qui se trouve dans le champ nom de ma base) il m'affiche /dossier puis le script selectionne le dossier où /dossier est parent c'est à dire dossier/dos2 et ainsi de suite. :?

Je pensais à quelque chose comme ceci:

$sql="SELECT nom FROM dossier";
$result=mysql_query($sql);

while($row=mysql_fetch_array($result)){
list($nom)=$row;


$sqlB="SELECT nom FROM dossier WHERE parent='$nom'";
$resultB=mysql_query($sqlB);

while($rowB=mysql_fetch_array($resultB)){
list($nomB)=$rowB;

// et répéter l'opération jusqu'à ce que je puisse avoir tous les dossiers
}


}







J'espère que vous pourrez m'éclairer :(

merci beaucoup pour votre aide

Eléphanteau du PHP | 40 Messages

12 déc. 2007, 19:54

essais de donner les resultats que tu voudrais obtenir en fonction de ta base de depart.
la je vois pas ce que tu veut faire si tu nous donne un petit exemple significatif c'est cool.
EX je veut recupere tout les chiens qui on comme parent medor:

Code : Tout sélectionner

nom chien parent -------------- --------------- Medor Medor Machin Medor Machinchose Machin Medor Machinchose
resultat

Code : Tout sélectionner

Medor Machin
tu vois dans cette exemple Medor Pere de Medor on sais que c'est impossible donc le champ parent est mal conçut il faudrais y mettre la clef primaire qui doit etre unique a chaque enregistrement.
dans ton cas de base rien n'en peche d'avoir un chemin dossier/dossier/dossier/dos2 donc quand tu demande de trouver les dossiers dont dossier est parent c'est difficile???? quel dossier!!
si deux dossiers ne peuve mas porter le meme non dans systemes:
SELECT nom FROM table WHERE parent LIKE 'dossier/%'
en construction http://plus2site.fr

Eléphant du PHP | 248 Messages

12 déc. 2007, 20:32

Salut Gadgino,

ma base de départ c'est:

Code : Tout sélectionner

[u]nom[/u] [u]Parent[/u] dossierA dossierA/dos2 dossierA/ dossierA/dos2/dos3 dossierA/dos2 dossierA/dos2/dos3/dos4 dossierA/dos2/dos3 dossierA/dos2-1 dossierA/ dossierA/dos2-2 dossierA/
le résultat que je veut avoir c'est que le lance une première requête exemple sur le champ nom dossierA dès que le script à récupérer le résultat il recherche les noms où dossierA est parent.

Donc il doit m'afficher dossierA/dos2, dossierA/dos2-1, dossierA/dos2-2 des qu'il a ce résultat, le script doit rechercher les noms où dossierA/dos2, dossierA/dos2-1, dossierA/dos2-2 comme il y a que dossierA/dos2 qui se trouve dans le champs parent il va me donner dossierA/dos2/dos3 ....... ainsi de suite.




je veut avoir ca comme résultat:

Code : Tout sélectionner

dossierA/ ---dossierA/dos2 ------dossierA/dos2/dos3 ------dossierA/dos2/dos3/dos4 ---dossierA/dos2-1 ---dossierA/dos2-2


je reprend ton exemple juste une modif sur le dernier Medor:

Code : Tout sélectionner

nom chien parent -------------- --------------- Bethoven Machin Bethoven Machinchose Machin Medor Machinchose
imagine je selectionne "nom chien" Bethoven ca doit retourner Machin puis chercher où Machin est parent il me retourne Machinchose puis rechercher où Machinchose est parent et me retourne Medor


Bethoven c'est le root
merci pour ton aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 déc. 2007, 17:16

oui mais si j'ai un autre dossier qui contient dossier/dos2 exemple dossier1/dossier/dos2 ca laissera beaucoup d'erreur
Non.
La chaine "dossier1/dossier/dos2" ne commence pas par "dossier/dos2", l'enregistrement ne sera donc pas concerné par la suppression (le pourcentage dans le LIKE n'est qu'à la fin, pas au début).

Le seul problème que tu pourrais rencontrer avec cette méthode, c'est un dossier nommé "dossier/dos23", qui commencera donc bien par "dossier/dos2". Afin d'éviter cela, il suffit que tes chemins de dossier se terminent par un "/". Ainsi "dossier/dos23/" ne sera pas impacté par la suppression de "dossier/dos2/" et fils...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 248 Messages

13 déc. 2007, 19:31

Bonjour Ryle merci pour ta réponse. Mais enfait j'ai reussi à trouver une solution pour la suppréssion par contre la ou je bloque c'est pour avoir l'arborescence de la navigation comme code voici ce que j'ai mis:

$sqlb="SELECT id,nom FROM dossier WHERE root='' ORDER BY nom ASC";
$resultb=mysql_query($sqlb);


while($rowb=mysql_fetch_array($resultb)){
list($id,$nom)=$rowb;

$sql="SELECT COUNT(*) FROM extranet_dossier WHERE parent='$nom'";
$result=mysql_query($sql);

$row=mysql_fetch_row($result);

$datacount=$row[0];

if($datacount>0){


echo "$nom<br />";

$sqla="SELECT nom FROM dossier WHERE parent='$nom' ORDER BY nom ASC";
$resulta=mysql_query($sqla);

while($rowa=mysql_fetch_array($resulta)){
list($noma)=$rowa;


//ici c'est de voir je dois vérifier si [b]$noma [/b] à un fils et ainsi de suite
}

echo "</div></div>";

}else{

echo "$nom<br />";
}
}


Voila un bout de mon code à partir de $noma je cherche à voir s'il a un fils car enfait les niveaux sont illimités. Je l'ai fait manuellement jusqu'au 5ème mais je cherche un moyen pour le faire automatiquement.

Merci encore une fois pour ton aide

Eléphanteau du PHP | 40 Messages

15 déc. 2007, 14:25

lol tu veu faire une fonction recursive:

j'ai pas le temp de la pondre en concret mais essais de faire un truc comme ça
fuction rechercher_fils(paramkon_abesoin){ //fonction qui se rappelle elle même recursive
       je chercher les fils
       if(un_fils){    //je rappel ma fonction c'est recurrent
          je prepare les parametres;
          rechercher_fils(paramkon_abesoin)
}

rechercher_fils(param);  //c'est le premier appelle de cette fonction 
voila c'est peut etre ce type d'architecture que tu a besoin

EDIT: Merci Zeus pour la correction lol faudrait que je recurre mon vocabulaire histoire de l'avoir propre nickel. Là il y a des bughoplasmes-hortographiques.
Modifié en dernier par gadgino le 15 déc. 2007, 19:17, modifié 4 fois.
en construction http://plus2site.fr

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 déc. 2007, 14:40

On dit "récursive" et pas "récurrente" ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 248 Messages

15 déc. 2007, 17:06

Salut Gadgino,
merci pour ton aide. Je pense que la fonction "recursive" pourrai marcher je vais le testé

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

15 déc. 2007, 18:46

Le seul problème que tu pourrais rencontrer avec cette méthode, c'est un dossier nommé "dossier/dos23", qui commencera donc bien par "dossier/dos2". Afin d'éviter cela, il suffit que tes chemins de dossier se terminent par un "/". Ainsi "dossier/dos23/" ne sera pas impacté par la suppression de "dossier/dos2/" et fils...
Alternativement, on pourrait utiliser une clause WHERE pour couvrir les deux cas, eg

Code : Tout sélectionner

WHERE nom = 'dossier/dos2' OR nom LIKE 'dossier/dos2/%'
Note : attention si le chemin comporte des backslash \ auquel cas il faudra échapper 2 fois la chaîne utilisée dans LIKE, sans quoi le motif sera mal interprété, eg

Code : Tout sélectionner

WHERE nom = 'dossier\\dos2' OR nom LIKE 'dossier\\\\dos2\\\\%'

Eléphant du PHP | 248 Messages

15 déc. 2007, 22:22

Bonjour Hubert,
euh les chemins ont des /

merci pour ton conseil pour le jour où je serai confronté au \:D