Tu ne peux pas enchainer deux conditions IN comme ceci :
WHERE id_annonce IN (...) OR IN (...) -- incorrect
Si besoin de faire deux sous-requêtes, on pourrait éventuellement l'écrire comme ceci :
WHERE id_annonce IN (...) OR id_annonce IN (...) -- correct
Dans ton cas, la sous-requête utilisée dans la clause IN de la fonction getPhotosAnnonces() devrait être la même requête que celle utilisée dans la fonction getAnnonceCategorie(), à l'exception de la clause SELECT pour sélectionner seulement l'identifiant dans la sous-requête.
Si par exemple, la requête pour les annonces dans ta fonction getAnnonceCategorie() est :
SELECT A.*, C.nom_fr AS CATEGORIE, V.ville_fr AS VILLE
FROM annonces A
LEFT JOIN categories C ON C.id = A.id_categorie
LEFT JOIN villes V ON V.id = A.id_ville
WHERE A.id_categorie = :id_cat OR id_parent = :id_cat
ORDER BY A.created_date DESC
La requête sql dans la fonction getPhotosAnnonces() pourrait être :
SELECT id_annonce,filepath as IMG
FROM images_annonces
WHERE id_annonce IN (
SELECT id
FROM annonces A
LEFT JOIN categories C ON C.id = A.id_categorie
LEFT JOIN villes V ON V.id = A.id_ville
WHERE A.id_categorie = :id_cat OR id_parent = :id_cat
)
Le ORDER BY dans la sous-requête n'est pas utile.
Dupliquer la première requête en sous-requête dans ta deuxième fonction devrait fonctionner mais sera compliquer à maintenir. Il faudra que tu penses à modifier correctement ta requête aux deux endroits à chaque changement.
Une autre solution serait de changer le paramètre passé à la fonction getPhotosAnnonces($id_cat).
Au lieu de lui passer l'identifiant de la catégorie des annonces, ce qui oblige à répéter la requête pour sélectionner les annonces en fonction de la catégorie, tu pourrais simplement lui passer les identifiants des annonces que tu as déjà récupéré juste avant avec la fonction getAnnonceCategorie().
Un exemple :
// $annonces : la liste des annonces retournée par la fonction getAnnonceCategorie()
// liste de tableau associatif (si PDO::FETCH_ASSOC est utilisé dans getAnnonceCategorie) avec une clé 'id' pour chaque annonce
function getPhotosAnnonces($annonces) {
global $bdd;
$sql = 'SELECT id_annonce,filepath as IMG
FROM images_annonces
WHERE id_annonce = IN (' . implode(',', array_column($annonces, 'id')) . ')';
// ... suite de la fonction
return $res;
}
function affichageAnnonce($id_cat) {
global $bdd;
$annonces = getAnnonceCategorie($id_cat);
$images = getPhotosAnnonces($annonces); // on passe la liste des annonces en paramètre
// ...