8710 sujets

Développement web côté serveur, CMS

Salut à tous,

J'aimerais vérifier la présence de plusieurs valeurs dans une colonne d'une de mes tables.
L'idée serait de proposer un retour différent en fonction de la présence ou non d'une valeur, sans pour autant bloquer le comportement par défaut (présence de toutes les valeurs).

Pour rentrer dans les détails, je souhaite créer un diaporama d'images.
Pour chaque image (utilisée ou non dans un diaporama), j'ai une entrée dans une table de ma BDD.
L'idée serait de vérifier (en PHP) que les images que je souhaite utiliser dans mon diaporama sont bien présentes dans la table des images.
Mais je ne souhaite pas interrompre la création du diapo si au moins une des images est présente : le diapo est créé avec une seule image, et l'utilisateur est averti que les images X, Y et Z ne sont pas présentes dans la BDD. Il aurait alors le choix, pour chaque image manquante, d'en sélectionner une autre dans la BDD ou d'en uploader une.

Ma question porte sur la meilleure façon d'interroger ma BDD en terme de cout et de vitesse, avec une liste d'id d'images à vérifier, sans pour autant ne pas créer le diapo si un des ID n'est pas trouvé.

Est-ce qu'il est possible de faire cela en une seule requête ?

Merci pour vos pistes Smiley smile
Modérateur
en sql : count() sinon en php count() ou empty() ou in_array()
Modifié par niuxe (16 Mar 2014 - 06:02)
Hello niuxe,

Peux tu développer s'il te plait ?
Je ne comprends pas comment cela peut répondre à ma question.
Modifié par The_Moye (16 Mar 2014 - 11:16)
Modérateur
en te donnant une piste (code fait de tête, peut être une erreur) :

SELECT 
	COUNT(id) 
FROM 
	diaporamas 
WHERE 
	url_image IN('image-1.jpg','image-2.jpg','image-3.jpg','image-4.jpg');
Salut niuxe,

SELECT COUNT(`id`) FROM `images` WHERE `id` IN(7,8,9,15)


ne retourne pas ce que je souhaite.
Seul le nombre des id d'images trouvées est retourné, alors que j'aimerai connaitre la présence ou non de chaque id dans ma table.

Le retour souhaité serait du style :

7 => true
8 => true
9 => true
15 => false
Modérateur
Dans ce cas, ta requête devrait être dans ce goût là :

SELECT url_image FROM `images` WHERE `id` IN(7,8,9,15)


Et après tester avec in_array() ou array_search().

Cependant, je ne vois pas le but final de la manoeuvre. Peux tu expliquer pourquoi tu dois faire une correspondance avec la base et les images ?
Hello !

Ah ben oui, ça marche du tonnerre, je n'y ai tout simplement pas pensé ^^

$PDO->prepare('SELECT `id` FROM `images` WHERE `id` IN ('.$source_media.')');


Le résultat de la requête est enregistré dans un tableau :

$result = $presentes_dans_BDD->fetchAll(PDO::FETCH_COLUMN, 0);


Et enfin on vérifie la présence de chaque image :


for($i=0;$i<count($source_media);$i++) {
          ( in_array($source_media[$i],$result) ) ? ( $trouve = "oui" ) : ( $trouve = "non" ) ;
          echo "A t-on trouvé ".$source_media[$i]." ? ".$trouve."<br />";
}


Merci niuxe !

Cependant, je ne vois pas le but final de la manœuvre. Peux tu expliquer pourquoi tu dois faire une correspondance avec la base et les images ?

Et bien je cherche à créer un diaporama de façon dynamique à insérer facilement à la "bbcode" lors de la création d'un article.
Par exemple avec une balise [diapo=1/2/75] qui me retournerait un diaporama avec les images ayant pour id 1,2 et 75.
Vérifier leur présence dans la base me permet d'être sur que l'image existe, et dans le cas contraire, proposer d'en sélectionner une existante ou d'en uploader une.
Modérateur
Salut,

En fait j'ai l'impression que ta solution n'est pas la bonne. Avant de te donner ma solution, j'ai des petites questions :

Est ce que la même image peut être utilisée dans plusieurs articles ?
Est ce qu'une image qui n'est pas dans un article devra être dans le diaporama ?
Est ce qu'une image qui est dans un article devra être dans le diaporama ?
Modifié par niuxe (18 Mar 2014 - 06:52)
Yosh !

Est ce que la même image peut être utilisée dans plusieurs articles ?

Oui, elle n'est même pas limité à une page de type article : elle peut être retournée pour un diapo des dernières images envoyées, pour une recherche par tag ou par rubrique, ...

Est ce qu'une image qui n'est pas dans un article devra être dans le diaporama ?

C'est une question que je me pose encore.
Dans le doute, j'ai une table de liaison "média -> article".

Est ce qu'une image qui est dans un article devra être dans le diaporama ?

Non pas forcement. Elle peut être insérée comme simple image, faire partie d'un diapo, être chargée dans un canvas...ou tout ça à la fois.
Modérateur
The_Moye a écrit :

Oui, elle n'est même pas limité à une page de type article : elle peut être retournée pour un diapo des dernières images envoyées, pour une recherche par tag ou par rubrique, ...


Donc cela veut dire que tu dois avoir 3 tables (images, articles, articles_images). Partant de cette conception, pourquoi ne rajoutes tu pas un champ diaporama en tinyint (valeur 1 ou 0) soit dans la table images soit dans la table articles_images ? Je pense que tu te casserais moins la tête.
niuxe a écrit :
pourquoi ne rajoutes tu pas un champ diaporama en tinyint (valeur 1 ou 0) soit dans la table images soit dans la table articles_images ?


Quelle serait l'utilité de ce champs ?
Modérateur
Admettons que ce champs soit dans la table images, la requête pour le diaporama (affichage des images) :

SELECT
	i.url_image,
	i.description_image 
FROM 
	articles a,
	images i,
	articles_images ai 
WHERE 
	a.id = ai.article_id 
AND 
	i.id = ai.image_id 
AND 
	i.diaporama = 1


Ce qui donnera toutes les images en relation avec les articles et qui sont bonnes pour le diaporama.

Au passage, je ne connaissais pas ce genre d'écriture :

( in_array($source_media[$i],$result) ) ? ( $trouve = "oui" ) : ( $trouve = "non" ) ;


De mon côté, j'écris comme ceci et je trouve que c'est plus rapide à écrire :

$trouve = in_array($source_media[$i],$result) ?  "oui"  : "non"  ;

Modifié par niuxe (18 Mar 2014 - 16:18)
D'accord, je vois ou tu veux en venir.
Mais ça me pose un problème : il faudrait que je procède de la même manière pour chaque "objet" dont l'objet image est susceptible de faire partie.
Il me faudrait donc un champs supplémentaire par container possible, sachant que si je veux en ajouter un nouveau par la suite je dois modifier ma table.

niuxe a écrit :
De mon côté, j'écris comme ceci et je trouve que c'est plus rapide à écrire

Oui je me suis pas posé de question, c'était histoire de tester que ce qui était retourné était correcte Smiley smile
Modérateur
The_Moye a écrit :

Mais ça me pose un problème : il faudrait que je procède de la même manière pour chaque &quot;objet&quot; dont l'objet image est susceptible de faire partie.
Il me faudrait donc un champs supplémentaire par container possible, sachant que si je veux en ajouter un nouveau par la suite je dois modifier ma table.



Je comprends pas bien ce que tu veux dire. Il faut dire que je ne connais pas ton projet. Mais suivant ton souci, je pense qu'il serait plus facile d'organiser ta base et ainsi, éviter de coder en php un algo un peu lourd. Suivant la requête que je t'ai écrite, ça prendrait toutes les images prévues pour le diapo et qui sont en relation avec les articles. Si c'est un article en particulier, il suffit de lui ajouter comme clause , son id. (ex : a.id = 3)
Modifié par niuxe (19 Mar 2014 - 16:20)
niuxe a écrit :
Je comprends pas bien ce que tu veux dire. Il faut dire que je ne connais pas ton projet. Mais suivant ton souci, je pense qu'il serait plus facile d'organiser ta base et ainsi, éviter de coder en php un algo un peu lourd


Justement, je pars du principe que tous les types d'objets (diaporama, canvas2D, canvas3D...) pouvant contenir une image de ma base ne sont pas forcement connus.
En suivant ton raisonnement, si je souhaite rajouter un type d'objet pouvant contenir une des images de ma base, je dois modifier ma table image pour rajouter une colonne "nouveau_type_objet".
Je trouve cette approche pas géniale.

Une table supplémentaire de liaison entre les objets et les images qu'ils contiennent me permet de ne pas modifier la structure de ma table images si je souhaite créer un nouveau type d'objet.