Page 1 sur 1

Afficher la liste de miniatures

Posté : 09 août 2020, 16:53
par superNoob
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

Re: Afficher la liste de miniatures

Posté : 09 août 2020, 22:33
par or 1
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.

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 00:27
par superNoob
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

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 00:48
par or 1
à quoi servent ces lignes ?
die();
break;

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 02:43
par SuperNoob
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 !

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 11:23
par superNoob
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 ;)

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 11:57
par superNoob
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

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 15:15
par or 1
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.

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 16:08
par superNoob
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

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 16:27
par or 1
https://www.php.net/manual/fr/pdostatement.fetchall.php
"Retourne un tableau contenant toutes les lignes du jeu d'enregistrements"
voir l'exemple 1.

Re: Afficher la liste de miniatures

Posté : 10 août 2020, 20:37
par superNoob
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; }

Re: Afficher la liste de miniatures

Posté : 12 août 2020, 12:38
par superNoob
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