Afficher des données en les ordonnant selon un champ d'une autre BDD

Résolu/Fermé
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 - Modifié le 6 mai 2020 à 22:15
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 - 8 mai 2020 à 15:21
Bonsoir à tous,

Je cherche à afficher des données d'une base de données appelées "tags" (qui regroupe mes mots-clés) en les ordonnant selon le champ "date_creation" d'une table appelée "articles".

En gros, je veux afficher les articles de mon blog qui contiennent un même mot-clef du plus récent au plus ancien.

Sauf que jusqu'à présent, mon code affiche ces articles mais en mode un peu aléatoire.

J'ai donc remanié ma requête en faisant un JOIN, mais rien n'y fait. En plus, j'ai une pagination, ce qui ne facilite pas les choses.

Pourtant, lorsque je contrôle ma syntaxe SQL, elle semble être bonne.

Voici ma requête actuelle :

SELECT SQL_CALC_FOUND_ROWS * FROM tags WHERE tag_slug=:tag_slug LIMIT limite OFFSET debut


Voici mon ancienne requête :
SELECT SQL_CALC_FOUND_ROWS
  t.art_id,
  t.tag_name,
  t.tag_slug,
  t.tag_code,
  a.id_article,
  a.date_creation
FROM
  tags t
  INNER JOIN articles a ON t.id_article = t.art_id
WHERE
  t.tag_slug = ':tag_slug'
ORDER BY
  a.date_creation DESC
LIMIT limite OFFSET debut


Voici le reste de mon code :
$page = (!empty($_GET['page']) ? $_GET['page'] : 1);

$accueil = 'https://exemple.fr/'.trim($_GET['lang']).'/t-'.trim($_GET['slug']).'';

$type_page = '-p-';

//$adj = 1;

//$limite = 2;

$debut = ($page - 1) * $limite;

//$query = "SELECT SQL_CALC_FOUND_ROWS * FROM tags WHERE tag_slug=:tag_slug LIMIT :limite OFFSET :debut";

$query = "SELECT SQL_CALC_FOUND_ROWS
  t.art_id,
  t.tag_name,
  t.tag_slug,
  t.tag_code,
  a.id_article,
  a.date_creation
FROM
  tags t
  INNER JOIN articles a ON t.id_article = t.art_id
WHERE
  t.tag_slug = ':tag_slug'
ORDER BY
  a.date_creation DESC
LIMIT :limite OFFSET :debut";

$tag_slug = trim($_GET['slug']);

$query = $bdd->prepare($query);

$query->bindValue('limite', $limite, PDO::PARAM_INT);
$query->bindValue('debut', $debut, PDO::PARAM_INT);
$query->bindValue('tag_slug', $tag_slug, PDO::PARAM_STR);

$query->execute();

$res_nb_art = $bdd->query('SELECT found_rows()');

$nb_total = $res_nb_art->fetchColumn();

$nb_pages = ceil($nb_total / $limite);

echo '<br />';
echo "Page $page / $nb_pages";
echo '<br /><br>';

echo getPaginationString($page, $nb_total, $limite, $adj, $accueil, $type_page);


Voici la structure de mes tables "articles" & "tags", pour une meilleure compréhension de ma requête :


Merci de votre aide

Bonne soirée

4 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
7 mai 2020 à 09:14
bonjour, ton ancienne requête ne retourne pas les enregistrements triés par date_creation?
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
7 mai 2020 à 14:37
Bonjour yg_be,

Non, lorsque je met cette requête (celle avec JOIN), rien ne s'affiche, c'est comme si ça plantait. Malheureusement, comme je bosse sur serveur, je ne peux pas voir les erreurs SQL. Avec la requête simple, ça me les affiche en aléatoire, alors qu'avec le JOIN ça plante complètement.
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
7 mai 2020 à 15:40
pourquoi ne peux-tu pas voir les erreurs SQL?
qu'est-ce qui t’empêche de tester la requête sans passer par un programme?
comment affichais-tu les résultats sans le JOIN?
comment tentes-tu d'afficher les résultats avec le JOIN?
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
7 mai 2020 à 23:50
Les erreurs SQL ne s'affichent pas puisque je ne suis pas en local, mais sur serveur. Je ne pense pas que l'on puisse afficher les erreurs SQL ou PHP en mode serveur, alors qu'elle s'affichent automatiquement en local.
Sans le JOIN, j'affichais mes résultats avec la requête suivante
SELECT SQL_CALC_FOUND_ROWS * FROM tags WHERE tag_slug=:tag_slug LIMIT :limite OFFSET :debut
Avec le JOIN, je fais la même chose, mais avec la requête JOIN présentée plus haut.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
Modifié le 8 mai 2020 à 08:46
Bonjour,


Les erreurs SQL ne s'affichent pas puisque je ne suis pas en local, mais sur serveur. Je ne pense pas que l'on puisse afficher les erreurs SQL ou PHP en mode serveur,

Ben si....

Vu que tu parles de PHP ... je t'invite à consulter ceci :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Puis, au cas où tu serais en PDO, ça :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Quoi qu'il en soit, ta question concerne une requête SQL ... il faut donc, avant d'essayer de l'utiliser dans un code PHP, commencer par la tester DIRECTEMENT dans sa BDD ( via phpmyadmin par exemple ou en lignes de commandes ).
Tu aurais donc vu, déjà, une erreur... de virgule manquante
SELECT SQL_CALC_FOUND_ROWS
  t.art_id



0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
8 mai 2020 à 12:16
Bonjour jordane45,

Merci pour ta réponse. Je me rappelais vaguement d'un truc comme ça pour MySQL, mais je ne savais pas pour PDO. Je l'ai donc activé et maintenant je les vois sur serveur comme en local.

J'ai testé ma requête directement en SQL sur ma BDD, mais comme ma requête comprend des variables PHP, la requête n'aboutit à rien. J'ai donc remplacé mes variables PHP par des données réelles présentes dans ma BDD, sans succès non plus, puisque là où MySQL aurait dû me retourner 2 lignes pour ma requête, MySQL a retourné un résultat vide.

En testant cette requête
SELECT SQL_CALC_FOUND_ROWS
  t.art_id,
  t.tag_name,
  t.tag_slug,
  t.tag_code,
  a.id_article,
  a.date_creation
FROM
  tags t
  INNER JOIN articles a ON t.id_article = t.art_id
WHERE
  t.tag_slug = ':tag_slug'
ORDER BY
  a.date_creation DESC
LIMIT :limite OFFSET :debut


j'obtiens le message suivant :

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/arhljqap/public_html/ts.php:84 Stack trace: #0 /home/arhljqap/public_html/ts.php(84): PDOStatement->execute() #1 {main} thrown in /home/arhljqap/public_html/ts.php on line 84

Que sont les tokens ? Je n'ai jamais vu ça, je ne sais pas ce que c'est !?

Merci pour ta réponse

Cordialement
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023
8 mai 2020 à 12:20
Comme je te l'ai indiqué.. tu as déjà une erreur à la première ligne de ta requête
Il manque une virgule.

Ensuite.. les tocken . se sont les "variables nommées" qui se trouvent dans ta requête.

Ton autre problème.. c'est que tu as mis des quotes autour d'une de tes variables
':tag_slug'

Et il faut les retirer !
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
8 mai 2020 à 12:34
D'accord, merci pour ta réponse.

J'ai donc procédé en suivant tes conseils.

J'ai testé la requête suivante (en rajoutant la virgule après SQL_CALC_FOUND_ROWS et en omettant les 'quotes') :
SELECT SQL_CALC_FOUND_ROWS,
  t.art_id,
  t.tag_name,
  t.tag_slug,
  t.tag_code,
  a.id_article,
  a.date_creation
FROM
  tags t
  INNER JOIN articles a ON a.id_article = t.art_id
WHERE
  t.tag_slug = :tag_slug
ORDER BY
  a.date_creation DESC
LIMIT :limite OFFSET :debut


et j'ai obtenu le message suivant :

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' t.art_id, t.tag_name, t.tag_slug, t.tag_code, a.id_article, a' at line 1 in /home/arhljqap/public_html/ts.php:84 Stack trace: #0 /home/arhljqap/public_html/ts.php(84): PDOStatement->execute() #1 {main} thrown in /home/arhljqap/public_html/ts.php on line 84

J'ai réessayé en omettant la virgule après SQL_CALC_FOUND_ROWS :

SELECT SQL_CALC_FOUND_ROWS
  t.art_id,
  t.tag_name,
  t.tag_slug,
  t.tag_code,
  a.id_article,
  a.date_creation
FROM
  tags t
  INNER JOIN articles a ON a.id_article = t.art_id
WHERE
  t.tag_slug = :tag_slug
ORDER BY
  a.date_creation DESC
LIMIT :limite OFFSET :debut


et là ça fonctionne parfaitement, je suis parvenu à obtenir le résultat que je voulais, c'est-à-dire que les articles regroupés sous un même mot-clé sont ordonnés du plus récent au plus ancien, et je n'ai plus aucune erreur d'affichée.

J'en conclus que le problème venait bien des quotes.

Merci beaucoup pour ton aide Jordane ! ;)
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023
8 mai 2020 à 14:10
pour info, MySQL va très bientôt arrêter d'accepter SQL_CALC_FOUND_ROWS.
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
8 mai 2020 à 15:21
Merci, je ne savais pas. Zut, il va falloir que je change toutes mes requêtes... Quelle alternative à SQL_CALC_FOUND_ROWS pour la pagination du coup stp ?
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
8 mai 2020 à 10:00
as-tu testé ces requêtes en local, sans passer par un programme?
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
8 mai 2020 à 12:41
Oui, finalement je les ai testé en local aussi. Merci pour ton aide ! ;)
0