[RESOLU] Affichage d'un menu et sous-menu dynamiques

ynx
Mammouth du PHP | 586 Messages

06 janv. 2022, 12:20

Ton execute n'est pas bon : il n'y a plus de marqueur :id_cat dans la requête, il n'est donc plus nécessaire de passer ce paramètre dans le execute.

Eléphant du PHP | 65 Messages

06 janv. 2022, 17:11

Lorsqu'aucun paramètre est passé:

Code : Tout sélectionner

$req->execute(); $res = $req->fetchAll(PDO::FETCH_GROUP);
j'ai les erreurs suivantes:
Warning: array_column() expects parameter 1 to be array, string given in
Warning: implode(): Invalid arguments passed in
Notice: Undefined variable: res in C:

Lorsqu'un paramètre est ajouté:

Code : Tout sélectionner

$req->execute($annonces); $res = $req->fetchAll(PDO::FETCH_GROUP);
Les erreurs:
Warning: array_column() expects parameter 1 to be array, string given in
Warning: implode(): Invalid arguments passed in C:

ynx
Mammouth du PHP | 586 Messages

06 janv. 2022, 18:25

Si tu regardes les messages et les numéros de ligne indiquées pour ces nouvelles erreurs, tu peux voir qu'il s'agit d'une erreur sur la ligne utilisant array_column et implode, rien à voir donc avec le execute() qui devrait bien être vide si tu n'as plus de marqueurs dans ta requête sql.

L'utilisation de array_column et implode permet de transformer la liste des annonces $annonces en une chaine de caractère contenant les identifiants des annonces. Il faut pour cela que la variable $annonces soit une liste de tableau associatif (ce qui semblait être le cas car tu utilises PDO::FETCH_ASSOC dans la fonction pour récupérer les annonces).

D'après le message d'erreur, la variable $annonces serait une chaine de caractère (string) et non un tableau (array) contenant les annonces.
La variables $annonces est bien le résultat de la fonction getAnnonceCategorie() ?
Tu as bien passé cette variable $annonces en paramètre à ta fonction getPhotosAnnonces($annonces) dans ta fonction affichageAnnonce() (cf. la dernière ligne de mon précédent code) ?

Sinon un peu de var_dump() pour déboguer la fonction et pour te montrer l'utilisation des fonctions :
function getPhotosAnnonces($annonces) {
  global $bdd;

  echo 'Le tableau des annonces <br>';
  var_dump($annonces);
  echo 'Le tableau des identifiants des annonces <br>';
  var_dump(array_column($annonces, 'id'));
  echo 'Les identifiants des annonces séparés par une virgule <br>';
  var_dump(implode(',', array_column($annonces, 'id')));

  $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;
}

Eléphant du PHP | 65 Messages

06 janv. 2022, 19:17

Don si j'ai bien compris, on fait tout simplement tel dans le code en dessous dans la fonction getPhotosAnnonces($annonces) :

Code : Tout sélectionner

$req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_GROUP);
Oui, j'ai bien passé $annonces en paramètre
Voici le code:

Code : Tout sélectionner

function getPhotosAnnonces($annonces) { global $bdd; echo 'Le tableau des annonces <br>'; var_dump($annonces); echo 'Le tableau des identifiants des annonces <br>'; var_dump(array_column($annonces, 'id')); echo 'Les identifiants des annonces séparés par une virgule <br>'; var_dump(implode(',', array_column($annonces, 'id'))); $sql = 'SELECT id_annonce,filepath as IMG FROM images_annonces WHERE id_annonce = IN (' . implode(',', array_column($annonces, 'id')) . ')'; try { $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_GROUP); var_dump($res); } catch (Exception $e) { echo "Erreur dans la requête " . $sql; } // le temps des tests pour voir le résultat return $res; } function affichageAnnonce($id_cat){ global $bdd; $annonces = getAnnonceCategorie($id_cat); $images = getPhotosAnnonces($annonces); $res = []; foreach ($annonces as $R) { $res[$R['id']] = $R; $imgs = !empty($images[$R['id']]) ? $images[$R['id']] : NULL; if(!empty($imgs)){ foreach($imgs as $I){ $res[$R['id']]['images'][] = !empty($I['IMG']) ? $I['IMG'] : null; } }else{ $res[$R['id']]['images'] = null; } } return $res; }
J'ai donc ça qui apparait comme erreur:
1-Erreur dans la requête SELECT id_annonce,filepath as IMG FROM images_annonces WHERE id_annonce = IN (5,6,7,1)

2-( ! ) Notice: Undefined variable: res in C:\wamp64\www\Projetsite\
==> Il s'agit de $res de la fonction getPhotosAnnonces($annonces)

Où se trouve donc ce grain de sable qui empêche l'affichage des images?

Merci, grace à toi, en débogant, j'ai compris l'utilisation de implode qui me faisait peur.

ynx
Mammouth du PHP | 586 Messages

06 janv. 2022, 20:55

Super si tu as compris l'utilisation des fonctions !
Oui pas de paramètre dans execute() si pas de marqueur :param dans la requête sql.

Et en effet, tu n'as pas fait d'erreur, c'est moi qui t'ai fait glisser une erreur de syntaxe dans ta requête IN depuis hier (juste après avoir relevé ta première erreur de syntaxe avec OR IN).
Donc je me corrige, on ne peut pas écrire :
WHERE id_annonce = IN (5,6,7,1) -- incorrect
Il faut écrire :
WHERE id_annonce IN (5,6,7,1) -- correct

Eléphant du PHP | 65 Messages

06 janv. 2022, 21:09

Génial!!! Au top! Grand Merci ynx pour ta patience et pour ce que tu m'a appris.
Les images s'affichent correctement. Bien à toi :)