[RESOLU] Afficher la liste de miniatures

superNoob
Invité n'ayant pas de compte PHPfrance

09 août 2020, 16:53

Bonjour,
Je débute en back-office et j'espère que vous pourrez m'aidez.
Je souhaite afficher les 10 dernières miniatures des photos publiées par les utilisateurs.
J'ai donc une page html, où je fais appel à un autoloader pour charger la class Pictures où j'ai deux fonctions.
Je les appelle depuis l'html par <?php $pictures = Pictures::get_recent_pictures($db, 10); ?> où db fait appel à la fonction getDatabase
et <?php thumbnail_pic_list($pictures); ?> ... mais malheureusement je n'ai qu'une seule photo qui s'affiche.
Voici les fonctions ! Merci pour votre aide ! Je pète les plombs,..

Voilà get_recent_pictures :
Image

Voilà thumbnail_pic_list
Image

Je me tiens à votre disposition pour plus de détails
Cordialement :D

Mammouth du PHP | 2703 Messages

09 août 2020, 22:33

faire un copier/coller du php dans la case de réponse car là, c'est trop petit pour être lisible.
debuguer, afficher le résultat de la fonction get_recent_pictures pour vérifier si cela retourne bien ce qui est attendu.

superNoob
Invité n'ayant pas de compte PHPfrance

10 août 2020, 00:27

Bonsoir,
revoilà le code qui me pose problème,...
Lorsque je fais un var_dump après "to_ret", j'obtiens bien l'array de la première photo !

array(1) { [0]=> array(11) { ["id"]=> string(2) "17" ["title"]=> string(12) "Our holidays" ["width"]=> string(3) "128" ["height"]=> string(3) "128" ["tag"]=> string(8) "holidays" ["filename"]=> string(21) "holidays/holidays.jpg" ["price"]=> string(2) "15" ["high_quality"]=> string(12) "NDMzMzY2NQ==" ["created_on"]=> string(19) "2020-01-28 22:15:05" ["user_id"]=> string(1) "9" ["login"]=> string(5) "wanda" } }

Je me suis sûrement trompé dans le fichier get_recent pictures ne possédant pas assez d'expérience en php, en effet, voici le code

Code : Tout sélectionner

function get_recent_pictures($db, $limit = 10){ $sql = $db->query("SELECT p.*,u.login from `pictures` p left join users u on u.id = p.user_id order by created_on DESC limit 3, 10;", [$limit])->fetch(PDO::FETCH_ASSOC); if ($sql) { $row = array(); while ($row = $sql) { $to_ret[] = $row; var_dump($to_ret); die(); break; } return $to_ret; } else { return False; } }
Lorsque je le modifie, j'ai de temps en temps une erreur 'undefined index for id ... title ...'
Merci de votre aide, j'espère comprendre cela avec votre aide car là je coince,... Merci :D

Mammouth du PHP | 2703 Messages

10 août 2020, 00:48

à quoi servent ces lignes ?
die();
break;

SuperNoob
Invité n'ayant pas de compte PHPfrance

10 août 2020, 02:43

Re_Hello, je suis encore dessus,
Je teste et je lis,... Il me semble que le die(); c'est pour stopper l'exécution du reste du code.
J'ai mis le break parce que sinon, j'ai le message :

Fatal error: Allowed memory size of 549453824 bytes exhausted (tried to allocate 536870920 bytes) in C:\xampp\htdocs\Demo_php_inc_class\class\Pictures.php on line 106

Depuis tout à l'heure j'ai mis un print_r de $row et ça m'affiche --> Array ( [0] => 20 )
lorsque j'ai fais ce code

Code : Tout sélectionner

$row = array($limit); print_r($row);
Merci Or 1 !

superNoob
Invité n'ayant pas de compte PHPfrance

10 août 2020, 11:23

Bonjour, enfin un autre test avec print_r :

Code : Tout sélectionner

$sql = $db->query("SELECT p.*,u.login from `pictures` p left join users u on u.id = p.user_id order by created_on DESC limit 10;", [$limit])->fetch(PDO::FETCH_ASSOC); print_r($sql);
et ça me réponds ça, j'obtiens biens la première image mais pas les autres,... je cherche,...

Array ( [id] => 20 [title] => Coffee art I draw with my finger this morning [width] => 128 [height] => 128 [tag] => art [filename] => art/coffee.jpg [price] => 35 [high_quality] => OTg1OTMyNw== [created_on] => 2020-01-29 09:23:51 [user_id] => 4 [login] => james )

Ma boucle for est peut être responsable,... a votre avis ?

Merci ;)

superNoob
Invité n'ayant pas de compte PHPfrance

10 août 2020, 11:57

Salut,
J'ai réussi à afficher toutes les images sous forme d'array avec ____ [$limit]->fetchAll(PDO::FETCH_ASSOC); _____ suivi d'un print_r($sql);
Là j'ai le print_r qui affiche toutes les images sous forme de tableau mais je n'ai aucune image à l'écran,...
J'ai cette erreur

Code : Tout sélectionner

Notice: Undefined index: id in C:\xampp\htdocs\Demo_php_inc_class\class\Pictures.php on line 324
et

Code : Tout sélectionner

Notice: Undefined index: title in C:\xampp\htdocs\Demo_php_inc_class\class\Pictures.php on line 336
et ceci pour tous les index,... uniquement si j'utilise fetchAll, parce que avec fetch(PDO::FETCH_ASSOC); il ya la première image qui fonctionne,...
Je reviens cet après-midi pour chercher ça mais si vous avez une idée, quelle qu'elle soit, elle sera la bienvenue,...

Dans le fichier thumbnail j'ai la boucle for mais le print_r affiche quand même la boucle complète, je comprends pas pourquoi undefined index [id], [title], etc,...

A plus

Mammouth du PHP | 2703 Messages

10 août 2020, 15:15

Fatal error: Allowed memory size of 549453824 bytes exhausted (tried to allocate 536870920 bytes) in C:\xampp\htdocs\Demo_php_inc_class\class\Pictures.php on line 106
soit une boucle infinie. la manière de parcourir les résultats d'un select n'est donc pas la bonne. retour à la doc pour copier/coller les exemples.

superNoob
Invité n'ayant pas de compte PHPfrance

10 août 2020, 16:08

Ha ok, mais pourtant j'ai vérifié en faisant un isset de $sql['id'] ça fonctionne très bien avec un fetch mais pas avec un fetchAll.

Code : Tout sélectionner

function get_recent_pictures($db, $limit = 10){ $sql = $db->query("SELECT p.*,u.login from `pictures` p left join users u on u.id = p.user_id order by created_on DESC limit 10;", [$limit])->fetchAll(PDO::FETCH_ASSOC); if(isset($sql['id'])) { echo $sql['id']; }else{ echo "contenu introuvable"; }
Avec fetch(PDO::FETCH_ASSOC); --> retourne 20 (soit le maximum que j'ai défini par $pictures = Pictures::get_recent_pictures($db, 20); là ça fonctionne mais avec fetchAll(PDO::FETCH_ASSOC); --> retourne 'contenu introuvable' donc L'ID est introuvableet me retourne 'undefined index' ! La méthode fetchAll ne fonctionne pas comme ça , mais sinon tu as aussi raison pour la boucle infinie mais la boucle est appelée après n'est ce pas? :D

Mammouth du PHP | 2703 Messages

10 août 2020, 16:27

https://www.php.net/manual/fr/pdostatement.fetchall.php
"Retourne un tableau contenant toutes les lignes du jeu d'enregistrements"
voir l'exemple 1.

superNoob
Invité n'ayant pas de compte PHPfrance

10 août 2020, 20:37

Bonsoir, je bloque encore avec leurs syntaxe, et le truc c'est que j'ai déjà une fonction 'query'...
Soit je reprends tout sur les requêtes préparées soit il ya un bug ,... Eclairez moi
Voilà la fonction query ---->

Code : Tout sélectionner

public function query($query, $params = false){ if($params){ $req = $this->pdo->prepare($query); $req->execute($params); }else{ $req = $this->pdo->query($query); } return $req; }

superNoob
Invité n'ayant pas de compte PHPfrance

12 août 2020, 12:38

Bonjour, le code semble fonctionner, les images s'affichent en tous cas...
avec cette requête

Code : Tout sélectionner

function get_recent_pictures($db, $limit = 10){ $req = $db->query("SELECT p.*,u.login from `pictures` p left join users u on u.id = p.user_id order by created_on DESC limit 12;", [$limit])->fetchAll(PDO::FETCH_ASSOC); if ($req) { $row = array(); while ($row = $req) { $req[] = $row; break; } return $row; } else { return False; } }
il suffisait de suivre la variable $req et de retourner $row. Je passe à la suite. Merci ! :D