Pagination pour une requête postgresql
## Description du bug / Comment le reproduire Bonjour j'utilise depuis très longtemps spip pour afficher le contenu de bases de données de mon laboratoire, la plupart étant en Postgresql. Depuis que le support Postgresql est passé en expérimental, quand j'ai besoin de m'interfacer avec une base pg, je renomme `ecrire/req/pg.exp.php` en `ecrire/req/pg.php` et ça roule. Un peu plus récemment (passage en spip 4 je pense), j'ai dû ajouter la fonction `spip_pg_table_exists` pour que ça continue à fonctionner. ``` --- a/ecrire/req/pg.php +++ b/ecrire/req/pg.exp.php @@ -127,6 +127,7 @@ $GLOBALS['spip_pg_functions_1'] = [ 'set_connect_charset' => 'spip_pg_set_connect_charset', 'showbase' => 'spip_pg_showbase', 'showtable' => 'spip_pg_showtable', + 'table_exists' => 'spip_pg_table_exists', 'update' => 'spip_pg_update', 'updateq' => 'spip_pg_updateq', ]; @@ -1535,3 +1536,8 @@ function mysql2pg_type($v) { function spip_versions_pg() { return function_exists('pg_connect'); } + +function spip_pg_table_exists(string $table, $serveur = '', $requeter = true) { + $r = spip_pg_query( + 'SELECT * FROM information_schema.tables' . + ' WHERE table_name ILIKE ' . _q($table), $serveur, $requeter); + if (!$requeter) { + return $r; + } + $res = spip_pg_fetch($r); + return (bool) $res; +} + ``` Aujourd'hui, je travaille sur la migration 4.1 -> 4.4 et je tombe sur un os que je n'arrive pas à résoudre. Ce squelette fonctionne ``` <BOUCLE_apisp(apis_gavo:apis_data){nom='IO'}{par data_id}> <br>#DATA_ID </BOUCLE_apisp> ``` Tous les résultats sont bien affichés. Mais pas celui-là : ``` <BOUCLE_apisp(apis_gavo:apis_data){nom='IO'}{par data_id}{pagination 10}> <br>#DATA_ID </BOUCLE_apisp> ``` C'est-à-dire que le squelette ne me revoie rien. En mode débug, c'est comme si la requête ne renvoyait aucun résultat En mettant quelques error_log dans pg.php, je vois que dans les 2 cas ma requête est bien exécutée (donc pas un pb de syntaxe). Est-ce que quelqu'un aurait une idée ? Comme je l'indiquais dans le forum, la solution de passer mes bases en Mysql n'est pas une option. Je suis donc prête à m'investir pour que le support Postgresql soit maintenu. ## Comportement attendu Afficher les résultats selon la pagination demandée ## Autres informations Dans `pg.log` j'ai ajouté quelques error_log juste avant le return ``` error_log($query); error_log(print_r($r, true)); while ($row = pg_fetch_row($r)) { error_log(print_r($row, true)); } ``` voilà ce que j'ai dans les logs Apache ``` SELECT apis.apis_data.data_id FROM apis.apis_data WHERE (apis.apis_data.targname = 'IO') ORDER BY apis.apis_data.data_id LIMIT 10 PgSql\\Result Object ( ) Array ( [0] => bas_5048 ) Array ( [0] => bas_5049 ) Array ( [0] => bas_5050 ) Array ( [0] => bas_5051 ) Array ( [0] => bas_5052 ) Array ( [0] => bas_5053 ) Array ( [0] => bas_5054 ) Array ( [0] => bas_5055 ) Array ( [0] => bas_5056 ) Array ( [0] => bas_5057 ) SELECT COUNT(*) FROM apis.apis_data WHERE (apis.apis_data.targname = 'IO') PgSql\\Result Object ( ) Array ( [0] => 136 ) SELECT apis.apis_data.data_id FROM apis.apis_data WHERE (apis.apis_data.targname = 'IO') ORDER BY apis.apis_data.data_id LIMIT 10 PgSql\\Result Object ( ) Array ( [0] => bas_5048 ) Array ( [0] => bas_5049 ) Array ( [0] => bas_5050 ) Array ( [0] => bas_5051 ) Array ( [0] => bas_5052 ) Array ( [0] => bas_5053 ) Array ( [0] => bas_5054 ) Array ( [0] => bas_5055 ) Array ( [0] => bas_5056 ) Array ( [0] => bas_5057 ) SELECT COUNT(*) FROM apis.apis_data WHERE (apis.apis_data.targname = 'IO') PgSql\\Result Object ( ) Array ( [0] => 136 ) ``` ## Informations techniques * Version de SPIP : 4.4.13 * Version de PHP : 8.3.12 * Navigateur utilisé : Firefox * Serveur web (si pertinent) : Apache 2.4 * Système d'exploitation (si pertinent) : MacOS 15.7.4 * Base de données (si pertinent) : Postgtresql 11
issue

Forge communautaire SPIP | Charte d'utilisation | Signaler un problème sur ce site