8791 sujets

Développement web côté serveur, CMS

Bonjour, je m'en mêle un peu les pinceaux...
j'ai 2 tables, une pour les news et l'autre pour les images,
je voudrais lier l'image a sa news, donc je crée un id_image dans la table description,
et un id_news dans la table image.
Lors d'un nouvel enregistrement, id_news doit prendre la valeur de id_description,
et id_image celle de id_img,

dois je mettre un WHERE lors de mes requetes de selection lors puis les affecter les valeurs recues?
Voici où j'en suis...

$req_id_news= "SELECT * FROM image WHERE id_news='".$id_description."'";
$req_id_image= "SELECT * FROM description WHERE id_image='".$id_img."'";

mysql_query($req_id_news)  or die ('impossible d effectuer la selection de l ID description') ;
mysql_query($req_id_image)  or die ('impossible d effectuer la selection de l ID img') ;

$result_news = mysql_fetch_array($req_id_news);
$result_image = mysql_fetch_array($req_id_image);


$id_news= $result_news['id_description'];
$id_image=$result_image['id_img'];


Merci pour votre aide.

Voici ma bdd:

-- Structure de la table 'image'
--

 
'id_img' int(10) unsigned NOT NULL AUTO_INCREMENT,
'nom' varchar(100) NOT NULL,
'lienimage' varchar(100) NOT NULL,
'id_news' int(11) NOT NULL,
PRIMARY KEY ('id_img')


-- Structure de la table 'description'
-- 


'id_description' int(11) NOT NULL AUTO_INCREMENT,
'titre' varchar(500) NOT NULL,
'contenu' text NOT NULL,
'date' bigint(20) NOT NULL,
'id_image' int(11) NOT NULL,
PRIMARY KEY ('id_description')

Modifié par dqni (05 May 2011 - 16:34)
[quote=dqni]

$req_id_news= "SELECT * FROM image WHERE id_news='".$id_description."'";
$req_id_image= "SELECT * FROM description WHERE id_image='".$id_img."'";



Tu devrais pouvoir faire une seule requête :


$red = "SELECT image.*, description.* FROM image, description WHERE image.id_img = description.id_image AND description.id_description = ".$id_description;


Ca doit ressembler à un truc comme ça, tu récupères l'image liée à la description en ayant juste l'id de la description.
Modifié par Benjouz (05 May 2011 - 16:49)
$req = "SELECT image.*, description.* FROM image, description WHERE image.id_img = description.id_image AND description.id_description = image.id_news";

mysql_query($req)  or die ('impossible d effectuer la req') ;

$result=mysql_fetch_array($req);

$id_news= $result['id_description']; 
$id_image=$result['id_img']; 


id_news et id_image prennent quand meme la valeur 0, ils ne se lient pas...
Modifié par dqni (05 May 2011 - 17:50)
Bonjour,

Pour les jointure sql tu devrais utiliser

INNER JOIN
LEFT JOIN
RIGHT JOIN

Pour lier l'image à la news il faut utiliser un champ de liaison dans la table image et l'indexer.

`id_news` int(11) NOT NULL, 
PRIMARY KEY (`id_img`) ,
KEY (`id_news`)

pour la sélection AVEC PHP

$query = "SELECT `description`.*, `image`.* FROM `description` INNER JOIN `image` ON `id_img` LIKE `id_image` WHERE `id_news` LIKE ".$id_description;


Smiley smile
Merci pour ta réponse!

Mais ma requête ne donne toujours pas les bonnes valeurs aux variables id_news, id_image..

j'ai indexé id_news dans sa table, et jai recopié ta requête mais sans résultat.

$req = "SELECT image.*, description.* FROM `description` INNER JOIN `image` ON `id_img` LIKE `id_image` WHERE `id_news` LIKE 'id_description'"; 

mysql_query($req)  or die ('impossible d effectuer la req') ;
	
$result=mysql_fetch_array($req);
$id_news= $result['id_description']; 
$id_image=$result['id_img']; 


là je définit les variables qui viennent du formulaire vers la page cible, et l'enregistrement fonctionne mais les variables ont toujours la valeur 0..
Si tu veux tous les enregistrements cela doit marcher fait un test avec phpMyAdmin.

SELECT `description`.*, `image`.* FROM `image` INNER JOIN `description` ON `id_img` LIKE `id_image`;
/* l'une ou l'autre */
SELECT `description`.*, `image`.* FROM `description` INNER JOIN `image` ON `id_news` LIKE `id_description`;


Pour les jointures parfois il faut utiliser LEFT
INNER demande que les enregistrement soit présent dans les deux tables, ce qui est ton cas je pense.
Smiley cligne
Le résultat de ces 2 requêtes de sélection sont bonnes, elles me montrent effectivement que les id sont égales

Pour qu'un nouvel enregistrement prenne en compte ce lien, dois je faire un INSERT TO avec egalement un INNER JOIN?


$requeteinsert = 'INSERT INTO image(nom,lienimage,id_news) 
VALUES(\''.$nom.'\',\''.$lienimage.'\',\''. $_POST['id_news'].'\') 
FROM `image` 
INNER JOIN `description` ON `id_img` 
LIKE `id_image`';	
					
$requeteinsert2 ='INSERT INTO description(titre,contenu,date,id_image) 
VALUES(\''.$titre.'\',\''.$contenu.'\',\''.time().'\',\''.$_POST['id_image'].'\') 
FROM `description` 
INNER JOIN `image` ON `id_news` 
LIKE `id_description`';

Modifié par dqni (07 May 2011 - 19:15)
Hum il faudrait déjà que tes tables aient les bonnes valeurs sinon la requête ne marchera pas ...

Vu ce que tu demandes pourquoi avoir fait 2 tables ?

Si a une news correspond une et une seule image et que a une image correspond une et une seule news il fallait les mettre dans la même table ...

Bon supposons que tu aies ces données là dans ta table Description :


id_description titre        contenu                         date        id_image
1              "titre1"    "Un lapin a tué un chasseur..."  01/04/2011  1
2              "titre2"    "Il est bô le lavabo , ..."      02/04/2011  2

et celles-ci dans la table image

id_img   nom             lien_image  id_news
1        lapin_chasseur  1.jpg       1
2        lagaffe-lavabo  2.jpg       2



à ce moment là la requête donnée devrait te retourner le tableau suivant :

id_img   nom             lien_image  id_news  id_description titre       contenu                         date        id_image 
-----------------------------------------------------------------------------------------------------------------------------
1        lapin_chasseur  1.jpg       1        1              "titre1"    "Un lapin a tué un chasseur..." 01/04/2011  1
2        lagaffe-lavabo  2.jpg       2        2              "titre2"    "Il est bô le lavabo , ..."     02/04/2011  2


attention le résultat a plusieurs enregistrements ....

Smiley edit owned Smiley smile !!!

j'avoue ne pas encore connaître les possibilités d'insertion de Mysql vu que je travaillais surtout avec Ingres et Access ( pas en php de plus ... )
donc je ne sais pas côté insertion en inner join .... mais attention à l'insertion simultanée ... une seule table dans ce cas là aurait été plus simple à gérer ...
Modifié par Arialia (07 May 2011 - 19:30)
Merci pour le lien.

Pour l'instant jai refait une seule table qui comprend une seule image, ca me dépannera.

Le fait est que une annonce peut contenir une ou plusieurs images, j'aurais simplement voulu faire cette relation de 1 a plusieurs en sql.
1 à plusieurs ?

dans ce cas là l'identifiant de l'image n'a rien à faire dans ta table 'description'

la relation se faisant alors sur l'identifiant de la news

table 'image'
'id_img' int(10) unsigned NOT NULL AUTO_INCREMENT, 
'nom' varchar(100) NOT NULL, 
'lienimage' varchar(100) NOT NULL, 
'id_news' int(11) NOT NULL, 
PRIMARY KEY ('id_img') 
 
 
-- Structure de la table 'description' 
--  
 
 
'id_description' int(11) NOT NULL AUTO_INCREMENT, 
'titre' varchar(500) NOT NULL, 
'contenu' text NOT NULL, 
'date' bigint(20) NOT NULL, 

PRIMARY KEY ('id_description') 



bon normalement le champ 'id-news' devrait avoir le même nom que son homologue de 'description' mais bon c'est juste une convention ( bien pratique pour comprendre les liens entre tables quand même)

si tu veux toutes les images d'une news :
$req = "SELECT * FROM image WHERE id_news = " .$id_description; 


Une chose qui se fait souvent c'est de créer une galerie d'image

tu auras alors une table 'relation' entre l'image et la news

table image-news
'id_news' int(11) NOT NULL,
'id_img' int(10) unsigned NOT NULL,
PRIMARY KEY ('id_news','id_image') 


Pour insérer la news et ses images :
mysql_query("INSERT INTO image(nom,lienimage) VALUES('".$nom."','".$lienimage."')");
$id_newimage = mysql_insert_id();
mysql_query("INSERT INTO description(titre,contenu,date) VALUES('".$titre."','".$contenu."','".time()."')");
$id_newnews = mysql_insert_id();

mysql_query("INSERT INTO imagenews(id_news,id_image) VALUES(".$id_newnews.",".$id_newimage.")");
Merci beaucoup pour ton aide !
c'est nickel, mysql_insert_id(); c'est vraiment ce dont javais besoin!