8721 sujets

Développement web côté serveur, CMS

Pages :
Bonjour mon probleme est le suivant jai 2 tables, et il fau que je les lie car les informations stocké dans ces tables dépendent les unes des autres.

alor je m'explique:
j'ai un chassis (table:equipements), un chassis et une sorte d'armoire qui contient 16 cartes(table:cartes).
pour les 16 cartes nous avons une adresse IP , celle du chassis.
Avec ces information voila ce ke j'ai sorti comme table.

Table equipement
ID_E
IP
marque
nom

Table cartes
ID_C
description
serial
HW_version
SW_version

table relation
ID_R
ID_C
ID_E

donc maintenant ce que moi je desire c'est fair le lien entre ID_C de la table cartes et celle de la table relation, pareil pour ID_E.

et pour mes requetes futur je voudrai fair en sorte de recupere les information sur les cartes seulement grace a l'adresse IP ou au nom du chassis.Sachant qu'il y a une adresse IP et un nom par chassis.

voila ce ke j'ai deja fait, et l'erreur qui m'est retournée.



set_time_limit(240);

$IP2 =$_POST['IP2'];
$nom2=$_POST['nom2'];



    $db = mysql_connect('127.0.0.1', 'root', 'dutr&t')  or die('Erreur de connexion '.mysql_error());
    // sélection de la base  

     mysql_select_db('projet',$db)  or die('Erreur de selection '.mysql_error()); 
     
//$select ="SELECT carte.ID_C FROM carte, equipements, relation WHERE equipements.IP='$IP3' and equipement.nom='$nom3' and relation.ID_E = equipements.ID_E and relation.ID_C = carte.ID_C or die('Erreur de liaison '.mysql_error())";
	$select ="SELECT carte.ID_C FROM carte, equipements, relation WHERE relation.ID_E = equipements.ID_E and relation.ID_C = carte.ID_C or die('Erreur de liaison '.mysql_error())";
	mysql_query($select)or die('Erreur SQL dans la table de liaison !'.$select.'<br>'.mysql_error()); 
 
 
 
    // on écrit la requête sql 
	for ($i=1;$i<=16;$i++)
	
{
    $description=lire_ligne('reponse_snmp_motorola.txt',$i+16);
    $serial=lire_ligne('reponse_snmp_motorola.txt',$i+32);
    $HW=lire_ligne('reponse_snmp_motorola.txt',$i+48);
    $SW=lire_ligne('reponse_snmp_motorola.txt',$i+64);
    
    $sql = "INSERT INTO cartes(ID_C, description, serial, HW_version, SW_version) VALUES('','$description','$serial','$HW','$SW')"; 
     
    // on insère les informations dans la table 
    mysql_query($sql) or die('Erreur SQL dans la table Carte !'.$sql.'<br>'.mysql_error()); 
}
    $sql2 = "INSERT INTO equipements(ID_E, IP, marque, nom) VALUES('','$IP2','Motorola','$nom2')"; 
	mysql_query($sql2) or die('Erreur SQL dans la table Equipement !'.$sql.'<br>'.mysql_error()); 
    
    // on affiche le résultat pour le visiteur 
    echo 'Vos infos on été ajoutées.'; 

    mysql_close();  // on ferme la connexion 
    



sachant que j'ai l'erreur suivantes sur ma page:


Erreur SQL dans la table de liaison !SELECT carte.ID_C FROM carte, equipements, relation WHERE relation.ID_E = equipements.ID_E and relation.ID_C = carte.ID_C or die('Erreur de liaison '.mysql_error())
Erreur de syntaxe près de '.mysql_error())' à la ligne 1


Voiila je vous remercie d'avance pour vos possible aide alors svp aidé moiiii Smiley decu pasque la sa avance pu ! Smiley bawling
Coucou,

Ce que je comprend pas, c'est pourquoi tu met ton génerateur d'erreur

or die('Erreur de liaison '.mysql_error())"


directement dans ta requête ? Smiley ohwell
Le langage SQL kesako ce genre d'instruction je crois Smiley ravi

Pour moi =>

$select ="SELECT carte.ID_C FROM carte, equipements, relation WHERE relation.ID_E = equipements.ID_E and relation.ID_C = carte.ID_C";

Modifié par proki (23 May 2007 - 09:43)
bein je met ca pour voir d'ou l'erreur vien si il y'en a .
grace a ca je sais exactement d'ou vien l'erreur!
c'est a ca que ca sert. non?
Bien sûr, mais pas directement dans ta requête SQL Smiley smile

$select ="SELECT carte.ID_C FROM carte, equipements, relation WHERE relation.ID_E = equipements.ID_E and relation.ID_C = carte.ID_C ";

[b]mysql_query($select)or die('Erreur SQL dans la table de liaison !'.$select.'<br>'.mysql_error());[/b] 


C'est ce qui est en gras qui va vérifier ta requête.
Inutile donc de remettre un mysql error directement dans le $select (ce qui, de plus, n'est pas possible)

Smiley smile
Modifié par proki (23 May 2007 - 10:20)
Bonjour,

a écrit :
... je désire faire le lien ...


Je suppose que tu parles d'association afin d'assurer l'intégrité référentielle. Smiley cligne (il est probable que tu es des petites modifications pour prévoir cela dans tes scripts SQL (voir Foreign Key ...)).
Pour cela, il faut, sous MySQL, opter pour le moteur InnoDB pour tes tables. Smiley smile

<edit>Post précédent : plus exactement, c'est mysql_error() qui permet de connaître la dernière erreur retournée par la dernière instruction exécutée sur le sgbd ; die ne sert qu'à "interrompre" (alias de exit) le traitement ce qui est plutôt facheux (à éviter donc Smiley cligne ) préférer un test du résultat retournée & prévoir un traitement ...</edit>

Bonne continuation.
Romain
Modifié par yodaswii (23 May 2007 - 10:39)
effectivement j'ai pas fait gaff à ca!
bon du coup j'ai fait le test.
pas d'erreur, la ligne est ajouter dans la table equipement, les 16 ligne sont ajouter dans la table cartes, mais rien dans la table liaison .
la requete n'est donc pas la bonne!
Smiley decu

et je voi pa du tout ce ke je peu mettre. Smiley rolleyes

edit: ouai c'est exactement ca je veu les associer, mais je pense que ca doit pouvoir se fair en script php , enfin c'est ce que la personne qui ma donner ce bout de code ma dit.
pour l'instant c'est pas trop ca!
Modifié par alucard67 (23 May 2007 - 10:39)
Ne pas chercher à faire ça via PHP (c'est de la pure bêtise : en terme d'optimisation du code et d'évolution de la base de données), le SGBD est là pour ça c'est son taff Smiley cligne .

Juste modifier le moteur utilisé MyIsam vers InnoDB (très simple à faire).

<edit>Prévoir une sauvegarde des données de la base et modifier le script SQL en conséquence ou à défaut faire des alter table pour passer sous InnoDB (via phpmyadmin pas besoin de taper l'instruction SQL).</edit>
Modifié par yodaswii (23 May 2007 - 10:44)
Requête SQL :

ALTER TABLE nomtable add CONSTRAINT nomcontrainte FOREIGN KEY (colonne1,colonne2, ...) REFERENCES tableparente (colonne1,colonne2, ...);
heuu , je vais paraitre lourd, mais je doi fair une requete par table SQL?
et c'est quoi cette histoire de colonne,c'est les ligne de ma table SQL, ca me parait trop simple ? en fait je nage la ...
a écrit :
je dois faire une requete par table SQL ?


Pas par table mais par contrainte (clef étrangère à mettre en place).

Exemple (la propriété num_service de la table personne devient clef étrangère et a pour référence la propriété num_service de la table service) :

ALTER TABLE personne add CONSTRAINT personne_service FOREIGN KEY (num_service) REFERENCES service (num_service);
OK alors si j'ai bien compris pour moi ca donnera ca ,


ALTER TABLE cartes add CONSTRAINT cartes_relations FOREIGN KEY (ID_C) REFERENCES relation (ID_C);

par rapport aux tables que j'ai creer en haut ??
dit moi que c'est ca! Smiley ohwell
Non, c'est le contraire ...

ALTER TABLE relation add CONSTRAINT cartes_relations FOREIGN KEY (ID_C) REFERENCES cartes (ID_C);


La première table/propriété que tu indiques représente l'élément qui fera office de clef étrangère.
Modifié par yodaswii (23 May 2007 - 11:18)
ALTER TABLE relation add CONSTRAINT relations_cartes FOREIGN KEY (ID_C) REFERENCES cartes(ID_C);

ALTER TABLE relation add CONSTRAINT relations_equipement FOREIGN KEY (ID_E) REFERENCES equipement(ID_E);

donc ca va etre ca pour ID_C et ID_E de ma table relation.

mais est ce que jai d'autre chause a ajouter et changer.
Je pense que la ligne select je peut la virer !!
Pour résumer :

- changer le moteur de chaque table (MyIsam vers InnoDB) ;
- exécuter tes 2 requêtes ;
- virer ce select qui ne sert à rien du tout !
je peut te demander de me filer un petit exemple pour chager de moteur stp.
prce que les site qur lesquelle j'ai pu chercher me paresse pas trop claire
Modifié par alucard67 (23 May 2007 - 11:30)
Tout dépend de comment tu as commencé les choses :
- si ta base a été créée et complétée : sous phpmyadmin, il y'a une fonction qui te permet de changer le type de ta table très facilement (menu déroulant plus un bouton ok).
- si ta base n'existe pas encore :
* sous phpmyadmin choisir directement le type de la table ;
* dans tes scripts SQL, à la fin des CREATE TABLE ajouter TYPE='InnoDB'.
ouai j'ai vu dans la fenetre de php admin que y a l'option pour changer de moteur .
et jai tout commencer dans mysql , mes tables , les requetes.

Mais est ce que je devrai virer mes anciennes requetes MySql dans mon script php.

pitié dit moi que nan paske sinon je me jette par la fenetre.
a écrit :
Mais est ce que je devrai virer mes anciennes requetes MySql dans mon script php.


Pas du tout ! C'est le SGBD qui s'occupe de tout ; les requêtes ne sont pas impactés.

a écrit :
pitié dit moi que nan paske sinon je me jette par la fenetre.


Non, c'est bon t'approche pas de la fenêtre Smiley smile .
ok merci beaucoup, je vais essayer ca mais en faisant une sorte de sauvergarde de ma base. on ne siat jamais.
et je te tiens au courant, j'espere que tu sera dans les parage vers les 14h30 15h.

il est bientot midi, je vais manger.
au fait merci tu m'a vraiment beaucoup aider et je t'en remerci, bon bein a tte a l'heure.

et bonne appetit bien sur . Smiley langue
Pages :