Vous n'êtes pas identifié(e).
Bonjour à tous,
Je récupère cette variable en GET :
$id_voiture = $_GET['id_voiture'];
Et je veux comparer l'égalité entre cette variable avec le résultat d'une requête mysql contenant dans un des champs de la table toute une série de valeur séparé par un "/".
Par exemple :
$id_voiture= 18;
si dans le champs de ma table, il y a : 3/9/15/18/30/59
J'aimerai que ca me détecte le 18 !!
J'espere que je m'explique corectement...
J'ai essayé ce code, mais ca ne fonctionne pas... :
$sql='SELECT GROUP_CONCAT( `auto` ) AS "autos" FROM pieces_historique WHERE categories="$cat"';
$res = mysql_query( $sql );
$dataautos = mysql_fetch_assoc( $res );
if ( in_array( $id_voiture, explode( '/', $dataautos['autos'] ) ) ) {
echo "Oui"; // ok
}
else {
echo "non"; //pas ok
}
Merci d'avance pour votre aide.
Hervé
Hors ligne
$sql='SELECT GROUP_CONCAT( `auto` ) AS "autos" FROM pieces_historique WHERE categories="$cat"';
dans tous les cas, cette requete ne retoourne rien
en php, les variables ne sont pas parsées entre les simples cotes (de porc)
a++
Hors ligne
Ok, compris.
J'imagine que c'est mieux comme ça :
$sql="SELECT GROUP_CONCAT( `auto` ) AS \"autos\" FROM pieces_historique WHERE categories=\"$cat\" GROUP BY categories";
Ca marche nickel ! merci bcp pour m'avoir fait voir mon erreur d'inatention ...
++
rv
Hors ligne
normal, tu ne fait aucune boucle
donc, un seul tuple est lu
while($dataautos = mysql_fetch_assoc( $res )
{
ton code
};
a++
Hors ligne
Merci Pierrot,
Ca fonctionne mieux ainsi.
Derniere petit question, et apres je pense avoir terminé : maintenant, je voudrais récupéré les infos de la table sql mais je vois pas ce que je peux mettre dans le WHERE auto='$.............'"); à la ligne 10.
Voici le code avec le while :
while($dataautos = mysql_fetch_assoc( $res ))
{
if ( in_array( $id_voiture, explode( '/', $dataautos['autos'] ) ) )
{
$result_query = mysql_query("SELECT * FROM pieces_historique WHERE auto='$.............'");
$res = mysql_fetch_array ($result_query);
$id = $res['id'];
$nom = $res['nom'];
$description = $res['description'];
$photo = $res['photo'];
$prix = $res['prix'];
$ref = $res['ref'];
}
else {
echo "ARTICLE NON DISPO";
}
};
?>
A+
Hervé
Hors ligne
heu j'ai pas compris, tu veut faire quoi avec ta requete ligne 10 ?
parce que bon le where n'est "remplis" qu'en sachant ce que tu veut faire de la requete
si c'est le résultat de la requete précedente c'est $dataautos['autos'] qu'il faut mettre ...
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
En fait à la ligne 10, j'aimerai récupéré les infos (prix, reference, designation) qui sont dans la table pieces_historique pour l'identifiant de la voiture choisi, d'où le WHERE auto = ... mais quand je place $dataautos['autos'], j'ai une erreur..
J'avoue que je ne maitrise plus vraiment mon code ...
Si $id_voiture = 18;
A quoi est égale cette variable : $dataautos['autos'] ??
Hors ligne
on va faire simple parce que je pige pas trop ta tambouille :d
le résultat de ta requete SQL (avec le group concat) te retourne des lignes avec dedans des chose comme ça : 3/9/15/18/30/59 ?
$dataautos['autos'] est ce que tu récupère avec mysql_fetch_assoc dans la boucle while
ligne 8 tu cherche a savoir si $idvoiture (sortie d'un chapeau magique ?) est dans les valeurs fournis par la requete. Ceci par le biais de explode qui te fournis les valeurs dans un tableau et in_array qui cherche si une valeur est dans un tableau.
Si ton $idauto est ce que tu veut mettre dans la requete sql ligne 10, je vois pas trop à quoi sert le reste.
on n'a pas assez d'info sur ce que tu veut faire, car dans ton cas tu pourrais très bien utiliser le explode après ta requete et regarder la valeur à l'index 3 du tableau
$tableau = explode( '/', $dataautos['autos'] ) ;
//$tableau[3] ==18 si la structure de ce que tu a mis a ton 1er message est toujours la même.
Mon avis sur la question :
Ta table est mal pensée. Je pense que tu doit pouvoir faire 'plus simple' que ce que tu fait actuellement.
si tu nous explique comment tu a créer ta table, peut être pourrions nous mieux comprendre ce que tu souhaite faire (mais la c'est super alambiqué pour pas grand chose j'ai l'impression).
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
Ok ok, je m'explique un peu mieux :
Déjà, mon $id_voiture provient d'un Get de cette façon là : $id_voiture = $_GET['id_voiture'];
Cette variable sera un nombre.
Ensuite, vu qu'une ref d'une piece auto peut s'adapter sur plusieurs sortes de voiture, dans ma table pieces_historique j'ai créé un champs qui se nomme 'auto' où je rempli de cette façon : 15/59/65/73/98 (qui siginifie toutes les sortes de voiture pour laquelle la pièce est compatible)
Donc, si notre $id_voiture = 65, j'aimerai que la pièce où le champs auto est : 15/59/65/73/98 s'affiche avec son prix, designation, reference etc.......
Si notre $id_voiture = 21, ca affiche PIECE NON DISPO POUR CETTE VOITURE.
En gros, je n'aurais pas eu ce probleme si une piece s'adapter que sur une unique sorte de voiture. Là, j'aurais simplement fait :
WHERE auto = '$id_voiture'.
Est ce que c'est un peu plus claire ?
Merci d'avance ...
Dernière modification par rvgotti (09-10-2010 09:49:53)
Hors ligne
Wé c'est plus clair
Tu a un probleme de modelisation de ta base.
Par exemple pour modifier ton champ tu est obligé de le faire a la main au risque de faire anerie. Imagine la taille du champ pour une rondelle ou les pneus de ma saxo
Il te faut une table auto : ok
Une table pieces : ok ( sans le champ disgracieux avec les id auto)
Une table piecesauto qui va faire la jointure entre les deux premieres
Par exemple
Id clef primaire
Idpieces
Idauto
Pas besoin d'autre chose et cela te permet de faire ta requete facilement
Je te fait un exemple plus concret si besoin quand je rentre
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
Le principe est simple : 3 tables pour tout faire
une table auto (qui contient les modèle de véhicule)
create table autos(
id int unsigned not null auto_increment,
designation tinytext,
primary key(id)
)type=myisam;
insert into autos values (null,'saxo'),(null,'yaris');
une table pour les pieces détachées
create table pieces (
id int unsigned not null auto_increment,
designation tinytext,
primary key(id)
)type=myisam;
insert into pieces values(null,'pneu saxo'),(null,'penu yaris'),(null, 'frein saxo'),(null,'cardan yaris'),(null,'capot saxo');
une table qui fait la liaison entre les deux premières
create table piecesautos(
id int unsigned not null auto_increment,
idpiece int unsigned not null,
idauto int unsigned not null,
primary key (id)
)type=myisam;
insert into piecesautos values(null,1,1),(null,2,2),(null,3,1),(null,4,2),(null,5,1);
A partir de la si tu choisis une auto dans la 1ère table tu peu récupérer ls pièces qui y sont associées en utilisant une jointure
http://sqlpro.developpez.com/cours/sqlaz/jointures/.
Grosso modo c est quoi une jointure ?
He ben c'est les fait de faire une requete sur deux tables en même temps avec des infos identique entre les deux tables.
Dans notres cas idauto c'est la clef primaire de la table auto. Elle permet d'identifier un véhicule car c'est "id" est UNIQUE (a cause de la primary key ).
Même chose pour idpiece.
si tu choisis une voiture tu aura la clef primaire de la voiture que tu pourra utiliser sur la table piecesautos
select designation, piecesautos.id as idpiecesauto from piecesautos inner join pieces on idpiece=pieces.id where idauto=1;
select designation ,piecesautos.id as idpiecesauto from piecesautos inner join autos on idauto=autos.id where idpiece=6;
ici le 1 représente la valeur fournis par ton 1er formulaire ou lien. (donc $_GET['idauto'] par exemple)).
L'avantage de cette solution c'est que si tu te trompe sur une pice c'est facile a modifier et tu n'est pas obligé de modifier un champ bizard où tu a des chances de faire une annerie
si par exemple tu veut savoir a quelle voiture correspond une pièce (et afficher le nom de la piece) :
select autos.designation as auto, pieces.designation as piece from piecesautos inner join autos on idauto=autos.id inner join pieces on idpiece
=pieces.id where idpiece=6;
Comment aller plus loin ?
Par exemple en créant une table constructeurs qui contiendra .... (renault, citroen, peugeot, bmw etc). Dans la table autos tu ajoutera le idconstructeur
ensuite les requetes sont un poil plus compliqué mais le principe est la :d
par exemple on peu avoir
create table pays (
id smallint unsigned not null auto_increment,
nom tinytext not null,
primary key(id)
)type=myisam;
insert into pays values (null,'France'),(null,'Japon'),(null,'Allemagne'),(null,'Italie');
create table constructeurs (
id int unsigned not null auto_increment,
idpays smallint unsigned not null,
nom tinytext not null,
primary key(id)
)type=myisam;
insert into constructeurs values (null,1,'Citroën'),(null,1,'Peugeot'),(null,1,'Renault'),(null,2,'toyota'),(null,4,'Ferrari'),(null,4,'maserati'),(null,3,'BMW');
create table autos(
id int unsigned not null auto_increment,
idconstructeur int unsigned not null,
designation tinytext,
primary key(id)
)type=myisam;
insert into autos values (null,1,'saxo'),(null,4,'yaris');
pour avoir les voitures et les constructeurs et pays associés
select autos.designation as auto, constructeurs.nom as constructeur, pays.nom as pays from autos inner join constructeurs on autos.idconstructeur=constructeurs.id inner join pays on constructeurs.idpays=pays.id;
résultat
+-------+--------------+--------+
| auto | constructeur | pays |
+-------+--------------+--------+
| saxo | Citroën | France |
| yaris | toyota | Japon |
+-------+--------------+--------+
tu trouvera à cette adresse http://phpdebutant.org/wall2162.php le fichier sql que j'ai utilisé pour mes tests pour ce que j'ai mis plus haut
amuse toi bien
@+
PS : le lien sur les jointures est a lire en priorité si tu ne connais pas
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
Merci Moogli, j'ai plus qu'à apprendre les jointures, chose que je ne connais pas du tout.
Je tiens au courant dès que je m'en suis sorti
en tout cas, un grand merci a toi pour cette réponse hyper détaillée...
Hors ligne
Re,
Ma requete me donne aucun résultat, j'ai pourtant suivi toute ton explication :
Seuls modifs :
Ta table 'autos', est 'voitures'
Ta table 'pieces' est 'pieces_historique'
Ta table 'piecesautos' a le même nom chez moi.
Pour rappel, ta requete :
select autos.designation as auto, pieces.designation as piece from piecesautos inner join autos on idauto=autos.id inner join pieces on idpiece
=pieces.id where idpiece=3;
A+
hervé
Dernière modification par rvgotti (11-10-2010 07:09:37)
Hors ligne
Cela vient du fait que tu as des lacunes sur comment interroger une table.
La petite lecture que tu as du faire un peu trop en diagonale : http://phpdebutant.org/article66.php
Hors ligne
hum xTG je suis curieux de savoir ce qui n'est pas bon dans la requete, parce que j'ai moi "ça marche" ;
apres je corrigerais la requete ainsi : SELECT voitures.nom as auto, pieces_historique.nom as nompiece, pieces_historique.id as idpiece FROM piecesautos INNER JOIN voitures ON idauto=voitures.id INNER JOIN pieces_historique ON idpiece=pieces_historique.id WHERE idpiece=3
voitures.nom est le "nom" de l'auto pas la clef primaire, ceci afin d'afficher une liste du style
+-------+----------------------+
| auto | piece |
+-------+----------------------+
| saxo | macaron BZH en force |
| yaris | macaron BZH en force |
+-------+----------------------+
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
Sa requête est bonne, mais il n'interprète aucunement la ressource retournée par mysql_query() : cf code de son dernier post.
Donc il a beau avoir une bonne requête il ne sait pas exploiter son résultat.
Hors ligne
C'est ok, j'ai compris le probleme, j'arrive enfin à afficher le resultat de la requete. Merci à tous pour votre aide.
ca a été laborieux mais au moins j'ai compris les requetes avec les jointures.
encore merci
Hors ligne
Saluton,
En fait, xTG, tu verras, à l'usage, que c'est surtout Moogli qui n'est jamais trop clair.
Hein ranuleto ?
Il serait tout simplement peut-être bon de rappeler à chacun le sens du verbe anglais to fetch
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