juste qu'au lieu d'écrire
$conn = mysqli_connect('... mes données personnelles de connexion à la BDD...');
$req = "SELECT nom, prenom, profession, specialite, code_profession, b5, mode_exercice, cp_ville, a3 FROM table WHERE ((cp_ville > ' ') AND (a3 = 'C') AND !((code_profession = '60') AND (b5 = 'S')) OR (code_profession = '86') OR (code_profession = '50') OR (code_profession = '21') OR (code_profession = '28') OR (code_profession = '98'))";
j'aurais fait :
$db = JFactory::getDbo(); $query = $db->getQuery(true); $req = "SELECT nom, prenom, profession, specialite, code_profession, b5, mode_exercice, cp_ville, a3 FROM table WHERE ((cp_ville > ' ') AND (a3 = 'C') AND !((code_profession = '60') AND (b5 = 'S')) OR (code_profession = '86') OR (code_profession = '50') OR (code_profession = '21') OR (code_profession = '28') OR (code_profession = '98'))"; $db->setQuery($req);
$results = $db->loadObjectList(); ...
Bug pour générer un fichier Sitemap
Réduire
X
-
Le visiteur a réponduEnvoyé par elecoest Voir le messageHello Visiteur
A part le fait que tu n'utilises pas les fonctions standard offertes par Joomla pour les query en base je ne vois rien d'anormal et mon PHPStorm non plus.
Comme je n'ai pas de réponse à ta question, j'ai une alternative : JSitemapPro. tu peux générer le sitemap pour les URL que tu souhaites (comme j'en ai qqes milliers je fais çà par requete SQL). Cà marche c'est fonctionnel et la version pro te permet de suivre bien d'autres choses.
Manu
Je te remercie pour ce conseil concernant JSitemapPro.
Je viens justement de résoudre mon problème en travaillant en 2 étapes :
1. j'ai simplifié mon script pour qu'il ne génère pas la 1ère ligne de tout sitemap,
2. après exécution du scipt, il me reste ensuite à ajouter avec un éditeur de texte la 1ère ligne manquante dans chacun des sitemaps.
nb : idem pour le sitemap.index
Après vérification, mes quelques 500000 urls sont ok.
ps: je suis surpris par ta remarque selon laquelle je n'utilise pas les fonctions standard offertes par Joomla pour les query en base : j'utilise ici "mysqli" qui est un standard au-delà de Joomla. Et sans problème. Et avec l'avantage de pouvoir faire tout contrôle de bonne écriture par des tests préalables avec "phpMyadmin sur ma bdd (avec un simple copier/coller de ma requête mysqli).
Mais je suis conscient qu'il existe bien d'autres méthodes, et notamment des méthodes propres à Joomla.
Bons vœux pour 2020 !
Laisser un commentaire:
-
Hello Visiteur
A part le fait que tu n'utilises pas les fonctions standard offertes par Joomla pour les query en base je ne vois rien d'anormal et mon PHPStorm non plus.
Comme je n'ai pas de réponse à ta question, j'ai une alternative : JSitemapPro. tu peux générer le sitemap pour les URL que tu souhaites (comme j'en ai qqes milliers je fais çà par requete SQL). Cà marche c'est fonctionnel et la version pro te permet de suivre bien d'autres choses.
Manu
Laisser un commentaire:
-
<BIG TROLL - START>
Envoyé par manu93fr Voir le messageBonsoir,
qui dit php ... suppose écrire un script avec les bonnes instructions suivant la version de php du serveur
Questions :
- quelle est la version exacte de php sur ton serveur ?
- tu as écris toi même ce script ou tu l'as "récuperée" quelque part ?
- si tu es sur un site Joomla, pourquoi utiliser un tel script ? tu as des extensions pour cela ... sauf si tu as une raison précise que je ne connais pas
- peut on avoir l'intégralité du code ? (pour trouver une éventuelle erreur)
si personne ne peut t'aider ...... il faudrait peut être t'orienter sur un forum dédié a PHP
Je ne vois nulle part, dans l'intervention de Manu, la moindre agressivité, ni dans le fond, ni dans la forme (y a même un smiley)
Apparemment ce bug dans ton code t'énerve (je peux comprendre) au point de prêter de fausses intentions aux intervenants (ça je comprends moins).
Il ne faut pas oublier que les messages qu'on lit se teintent toujours de l'état d'esprit dans lequel on se trouve, d'où parfois une mauvaise interprétation des intentions.
Donc en cette période de fêtes, je ne saurai trop te conseiller de manger un peu (beaucoup) de chocolat, c'est bon pour l'humeur comme pour le cerveau
</BIG TROLL - END>
Laisser un commentaire:
-
Le visiteur a réponduEnvoyé par cavo789 Voir le messageBonjour
Visiteur merci de veiller à respecter tes interlocuteurs. Je ne vois aucune agressivité dans les messages de Manu. La seule personne qui a fait montre de sentiments peu collégial, c'est toi.
Si tu veux recevoir de l'aide, le respect de l'autre est déjà un bon point de départ.
Pour ton problème, je rejoins Loïc : à un moment donné, on simplifie son code. Es-tu certain de la ligne qui provoque l'erreur ? (tu n'as pas dis plus haut avoir mis la ligne en commentaire pour confirmer que cela fonctionne).
Heredoc ? Pourquoi ? Tu fais juste une concaténation d'une chaîne de caractères et d'une variable. C'est une des choses les plus simples en programmation à faire; nul besoin de compliquer la chose en utilisant des heredoc.
Commente et simplifie et tu trouveras assez vite où était l'erreur.
Bonne journée.
Dans mon post #9 de cette discussion, j'ai bien précisé au n°5 de mes réponses que j'avais pratiqué une documentation de toutes mes ignes puis relâché progressivement pour comprendre quelle instruction de mon script générait l'erreur.
Et j'ai montré cette instruction (tentative d'écriture d'une ligne dans le sitemap.xml).
ps: je ne suis jamais irrespectueux sur ce forum. Je t'invite à vérifier les nombreux posts et les aides que l'ai pu apporter moi-même sur ce forum
Laisser un commentaire:
-
Le visiteur a réponduEnvoyé par lomart Voir le messageBonjour,
Pourquoi tant d'agressivité. Manu ne l'a jamais été.
Quand j'ai un problème de ce type, je simplifie ou j'éclate mon code pour isoler le problème.
J'ai un doute sur la forme d'une chaîne, je la remplace par une autre forme.
Je doute que mon serveur accepte les chaines heredoc (et non herecode), je la remplace pour tester
Devant ce genre de souci, un développeur est seul devant son code dans son environnement
Je ne pense pas être agressif, mais peut-être un peu susceptible ! Je n'aime pas être pris pour un idiot, voire même un maladroit. Je pense être appliqué et réfléchi, tout au moins je m'y efforce.
Il n'est pas interdit à quiconque d'être respectueux d'autrui. Bien au contraire.
Quand je réponds à des demandes sur ce forum, je m'interdis tout jugement de valeur sur le demandeur. Simple politesse.
Je partage tout à fait vos conseils de développeur. Et j'en applique tout autant. Croyez-moi, depuis que je suis tombé sur cette erreur, je n'ai de cesse de tenter d'autres écritures, d'éclater mon code, etc...
Quant à cette réflexion sur la "notion heredoc", elle n'émane pas de moi (j'en ignorais l'existence) mais d'un spécialiste php. Je l'ai rapporté tel quel ici (merci pour le correctif "heredoc" et non "herecode" comme il me l'avait écrit). Je n'ai jamais utilisé de telles écritures.
Laisser un commentaire:
-
Bonjour
Visiteur merci de veiller à respecter tes interlocuteurs. Je ne vois aucune agressivité dans les messages de Manu. La seule personne qui a fait montre de sentiments peu collégial, c'est toi.
Si tu veux recevoir de l'aide, le respect de l'autre est déjà un bon point de départ.
Pour ton problème, je rejoins Loïc : à un moment donné, on simplifie son code. Es-tu certain de la ligne qui provoque l'erreur ? (tu n'as pas dis plus haut avoir mis la ligne en commentaire pour confirmer que cela fonctionne).
Heredoc ? Pourquoi ? Tu fais juste une concaténation d'une chaîne de caractères et d'une variable. C'est une des choses les plus simples en programmation à faire; nul besoin de compliquer la chose en utilisant des heredoc.
Commente et simplifie et tu trouveras assez vite où était l'erreur.
Bonne journée.
Laisser un commentaire:
-
Bonjour,
Pourquoi tant d'agressivité. Manu ne l'a jamais été.
Quand j'ai un problème de ce type, je simplifie ou j'éclate mon code pour isoler le problème.
J'ai un doute sur la forme d'une chaîne, je la remplace par une autre forme.
Je doute que mon serveur accepte les chaines heredoc (et non herecode), je la remplace pour tester
Devant ce genre de souci, un développeur est seul devant son code dans son environnement
Laisser un commentaire:
-
Le visiteur a réponduVoici ce qu'un spécialiste du langage php m'a conseillé d'écrire en lieu et place de mon instruction bloquante :
Code PHP:$site = SITE; $xml = <<<xml <?xml version="1.0" encoding="utf-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap> <loc>{$site}/sitemaps/sitemap.xml</loc> </sitemap> xml; file_put_contents('sitemaps/sitemap-index.xml', $xml);
--> 0 - syntax error, unexpected '<<' (T_SL)
D'après ce spécialiste, la version de php fournie par mon hébergeur O2switch -cf. 7.2.25- n'autoriserait pas l'utilisation de la notation herecode (celle qui permet l'écriture de "<<<xml").
Je viens donc de soumettre cette remarque à mon hébergeur, et j'attends sa réponse.
Laisser un commentaire:
-
Le visiteur a répondu@ manu93fr,
Je t'ai fait remarquer que nos 2 posts se sont croisés et que cette réponse de ma part " ... que de bavardage pour ne rien dire ..." a été écrite avant de recevoir tes derniers conseils. Merci donc de bien vouloir en tenir compte.
Mais c'est très bien ainsi, tu as raison et ne perds pas de temps à intervenir ainsi dans mes demandes d'aide.
Ceci ne fait que confirmer ce que je pense de toi : tu as un fichu caractère. Tes interventions semblent signées d'un garde chiourme au fond d'une prison, et non d'un modérateur de l'open source !
Laisser un commentaire:
-
Envoyé par lendrevi Voir le message@ manu93fr,
Que de bavardage pour ne rien dire. Peut-être que l'on peut passer au fond de mon problème puisque tu dis m'aider.
Ai-je bien répondu à tes questions ? Cela me semble plus important.
ps: tu as vu ... j'ai mis un smiley ... donc pas agressif ...
Laisser un commentaire:
-
Le visiteur a répondu@ manu93fr,
Que de bavardage pour ne rien dire. Peut-être que l'on peut passer au fond de mon problème puisque tu dis m'aider.
Ai-je bien répondu à tes questions ? Cela me semble plus important.
ps: ce post vient de se croiser avec ta réponse de 16h11 : merci donc.
Oui, ma requête mysql fonctionne bien et me sélectionne les lignes attendues (je l'ai également vérifié en mode "phpmyadmin" en direct sur ma bdd).
Et par ailleurs, l'erreur intervient avant d'entrer dans la boucle de traitement de la variable $resultat.
Quand à mettre des accolades autour de "break" :
1. ce serait l'écriture standard d'un "if",
2. mais on peut l'écrire en abrégé comme je l'ai fait, quand on n'a pas besoin de gérer le "else". Ce qui est le cas ici.Dernière édition par Visiteur à 22/12/2019, 16h32
Laisser un commentaire:
-
Envoyé par lendrevi Voir le messageÀ toutes fins utiles, et suivant le desiderata de manu93fr, voici le script complet qui dysfonctionne :
Code PHP:{source}
<?php
$conn = mysqli_connect('... mes données personnelles de connexion à la BDD...');
$req = "SELECT nom, prenom, profession, specialite, code_profession, b5, mode_exercice, cp_ville, a3 FROM table WHERE ((cp_ville > ' ') AND (a3 = 'C') AND !((code_profession = '60') AND (b5 = 'S')) OR (code_profession = '86') OR (code_profession = '50') OR (code_profession = '21') OR (code_profession = '28') OR (code_profession = '98'))";
$resultat = $conn->query("SET NAMES utf8");
$resultat = $conn->query($req) or die('Erreur SQL !'. $req .'' . $conn->connect_error());
$num = 0;
$nb = 1;
$nbt = 1;
define ("SITE", "... url de mon site ...");
$traitement = true;
if ( file_exists('sitemaps/sitemap-1.xml') ) {
if( @unlink('sitemaps/sitemap-*') !== true ) {
$traitement = false;
}
}
if ($traitement) {
// préparation du fichier "sitemap-index.xml"
$xml1 = fopen('sitemaps/sitemap-index.xml',"w");
$lachaine = "<?xml version='1.0' encoding='UTF-8'?>\n" .
"<sitemapindex xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n" .
"<sitemap>\n" .
"<loc>" . SITE . "/sitemaps/sitemap.xml</loc>\n" .
"</sitemap>\n";
fwrite($xml1, $lachaine);
while($arr = mysqli_fetch_array($resultat)) {
if ($nb == 1) {
// on crée un nouveau fichier sitemap-x.xml
$num = $num + 1;
$fich = 'sitemaps/sitemap-' .$num. '.xml';
echo "<br />création du fichier $fich ";
$xml2 = fopen($fich, 'w');
$lachaine = "<?xml version='1.0' encoding='UTF-8'?>\n" .
"<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'\n" .
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" .
" xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9'\n" .
" 'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>\n";
fwrite ($xml2, $lachaine);
// on complète le fichier sitemap index
$lachaine = "<sitemap>\n<loc>" . SITE . "/sitemaps/sitemap-" .$num. ".xml</loc>\n</sitemap>\n";
fwrite($xml1, $lachaine);
}
// on complète le fichier sitemap-x.xml
if ($arr[3] == '') {
$spec = trim($arr[2]);
}else{
$spec = trim($arr[3]);
}
// on supprime le code postal devant le nom de ville pour ne conserver que le seul nom de ville
$ville = trim(substr($arr[7],7));
$ville2 = strtoupper($ville);
$pos = strpos($ville2, "CEDEX");
if ($pos === false) {
// cette ville n'est pas suivie du Cedex
$vil = $ville;
}else{
// on va supprimer 'CEDEX ...' après le nom de ville
$ll = strlen($ville) - $pos;
$vil = substr($ville, -$ll);
}
$prat = trim($arr[1]). '-' .trim($arr[0]);
$lachaine = "<url>\n<loc>" . SITE . "/" .$spec. "/" .$vil. "/" .$prat. "</loc>\n</url>\n";
fwrite($xml2, $lachaine);
$nb = $nb + 1;
$nbt = $nbt + 1;
if ($nb > 10) {
// pour les tests (mettre 1000 ensuite dans le if au lieu de 10)
$lachaine = "</urlset>\n";
fwrite($xml2, $lachaine);
fclose($xml2);
$nb = 1;
}
// on se contente des 25 premières lignes de la table pour les tests (if à enlever ensuite)
if ($nbt > 25) break;
}
// fin du traitement
$lachaine = "</urlset>\n";
fwrite($xml2, $lachaine);
fclose($xml2);
$lachaine = "</sitemapindex>\n";
fwrite($xml1, $lachaine);
fclose($xml1);
}else{
echo "<br />Les fichiers de travail 'sitemaps/sitemap-*.xml' ne peuvent pas être effacés (traitement impossible) !";
}
mysqli_close($conn);
?>
<br /><br /><p>FIN du TRAITEMENT</p>
<p class="droite"><a href="">Retour à la page d'accueil</a></p>
{/source}
je n'ai pas essayé de comprendre ton code dans les détails .... mais j'ai un doute sur la requête ... as tu vérifié qu'elle renvoyait bien quelque chose car tu ne fais pas ce controle en sortie
Voila .. ma ptite contribution a ton problème ... ne m'en demande pas plus
Bon dimanche !
Dernière édition par manu93fr à 22/12/2019, 16h11
Laisser un commentaire:
-
J'apprécie ton aide, même si pour la forme j'apprécierais moins d'agressivité et ne pas être toujours pris pour une 'bille' sur un ton professoral. Il n'est nullement interdit de rester courtois, amical, même dans le dévouement gratuit.
Je te pose juste des questions pour comprendre .... mais bon ...
Sans vouloir me vanter, j'ai de longues années d'expérience derrière moi et en informatique....
Pourquoi écrire "... si personne ne peut t'aider ..." alors que j'ai déjà apprécié et remercié par exemple ici les aides qualifiées de dolmenhir & lomart, et ô combien de daneel ? Je ne me plains pas, bien au contraire, et je continue à rechercher la solution finale ne serait-ce que par satisfaction intellectuelle et personnelle.
Laisser un commentaire:
-
Le visiteur a réponduEnvoyé par jfque Voir le messagePour information, la version Pro de JSitemap permet de créer des sitemaps à partir de requêtes MySQL que l'utilisateur peut construire "sur mesure". Je n'ai jamais utilisé mais ça a l'air très puissant.
Mais si je rencontre un problème dans l'écriture du script, ce n'est pas dans la requête Mysql fort simple à partir de ma table de BDD. C'est tout bêtement quand je lance l'écriture d'une ligne dans un fichier de type sitemp.xml.
Nombre de "spécialistes php" m'avouent ne pas comprendre pourquoi cette erreur !
Bon dimanche !
Laisser un commentaire:
Annonce
Réduire
Aucune annonce pour le moment.
Laisser un commentaire: