[RESOLU] annonce avec photo membre ou pas no_photo

Eléphant du PHP | 257 Messages

05 janv. 2017, 13:09

table annonce et table photo_profil on l'ID les même mais non incrémenté ID et l'ID auto est incrémenté de la table membres

ida est l'id auto incrémenté de la table annonce
idg est l'id auto incrémenté de la table photo_profil

le seul liens entre annonce et photo_profil est l'ID des membres

Comment faut-il faire alors svp? avec ID membre dans les tables profil_photo et annonce alors

Car soit la photo ne s'affiche pas mais elle est bien dans la table quand je fait le test echo et dans le dossier ou elle dois ce trouvé et quand je n'aie pas de photo j'ai la photo par défaut .

mais sur Cinq annonce je n'est que une seule qui s'affiche
<?PHP
    $annonce_sql = "SELECT * FROM annonce AN INNER JOIN photo_profil PP ON AN.ID = PP.id_gal";
    $annonce_sortie = $connection->prepare($annonce_sql); 
    $annonce_sortie->execute();
    while($result = $annonce_sortie->fetch(PDO::FETCH_OBJ)){
    $idA =	$result->idA;
    $ID = $result->ID;	
    $pseudo = $result->pseudo;
    $sexe = $result->sexe;
    $jours = $result->jours;
    $time_temp = $result->timestamp;
    $date_j = $result->date_ano;
    $annonce = $result->annonce;
    $_image_profil = $result->gal;
	}
	echo $_image_profil;
	$im_src = ( !empty($_image_profil) )? 'MINI11image_profil/'.miniature('image_profil/'.$_image_profil.'', 150, 100) : 'imdesign/no_photo.png';
	echo'<img src="'.$im_src.'" border="0" />';
 
$tab_choix = array();
$annonce_sortie_choix  = $connection->prepare('SELECT * FROM choix_annonce WHERE idA=:idA AND jours=:jours');
$annonce_sortie_choix->execute(array('idA'=>$idA,'jours'=>$jours));
while($result_choix = $annonce_sortie_choix->fetch(PDO::FETCH_OBJ)){
$tab_choix[] = $result_choix->choix;	
$list_choix = (!empty($tab_choix))? implode(', ',$tab_choix) : '';
 
 
?>

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

05 janv. 2017, 13:30

salut,

"SELECT * FROM annonce AN INNER JOIN photo_profil PP ON AN.ID = PP.id_gal"
la je lis que la jointure se fait en utilisant la clef primaire de l'annonce O_o (annonce.id == photo_profil.id_gal)

si les champs ne sont pas dupliqué dans le table pas besoin d'alias cela nuit à la lisibilité.

de ce que tu dis je pense que les colonnes sont mal nommées (incompréhensible) et pour simplifier la chose il faut que les colonnes aient le même nom dans les deux tables (même nom même chose).

je suppose que la table annonce fait référence à un membre par son "i'd (id_membrepar exemple).
cela suffit pas besoin d'avoir l'id de la photo du membre dans la table annonces.
La table photo_profile doit avoir l'id du membre (donc id_membre dans mon exemple)
donc pour avoir la photo du membre une jointure en utilisant l'id du membre (et pas celui de la photo qui ici n'a aucun intérêt).
select les,champs from annonce
left join photo_profile using(id_membre)
left join parce que si le membre n'a pas de photo on veux quand même avoir l'annonce ;)

vu qu'il faut surement les informations du membre qui poste l'annonce (c'est quand même mieux).
select les,champs from annonce
join membres using(id_membre)
left join photo_profile using(id_membre)
ici pas de left sur la jointure avec la table membre parce que l'annonce à obligatoirement un membre.

J'ai indiqué des noms de colonnes fictives parce que le select * c'est "mal" c'est rapide à écrire mais on ne sait pas vraiment de quoi tu as besoin ni comment s'appel les colonnes sans avoir le modèle de données. De plus tu récupères des colonnes inutiles c'est donc une amélioration de performance (relative ça dépend du nombre de colonne et de ce qu'il y a dedans mais ça peux pas faire de mal ;) ).

pour afficher la photo il faut que tu test si le champ contenant la photo est null ou pas, s'il l'est tu affiches la photo par défaut sinon celle indiquée (un peu comme ce que tu as fait mais sans le ternaire c'est moche à lire ; ) ).

dernière chose ta fonction "miniature" semble indiquer que tu créés une miniature à chaque fois ?
La "meilleure" façon de faire c'est de créer la miniature lorsque le membre upload l'image. si tu as besoin de plusieurs format tu fais plusieurs fichier.
les photos avoir le même nom que l'originale (je te conseil de renommer avec un truc unique genre l'id du membre) l'utilisation en sera plus simple.

quand as ton code il faut déboguer pour voir ce qu'il y a dans $img_src au final, ainsi que ce que fait la fonction miniature.
je pense que tu t'es complexifié la chose pour rien.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 257 Messages

05 janv. 2017, 15:30

j'ai changé les table les voici , mais le soucis la photo ne s'affiche pas, j'ai le petit logo d'erreur image et j'ai un seul annonce qui s'affiche alors qu'il y en a plusieurs
CREATE TABLE `annonce` (
`id_annonce` INT(11) not null AUTO_INCREMENT,
`ID_membres` INT(11) not null,
`pseudo` char(30) not null,
`sexe` char(30) not null,
`choix` VARCHAR(255) not null, 
`jours` CHAR(10) not null,
`timestamp`VARCHAR(255) not null, 
`annonce` int(3) not null,
 PRIMARY KEY (`id_annonce`),
 INDEX (`id_annonce`),
 UNIQUE (`id_annonce`))
CREATE TABLE photo_profil (
  id_photo_profil int(4) NOT NULL auto_increment,
  ID_membres INT(15) NOT NULL,
  sexe char(12) NOT NULL,
  gal tinytext NOT NULL,
  PRIMARY KEY (`id_photo_profil`),
  INDEX (`id_photo_profil`),
  UNIQUE (`id_photo_profil`))
Modifié en dernier par pacphil le 05 janv. 2017, 19:31, modifié 1 fois.

Eléphant du PHP | 257 Messages

05 janv. 2017, 15:58

Bonjour moogli serait-tu m'aidé à éclaircir cela stp? car pour le moment je début avec les jointures des tables

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

05 janv. 2017, 18:26

je ne pense pas que le script de création de la table annonce fonctionne
ces deux colonnes n'existe pas PRIMARY KEY (`idA`),INDEX (`idA`), UNIQUE (`idA`))
par ailleurs par essence une clef primaire possède un index et est unique, les deux dernières lignes sont donc inutiles.
je suppose que tu voulais mettre PRIMARY KEY (id_annonce) les ` sont inutiles si tu n'utilises pas de mot clef SQL (genre un champs qui s'appel date ou from).

pour le reste qu'elle est la requête sql testée ?
je pense que tu n'as pas saisie la subtilité du mot clef left (souvent appelée jointure externe).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 257 Messages

05 janv. 2017, 19:35

c'est moi qui est fait de modification pour réaliser une bonne jointure entre les tables et oublié de modifier le idA voilà qui est fait.
C'est mon premier script de jointure entre deux table.

La comme je les écrits j'ai une seule annonce avec le petit logo d'erreur de photo , quand j'ai une photo.
Et quand j'ai pas de photo la photo par défaut s'ajoute sans soucis avec l'annonce seule aussi malgré que j'ai 5 annonce dans la table annonce

Eléphant du PHP | 257 Messages

06 janv. 2017, 10:48

bonjour moogli ,

j'ai fait une partie de ce que tu ma noté rien une erreur
<?PHP

    $annonce_sql = "SELECT * FROM annonce join membres using(id_membre) left join photo_profile using(id_membre)";
    /*$annonce_sql = "SELECT * FROM annonce AN LEFT JOIN photo_profil PP ON AN.id_membre = PP.id_membre";*/
	$annonce_sortie = $connection->prepare($annonce_sql); 
    $annonce_sortie->execute();
    while($result = $annonce_sortie->fetch(PDO::FETCH_OBJ)){
	$id_annonce =	$result->id_annonce;
    $id_membre = $result->id_membre;	
    $pseudo = $result->pseudo;
    $sexe = $result->sexe;
    $jours = $result->jours;
    $time_temp = $result->timestamp;
    $date_j = $result->date_ano;
    $annonce = $result->annonce;
    $_image_profil = $result->gal;
	}
	echo $_image_profil;
	$im_src = ( !empty($_image_profil) )? 'MINI11image_profil/'.miniature('image_profil/'.$_image_profil.'', 150, 100) : 'imdesign/no_photo.png';
	echo'<img src="'.$im_src.'" border="0" />';

$tab_choix = array();
$annonce_sortie_choix  = $connection->prepare('SELECT * FROM choix_annonce WHERE id_annonce=:id_annonce AND jours=:jours');
$annonce_sortie_choix->execute(array('id_annonce'=>$id_annonce,'jours'=>$jours));
while($result_choix = $annonce_sortie_choix->fetch(PDO::FETCH_OBJ)){
$tab_choix[] = $result_choix->choix;	
$list_choix = (!empty($tab_choix))? implode(', ',$tab_choix) : '';

}
?>
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 La table 'tchat.photo_profile' n'existe pas' in C:\Program Files\EasyPHP-5.3.8.1\www\source\voir_annonce.php:42 Stack trace: #0 C:\Program Files\EasyPHP-5.3.8.1\www\source\voir_annonce.php(42): PDOStatement->execute() #1 {main} thrown in C:\Program Files\EasyPHP-5.3.8.1\www\source\voir_annonce.php on line 42

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

06 janv. 2017, 10:54

tu abuses un peu la le message d'erreur est clair et en français
La table 'tchat.photo_profile' n'existe pas'
enlève le e à profile ça ira mieux.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 257 Messages

06 janv. 2017, 10:58

si elle existe bien elle est la aux dessus et et dans ma base de donnée Tchat avec les autres tables

Eléphant du PHP | 257 Messages

06 janv. 2017, 10:59

c'est ma premier jointure entre deux table et je comprends rien à ce fonctionnement, je cherche des tutos rien a ce sujet

Eléphant du PHP | 257 Messages

06 janv. 2017, 11:02

moogli sorry l'erreur était le E dans photo_profile

Eléphant du PHP | 257 Messages

06 janv. 2017, 11:04

Cela affiche bien une seule annonce correctement alors que j'en aie trois dans la table Annonce

Mammouth du PHP | 1967 Messages

06 janv. 2017, 11:26

cela ne t'affiche qu'une seule annonce car le traitement de l'affichage est à l'ext&érieur de ta boucle, rapatrie le tout dans la boucle, cela devrait mieux fonctionner
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 257 Messages

06 janv. 2017, 11:55

dans les jointure je comprends grand chose

serais m'expliquez un peux plus stp?

cela ne t'affiche qu'une seule annonce car le traitement de l'affichage est à l'ext&érieur de ta boucle, rapatrie le tout dans la boucle, cela devrait mieux fonctionner

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

06 janv. 2017, 12:56

while($result = $annonce_sortie->fetch(PDO::FETCH_OBJ)){
  $id_annonce =	$result->id_annonce;
    $id_membre = $result->id_membre;	
    $pseudo = $result->pseudo;
    $sexe = $result->sexe;
    $jours = $result->jours;
    $time_temp = $result->timestamp;
    $date_j = $result->date_ano;
    $annonce = $result->annonce;
    $_image_profil = $result->gal;

//  echo $_image_profil;
// Ceci DANS le while
  $im_src = ( !empty($_image_profil) )? 'MINI11image_profil/'.miniature('image_profil/'.$_image_profil.'', 150, 100) : 'imdesign/no_photo.png';
  echo'<img src="'.$im_src.'" border="0" />';
  }
Le problème ici n'est un pas un problème de jointure mais d'utilisation de PDO et de php en générale.

Pour ce qui est des jointures c'est une façon de faire qui permet d'avoir des liaisons entres les données des tables (de façon à ce qu'elle soit relationnelle).
Ces liaisons sont appelées clef étrangères (foreign key souvent abrégée en FK)
dans ton cas il y a une table membre sont la clef primaire s'appel id_membre
il y a une table annonce qui contient une colonne qui s'appel id_membre et qui ne doit contenir que des valeurs de id_membre de la table membre.
en SQL cela e matérialise ainsi
alter table annonce add constraint FK_annonce_membre foreign key (id_membre) references membre(id_membre)
avec ça il n'est pas possible d'insérer dans annonce.id_membre une valeur qui n'est pas dans membre.id_membre
idem pour les photo
alter table photo_profiladd constraint FK_photo_profil_membre foreign key (id_membre) references membre(id_membre)
ensuite pour récupérer les données des deux tables en même temps on utilise le mot clef JOIN
select * from annonce JOIN membre
on select sur la table dont on souhaite les données (ici on veux les annonces) et l'on join la table dont on souhaite les données en plus.
pour que le moteur sache quelle données prendre on lui indique vace le mot clef using (lorsque les deux tables on le même nom pour la colonne) =>
select * from annonce JOIN membre using(id_membre)
si les deux table n'ont des colonnes avec le même nom
select * from annonce JOIN membre on annonce.id_membre = membre.id
voici la base pour le reste trouve un tuto (par exemple http://sqlpro.developpez.com/)

@+
Il en faut peu pour être heureux ......