[RESOLU] annonce avec photo membre ou pas no_photo

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] annonce avec photo membre ou pas no_photo

Re: [RESOLU] annonce avec photo membre ou pas no_photo

par moogli » 09 janv. 2017, 14:06

j'ai repris les tables indiqué plus haut (au passage dans les tables tu as mis id_membres et dans la requête SQL id_membre. cela ne peux pas fonctionner.

je me suis créé un jeux de test bidon
-- tables
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`),
	UNIQUE INDEX `id_annonce_2` (`id_annonce`),
	INDEX `id_annonce` (`id_annonce`)
)ENGINE=InnoDB;

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`),
	UNIQUE INDEX `id_photo_profil_2` (`id_photo_profil`),
	INDEX `id_photo_profil` (`id_photo_profil`)
)ENGINE=InnoDB;

-- données bidons
insert into annonce (id_annonce,ID_membres,pseudo,sexe,choix,jours,`timestamp`,annonce) values(1,1,'p1','1','1','jours','timestamp c pas un varchar',1);
insert into annonce (id_annonce,ID_membres,pseudo,sexe,choix,jours,`timestamp`,annonce) values(2,1,'p1','1','1','jours','timestamp c pas un varchar',1);
insert into annonce (id_annonce,ID_membres,pseudo,sexe,choix,jours,`timestamp`,annonce) values(3,2,'p1','1','1','jours','timestamp c pas un varchar',1);
insert into annonce (id_annonce,ID_membres,pseudo,sexe,choix,jours,`timestamp`,annonce) values(4,3,'p1','1','1','jours','timestamp c pas un varchar',1);
J'ai réduit le code php au nécessaire (j'ai viré la fonction miniature que je n'ai pas et dont je ne connais pas l'utilité).
<?php
// connexion avec PDO parce que sinon je peu pas tester :)
try {
// set de l'encodage
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$connection = new PDO('mysql:host=localhost;dbname=test','test','test',$options);
// assure les erreurs en exception
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Liste des champs parce qu'au moins on sais ce que l'on utilise et l'on évite les problème du genre tien on cherche à utiliser un index "chemin" mais il existe pas dans les tables !!!
// normalisation / simplification de la jointure SQL ;)
$annonce_sql = 'SELECT id_annonce,id_membres, pseudo, an.sexe,jours,timestamp, annonce,gal as chemin FROM annonce AN LEFT JOIN photo_profil PP using(id_membres)';
$res = $connection->query($annonce_sql);
while ($result = $res->fetch(PDO::FETCH_ASSOC)) {
// cas par défaut
    $im_src = 'MINI11image_profil/'.$result['chemin'] ;
// si pas de chemin c'est que le membre n'as pas de photo on utilise la photo standard
    if(empty($result['chemin']) ){
      $im_src = 'imdesign/no_photo.png';
    }
// on affiche la photo. une classe CSS serait pas mal pour l'affichage. 
    echo'<img src="',$im_src,'" style="border : none;" />';
}
// fermer le curseur c'est bien
$res->closeCursor();
}catch(Exception $e){
// pour le cas de test ce n'est pas à utiliser en vrai
  var_dump($e);
}
résultat

Code : Tout sélectionner

<img src="MINI11image_profil/oups" style="border : none;" /><img src="MINI11image_profil/oups" style="border : none;" /><img src="MINI11image_profil/3" style="border : none;" /><img src="imdesign/no_photo.png" style="border : none;" />
ce code fonctionne.
essai le pour voir si cela te va.

ensuite il te faudra ajouter les truc que j'ai virer.

dernière chose, utilise le tableau $result plutôt que de créer des variables elles ne servent à rien et encombre le code pour rien :)


@+

Re: [RESOLU] annonce avec photo membre ou pas no_photo

par moogli » 09 janv. 2017, 13:28

il y a quoi dans le source html ?

est ce que tu peux partager un jeux de données (même bidon le tout c'est qu'il soit cohérent) ?

@+

Re: annonce avec photo membre ou pas no_photo

par pacphil » 06 janv. 2017, 14:59

re moogli cela fonction le seul soucis c'est la photo ne s'affiche pas j'ai le petit logo comme quoi elle est la mais ne s'affiche pas.
<?PHP
 
$annonce_sql = "SELECT * FROM annonce AN LEFT JOIN photo_profil PP ON AN.id_membre = PP.id_membre";
$res = $connection->query($annonce_sql);
while ($result = $res->fetch(PDO::FETCH_ASSOC)) {
 
	$id_annonce =	$result['id_annonce'];
    $id_membre = $result['id_membre'];	
    $pseudo = $result['pseudo'];
    $sexe = $result['sexe'];
    $jours = $result['jours'];
    $time_temp = $result['timestamp'];
    $annonce = $result['annonce'];
    $image_profil =  $result['chemin'];
 
    $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) : '';
 
}
?>

Re: annonce avec photo membre ou pas no_photo

par moogli » 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/)

@+

Re: annonce avec photo membre ou pas no_photo

par pacphil » 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

Re: annonce avec photo membre ou pas no_photo

par Spols » 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

Re: annonce avec photo membre ou pas no_photo

par pacphil » 06 janv. 2017, 11:04

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

Re: annonce avec photo membre ou pas no_photo

par pacphil » 06 janv. 2017, 11:02

moogli sorry l'erreur était le E dans photo_profile

Re: annonce avec photo membre ou pas no_photo

par pacphil » 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

Re: annonce avec photo membre ou pas no_photo

par pacphil » 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

Re: annonce avec photo membre ou pas no_photo

par moogli » 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.

@+

Re: annonce avec photo membre ou pas no_photo

par pacphil » 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

Re: annonce avec photo membre ou pas no_photo

par pacphil » 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

Re: annonce avec photo membre ou pas no_photo

par moogli » 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).

@+

Re: annonce avec photo membre ou pas no_photo

par pacphil » 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