Vous n'êtes pas identifié(e).
[25 janvier 2021] - Publication de Wanewsletter 3.1.0
Pages : 1
bonjour,
tout fonctionnait bien sur OVH.. avant qu'il passe mes bases sous MYSQL5...
consequence (que j'ai vu pour l'instant) lorsque je me connecte, impossible d'avoir le nombre de membres, de liste... de la premiere page lorsqu'on se connecte.
voila le message d'erreur :
Impossible d'obtenir le nombre d'inscrits/inscrits en attente
SQL query :
SELECT COUNT(abo_id) AS num_abo, abo_status
FROM wa_abonnes
WHERE abo_id IN(SELECT DISTINCT(abo_id)
FROM wa_abo_liste
WHERE liste_id IN(1, 3, 2))
GROUP BY abo_status
SQL errno : 1064
SQL error : You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT DISTINCT(abo_id) FROM wa_abo_liste WHERE liste_id IN
Fichier : index.php Ligne : 77
voila, pouvez vous m'aider?
merci
olivier
nb : je n'ai pas encore verifie que l'envoi de mail fonctionne..
Hors ligne
Et si vous éditez le fichier admin/index.php et remplacez à la ligne 43 :
$sql_abo_ids = "SELECT DISTINCT(abo_id)
par:
$sql_abo_ids = "SELECT abo_id
Ça passe mieux ?
PHP et MySQL, un duo gagnant !
Hors ligne
bonsoir, nan, pareil.. meme erreur..
par contre, les envois et tout le reste fonctionne... le nombre d inscrit dans les autres menus.. impec..
sauf à la connexion.. meme msg malgre le changement de code..
Hors ligne
Sur OVH, avec # Version du client MySQL: 5.0.18
le script suivant marche.
SELECT abo.abo_status, count( abo.abo_id ) AS nb_abo
FROM wa_abonnes abo, wa_abo_liste lis
WHERE abo.abo_id = lis.abo_id
AND lis.liste_id
IN ( 2, 4 )
GROUP BY abo.abo_status
Hors ligne
ok merci pour le code...
mais comment je l integre à la page ?
je ne suis pas programmeur php... et encore moins l auteur de WAnewsletter
Hors ligne
Je n'ai pas pu essayer la modif.
Recopie le fichier index.php en index.php.v0
Remplace le code ci-dessous
$sql = "SELECT COUNT(abo_id) AS num_abo, abo_status
FROM " . ABONNES_TABLE . "
WHERE abo_id IN($sql_abo_ids)
GROUP BY abo_status";
par celui ci
/* Modification SQL Pierre Roger 06/10/2006
** Suppression du sous-select avec $sql_abo_ids
** Remplacement par une jointure
** entre wa_abonnes et wa_abo_liste
**$sql = "SELECT COUNT(abo_id) AS num_abo, abo_status
**FROM " . ABONNES_TABLE . "
**WHERE abo_id IN($sql_abo_ids)
**GROUP BY abo_status";
*/
$sql = "SELECT COUNT(abo_id) AS num_abo, abo_status
FROM " . ABONNES_TABLE . " abo, " . ABO_LISTE_TABLE . " lis
WHERE abo.abo_id = lis.abo_id
AND lis.liste_id IN($sql_liste_ids).
GROUP BY abo_status";
Peux-tu faire un essai et renvoyer le résultat. OK ou KO ?
Hors ligne
Petite erreur dans ce que j'ai posté.
Remplacer ma précédente proposition par :
/* Modification SQL P. Roger - EMERA 06/10/2006
** Suppression du sous-select avec $sql_abo_ids
** Remplacement par une jointure
** entre wa_abonnes et wa_abo_liste
**$sql = "SELECT COUNT(abo_id) AS num_abo, abo_status
**FROM " . ABONNES_TABLE . "
**WHERE abo_id IN($sql_abo_ids)
**GROUP BY abo_status";
*/
$sql = "SELECT COUNT(abo.abo_id) AS num_abo, abo_status
FROM " . ABONNES_TABLE . " abo, " . ABO_LISTE_TABLE . " lis
WHERE abo.abo_id = lis.abo_id
AND lis.liste_id IN($sql_liste_ids)
GROUP BY abo_status";
Hors ligne
Malheureusement, ça n'ira pas. Avec votre requête, les abonnés inscrits à plusieurs listes seront comptés une fois pour chaque liste.
Quelle est l'erreur renvoyée par mysql 5 pour une telle requête ? :
SELECT COUNT(abo_id) AS num_abo, abo_status
FROM wa_abonnes
WHERE abo_id IN(SELECT abo_id
FROM wa_abo_liste
WHERE liste_id IN(1, 3, 2))
GROUP BY abo_status
(Adapter les identifiants de liste si besoin)
PHP et MySQL, un duo gagnant !
Hors ligne
Voila ce que donne l'exécution sur OVH
Jeu de tests :
Il y a 2 signataires pour la liste 2 et 3 pour la liste 4.
L'abo_id 1 signe dans la liste 2 et 4
Ce qui fait au total 4 signataires, toutes listes confondues.
SELECT liste_id, abo_id
FROM wa_abo_liste
WHERE liste_id IN ( 2, 4 )
liste_id abo_id
Modifier Effacer 2 1
Modifier Effacer 4 1
Modifier Effacer 2 2
Modifier Effacer 4 460
Modifier Effacer 4 1603
Quand j'exécute la requête complète, voici le résultat
Erreur
requête SQL: Documentation
SELECT COUNT( abo_id ) AS num_abo, abo_status
FROM wa_abonnes
WHERE abo_id IN (
SELECT abo_id FROM wa_abo_liste
WHERE liste_id IN ( 2, 4 )
)
GROUP BY abo_status
MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT abo_id FROM wa_abo_liste WHERE liste_id IN ( 2 , 4 )
A ma requête proposée précédemment, j'ai rajouté la clause DISTINCT dans le count( abo.abo_id). Le résultat est juste.
Dans mon exemple, il y a effectivement 4 signataires distincts
SELECT abo.abo_status, count( DISTINCT abo.abo_id ) AS nb_abo
FROM wa_abonnes abo, wa_abo_liste lis
WHERE abo.abo_id = lis.abo_id
AND lis.liste_id
IN ( 2, 4 )
GROUP BY abo.abo_status
abo_status nb_abo
1 4
Hors ligne
A ma requête proposée précédemment, j'ai rajouté la clause DISTINCT dans le count( abo.abo_id). Le résultat est juste.
Dans mon exemple, il y a effectivement 4 signataires distincts
Je ne peux pas utiliser COUNT(DISTINCT(field)). SQLite ne le gère pas avant la version 3.1 je crois
Que donne la requête suivante :
SELECT COUNT(a.abo_id) AS num_subscribe
FROM wa_abonnes AS a
WHERE a.abo_id IN(
SELECT al.abo_id
FROM wa_abo_liste AS al
WHERE al.liste_id IN(2, 4)
AND al.confirmed = 1
)
AND a.abo_status = 1
C'est tiré de options/extra.php.
Si ça marche, essayez :
SELECT COUNT(a.abo_id) AS num_subscribe, a.abo_status
FROM wa_abonnes AS a
WHERE a.abo_id IN(
SELECT al.abo_id
FROM wa_abo_liste AS al
WHERE al.liste_id IN(2, 4)
AND al.confirmed = 1
)
GROUP BY a.abo_status
PHP et MySQL, un duo gagnant !
Hors ligne
C'est toujours en erreur.
Il semble que l'erreur soit du au SUBSELECT dans la clause IN. J'ai fait plusieurs tests en simplifiant les clauses et toujours la même erreur.
Erreur
requête SQL: Documentation
SELECT COUNT( a.abo_id ) AS num_subscribe
FROM wa_abonnes AS a
WHERE a.abo_id
IN (
SELECT al.abo_id
FROM wa_abo_liste AS al
WHERE al.liste_id
IN ( 2, 4 )
AND al.confirmed =1
)
AND a.abo_status =1
MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT al.abo_id
FROM wa_abo_liste AS al
WHERE al.liste
Hors ligne
J'ai posé la question à OVH et obtenu la réponse suivante :
Les serveurs 4.0 n'ont pas été migré en 5.0, pour bénéficier de mysql 5.0 il faut créer une nouvelle base (toutes les nouvelles bases sont automatiquement créé en 5.0), une solution pour les utilisateurs qui n'ont plus la possibilité de créer de nouvelle bases devrait être disponible bientôt.
Cela expliquerait le problème du bug sur la clause abo_id IN(SELECT .....
En relisant le post initial deoliviersin qui rencontre ce problème depuis qu'ils ont passé ses bases sous MySQL5.
Personnellement, je n'ai pas rencontré de problème SQL dans l'interface. Les tests que j'ai fait pour ce post, l'ont été à travers phpMyAdmin.
Hors ligne
Je ne vous suis plus là.
Les tests que vous faites et qui donnent une erreur de syntaxe, c'est sur un serveur MySQL 4.0 ou MySQL 5.0 ?
Normalement, c'est indiqué sur la page d'accueil de votre installation de phpmyadmin. Sinon, exécutez la requête suivante:
SELECT VERSION()
PHP et MySQL, un duo gagnant !
Hors ligne
Bonsoir,
J'ai vérifié la version, il s'agit bien d'une version 4.0.25 :
Textes complets
VERSION()
4.0.25-standard-log
Sur la page de garde de phpmyadmin, c'était bien indiqué la version 4.0.25 mais également Version du client MySQL: 5.0.18.
D'où mon erreur initiale :???: .
Mais je trouve bizarre d'avoir ces 2 version différentes affichées sur la même page .... :tss:
MySQL - 4.0.25-standard-log
* Version du protocole: 10
* Serveur: sql8 via TCP/IP
* Utilisateur: toto@1.1.1.1
* Créer une base de données: Documentation
aucun privilège
* Quitter
phpMyAdmin - OVH
* Version du client MySQL: 5.0.18
* Extensions PHP utilisées: mysql
*
Language Info:
*
Thème / Style:
* Documentation de phpMyAdmin
* Site officiel de phpMyAdmin
Hors ligne
Ok, ça a le mérite d'expliquer le pourquoi des erreurs de syntaxe rapportées par MySQL. MySQL 4.0 ne supporte pas les sous-requêtes.
Le client MySQL dont il est fait mention est l'API écrite en C proposée par MySQL pour utilisation dans des applications tierces (entre autres PHP). Il n'est pas rare que le numéro de version ne soit pas le même que celui du serveur MySQL.
Mais je suis quand même fautif car je pars du principe que sir l'extension PHP mysqli est présente, on a forcément derrière un serveur MySQL 4.1 ou supérieur ce qui n'est pas le cas ici.
Je vais réfléchir à un correctif…
PHP et MySQL, un duo gagnant !
Hors ligne
Une solution pour contourner serait de créer une table temporaire qui serait utilisée en direct dans la requete principale.
Mais je ne sais pas si ça marche également sur SQLLITE et si ça n'alourdit pas trop l'ensemble.
Hors ligne
Voilà qui est corrigé sur la version de développement:
http://dev.webnaute.net/wanewsletter/trac/changeset/404
La solution portait sur une meilleure détection des possibilités du serveur mysql en face. J'ai ajouté une vérification pour n'autoriser l'utilisation des subselect dans wanewsletter que si le serveur mysql est >= 4.1.0
PHP et MySQL, un duo gagnant !
Hors ligne
Pages : 1