Les avertissements suivants se sont produits : | |||||||||||||||
Warning [2] Undefined property: MyLanguage::$archive_pages - Line: 2 - File: printthread.php(287) : eval()'d code PHP 8.2.18 (Linux)
|
[Resolu] Pb avec une requette SQL sur les tables du module news - Version imprimable +- Forum CMS Made Simple FR (https://forum.cmsmadesimple.fr) +-- Forum : Général (https://forum.cmsmadesimple.fr/forum-3.html) +--- Forum : Modules, Tags (https://forum.cmsmadesimple.fr/forum-14.html) +--- Sujet : [Resolu] Pb avec une requette SQL sur les tables du module news (/thread-675.html) Pages :
1
2
|
[Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 04/10/2010 Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~ Bonjour à tous, J'ai utilisé le tuto de Jean Le Chauve sur l'utilisation de select pour récupérer des infos dans la base de données. J'ai donc créé 2 balises utilisateur pour rechercher des infos sur les tables du module FEU et tout fonctionne bien. Je me suis enhardi pour travailler avec les tables du module news. En fait j'utilise le module News pour poster des tâches à accomplir. Pour cela j'ai donc ajouté 2 champs texte aux news, l'un pour décrire l'action et l'autre pour la prévision de réalisation (ce n'est forcement une date). Ces tâches font partie d'une catégorie de News à laquelle j'ai ajouté des sous-catégories. Voila pour le contexte. Donc ma balise doit me produire un planning de travail sous forme de tableau. Cela fonctionne sauf que je n'arrive pas à relire les 2champs que j'ai rajoutés et compte tenu de ce que j'ai écrit je ne vois pas pourquoi cela ne fonctionne pas. Voici le code : Code : "echo '<table id="planning" align="center" cellspacing="2">'; Si vous avez des idées ??? je suis preneur, merci d'avance Alain [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 04/10/2010 je résume 1/ la première boucle t'as récupéré la liste des catégories ayant pour parent la n°7 2/ ensuite tu boucle pour récupérer chaque news ayant en catégorie l'une des catégories précédemment trouvées 3/ ensuite tu pioches le nom de l'auteur de la news précédemment récupérée 4/ enfin tu pioches tes deux champs complémentaires lié à la news précédemment récupérée Alors je ne sais pas forcement pourquoi ca merde dans ton cas vu que "rapidement" là comme ca, ca me parait correct, mais par contre ce que je peux te dire en tant que gros consommateur de requête SQL c'est que tu as mal choisit ton algorithme. Explication et petit cours rapide d'SQL Chaque requête prend un certain temps à exécuter. temps d'exécution total = temps fixe d'initialisation de la requête + temps du à la complexité de la requête + temps du à la quantité de donnée remontée depuis la base (genre 2 513 155 lignes sur 42 colonnes ) dans ton cas on prend un exemple de production 50 news dans 4 catégories, ayant 6 auteurs différents et ayant tous +/- tes 2 champs complémentaires renseigné. combien de requête ca nous fait ? 1/ 1 pour les catégories (4 lignes remontées en tout) 2/ + 4 pour la liste des news (50 lignes remontées en tout) 3/ + 50 pour la liste des auteurs 4/ + 50 pour la liste des éléments complémentaires soit 1+4+50+50 = 106 requêtes sql pour afficher les infos de 50 news la suite de mon post dans un second message [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 04/10/2010 tu auras compris qu'il y a un sérieux soucis de performance avec ton système donc par habitude prend toujours soins de NE PAS faire de requêtes SQL dans une boucle. alors comment qu'on fait ??? SQL (mysql / oracle / postgresql / ...) implémente un système de liaison inter-table que l'on appel l'Union et ca fait sa force (oui l'union fait la force c'est bien connu) Je t'invites évidement à lire la documentation là dessus mais en synthétique pour ton cas présent... et sans avoir testé que dalle de mon côté ... je te proposerais ce code SQL Attention : pour des soucis de lisibilité de code j'utilise les notions de pseudonyme de table Citation :SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6 en rouge le principe d'Union qui sera sans doute à peaufiner pour intégrer les news n'ayant aucune info côté valeur complémentaire pour mémoire, tes propres requêtes Citation :SELECT news_category_id, news_category_name FROM as1_module_news_categories WHERE parent_id = 7 ORDER BY hierarchy Alors il y a aucune chance que ma requête fonctionne du premier coup hein ^^ mais tu peux y trouver une bonne source pour ensuite l'adapter à ton besoin et surtout supprimer un maximum de code et optimiser ton algo : 1 requête, certes plus complexe, qui renvois 50 lignes, et c'est tout ! Cette requête tu vas la lire, la comprendre et la tester dans un phpmyadmin avant de l'intégrer dans PHP. Si tu as un soucis, préviens moi, je ferrais ce que je peux pour la corriger [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 04/10/2010 Merci Bess pour ce cours accéléré de SQL..... et pour les corrections online.. Je vais tester cela et je te tiens au courant. A+ Alain [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 04/10/2010 je te propose une version complètement en Union avec la même méthode Citation :SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6 C'est normalement la même chose mais en mieux présenté : d'un côté les unions et de l'autre les conditions. Une fois la requêtes sql approuvée il faudra que l'on parle de la portabilité de ton code [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 05/10/2010 Bonsoir Bess, J'ai testé la première requête, phpmyadmin me renvoie une erreur de syntaxe..... Par contre la seconde fonctionne sauf qu'elle ne ramène que des news qui ont des entrées dans la table news_fieldvals et une valeur NULL pour l'auteur de la news. J'ai essayé de changer l'ordre des lignes LEFT JOIN sans succès. Cela je peut peut-être le by passer avec une contrainte à la saisie de la news (à voir...), s'il n'y a pas de solution simple en sql. Par contre tu m'inquiète avec la notion de portabilité du code. Quels pb futurs se cachent derrière cela ? [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 05/10/2010 Citation :une valeur NULL pour l'auteur de la news erreur de ma part Citation :SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6 ca t'aurais pu le trouver seul je pense j'essayais de lier les tables avec un id d'un côté et un pseudo de l'autre Concernant l'autre problème je m'y attendais. Je regarde pour corriger ce point. Constate déjà si ma solution est bonne ou pas [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 05/10/2010 Citation :SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6 tente ce code.. mais sans bdd appropriée j'ai du mal à faire de telle spéculation :/ envoi moi par email le script de création + insert des données pour toutes ces tables, je pourrais tester de mon côté également qu'on évite d'y passer 3 jours. Citation :Par contre tu m'inquiète avec la notion de portabilité du code. Quels pb futurs se cachent derrière cela ? rien de long, mais peut être chiant lorsque tu tenteras de réutiliser le code ailleurs on en parle à la fin. [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 06/10/2010 Merci Bess, cette nouvelle requête fonctionne bien, j'ai toutes les news de la categorie avec leur champs complémentaires respectifs même de valeur NULL. J'ai donc mis en œuvre cette requête dans ma balise utilisateur, et là je me heurte au problème de récupération des données lorsqu'elles se trouvent dans le tableau $dbretour. J'ai essayer une boucle foreach ($dbretour as $ligne) avce ce code: "Foreach ($dbretour as $ligne) { $resultChamps1 = $ligne->fields['news_category_name']; $resultChamps2 = $ligne->fields['news_title']; $resultChamps3 = $ligne->fields['news_date']; $resultChamps4 = $ligne->fields['username']; $resultChamps5 = $ligne->fields['champs5']; $resultChamps6 = $ligne->fields['champs6']; echo <<<REQUETE <tr> <td class="leftcol">{$resultChamps1}</td> <td class="datadesc">{$resultChamps2}</td> <td class="data">{$resultChamps3}</td> <td class="data">{$resultChamps4}</td> <td class="data">{$resultChamps5}</td> <td class="data">{$resultChamps6}</td> </tr> REQUETE; }" et cela ne fonctionne pas le tableau affiché dans ma page est vide. J'ai également essayé de référencer les champ de $ligne par un numéro pour le même résultat. C'est rageant de buter sur la lecture et l'affichage d'un tableau ... [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 06/10/2010 Bon passons à l'étape 2 de ce live-tuto il y a deux cas de figure que je rencontre Select [1 seule valeur, comme un compteur par exemple] from table Select [valeur1 valeur2, valeur3, ...] from table dans le premier cas je te conseil le code suivant Code : $compteur= $db->getOne($query); dans le second, je te préconnise cette façon de coder car très peu de ligne de code = moins d'erreur Code : $resultat = $db->execute($query); oublie donc ton foreach et les accès en ->move et ->close qui sont d'autant de possibilité pour insérer un bug [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 07/10/2010 Bon ok, voila autre chose : "{/* faire code de geste de l'erreur */}" Donc j'ai cherché sur le net ce que je pouvais écrire comme code à cet endroit et j'ai trouvé ceci : "print_r($db-errorinfo());" Seulement quand je teste, le système me renvoi : "Fatal error: Call to undefined method pear_ADOConnection::errorInfo() in C:\wamp\www\randokerlouan\lib\content.functions.php(976) : eval()'d code on line 20" Voila le code : Code : global $gCms; //pour pouvoir travailler avec les objets, classes et méthodes du cms Pour la 2ème requête et l'affichage, j'ai écris ceci : Code : query = "SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6 [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 07/10/2010 prend l'habitude d'entourer ton code des balises [ code ] ou [ quote ] dans le forum afin d'aider à lire pour la gestion des erreurs tu t'emmerdes pas, fait simple : Citation :global $gCms; //pour pouvoir travailler avec les objets, classes et méthodes du cms Citation :query = "SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6 En vert : la gestion simplifiée des erreurs : ca évite de tracer à la vue de tous les erreurs SQL bien trop souvent source d'exploitation de failles de sécu type SQL-injection car elles affichent par exemple les noms des tables, pas bon) En rouge : pas bon ou pas utile : à supprimer En bleu : corrections ! [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 07/10/2010 Yes! Cela fonctionne .... Un grand merci Bess pour ton aide. Il n'y a qu'une chose que je n'ai pas pu corrigé dans ce que tu ma donné c'est : echo <<<REQUETE <tr> <td class="leftcol">{$row['news_category_name']}</td> <td class="datadesc">{$row['news_title']}</td> <td class="data">{$row['news_date']}</td> <td class="data">{$row['username']}</td> <td class="data">{$row['Champs5']}</td> <td class="data">{$row['Champs6']}</td> </tr> REQUETE; Dès que j'enlève les accolades entourant les variables, il me renvoi une "Parse error: expected T_Variables .... on line 46 " Si non tout va bien cela fonctionne très bien. Maintenant si on parlait de portabilité de ce code? [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 07/10/2010 Je viens d'essayer de mettre les balises [ code ] mais il me jette ?? comprends pas [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 07/10/2010 [ code ] et [ /code ] sans les espaces XD Citation : Dès que j'enlève les accolades entourant les variables, il me renvoi une "Parse error: expected T_Variables .... on line 46 " Si non tout va bien cela fonctionne très bien. ben laisse alors c'est moi qui me suis planté. concernant la portabilité : comment faire pour que ton code qui fonctionne sous ton installation, fonctionne également sur une installation Tiers en faisant un minimum de modif. En l' occurrence ici tu spécifie le préfixe de tes tables, or chez moi le préfixe c'est cms_NomDeLaTable donc un copier/coller fonctionnera jamais tel quel :/ CMSMS te propose une fonction qui va palier au pb : c'est la fonction cms_db_prefix() qui va nous aider Citation :global $gCms; //pour pouvoir travailler avec les objets, classes et méthodes du cms [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 07/10/2010 Ok, j'ai introduit cette fonction dans mon code et cela fonctionne nickel.. Merci Bess, je m'attendais à beaucoup complexe. Pour info, j'ai rejouté une condition WHERE dans mes 2 requêtes, je ne prend que les news dont le end_time est NULL... c'est cool. Avant de marquer comme résolu ce poste, j'ai une petite chose à te demander : dans le tableau que je sort, la date de la news est au format : 2010-10-01 15:45:19. Y a-t'il un moyen simple d'en extraire que la date au format JJ-MM-SSAA ? une fonction cms par hasard (ou peut-être)? [Resolu] Pb avec une requette SQL sur les tables du module news - Jean le Chauve - 07/10/2010 Accolades pour les variables : parce que vous êtes dans la syntaxe heredoc. Date : voir smarty http://www.smarty.net/manual/fr/language.modifier.date.format.php {$taDate|date_format:"%A, %B %Y"} Merci Bess, tu as encore réalisé un beau tuto [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 07/10/2010 Citation :Accolades pour les variables : parce que vous êtes dans la syntaxe heredoc. bon a savoir pour la date, Jean le Chauve à parfaitement répondu, je pense que t'es SQL-ready maintenant je pense pourquoi pas reprendre et synthétiser ce topic pour en faire effectivement un tuto ... je regarde ca dans la semaine. AG1111, ca te dérangerais ou pas ? [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 08/10/2010 Merci à tous les 2 pour vos réponses. En effet Bess je pense que je suis sql-ready maintenant et ce grace à toi. Citation :AG1111, ca te dérangerais ou pas ?Je ne vois pas ce que tu veux dire. Que tu utilises une synthèse de ce poste pour faire un tuto je suis totalement pour bien sur, nous sommes là pour partager nos connaissances et nos idées. De plus l'aspect pédagogique de ta démarche dans les réponses que tu m'as apportées est vraiment top, donc en faire bénéficier la communauté c'est que du bonheur. Comme je suis toujours un peu boulet, j'ai testé le format date de Jean le Chauve. Là encore j'ai un soucis de parse error à priori c'est le pipe qu'il ne reconnaît pas. Voici le code : Code : while ($row = $dbretour->FetchRow()) j'ai pourtant lu la page date_format du site Smarty .... [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 08/10/2010 HOUAAA!!!!... tu as vu, j'ai réussi à écrire comme vous dans le forum. Je vais finir par croire que le progresse [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 08/10/2010 il y a confusion pour nous 3 on confond l'utilisation de smarty et la syntaxe heredoc qui utilise tous les deux { et } donc là on demande dans de l'heredoc une balise smarty ... forcément ca risque pas de passer... il faudrait remplacer Code : {$date|date_format:"%D"} par sont équivalent php j'ai rien sous la main, je dois filer du taff, mais recherche fonction formatage Date PHP et tu trouveras rapidement PS : GG pour le [ code ], va sérieusement falloir que je penses à vous préparer des diplômes papier pour les envoyer moi [Resolu] Pb avec une requette SQL sur les tables du module news - Jean le Chauve - 08/10/2010 http://php.net/manual/fr/function.date.php date("A B Y", $date) [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 09/10/2010 Merci à tous les 2 pour vos réponse. J'ai testé le code Jean le Chauve comme ceci : Code : $dbdate = $row['news_date']; Code : $dbdate = $row['news_date']; Citation :Warning: date() expects parameter 2 to be long, object given in C:\wamp\www\randokerlouan\lib\content.functions.php(976) : eval()'d code on line 49 Bon à ce niveau je coince.....? [Resolu] Pb avec une requette SQL sur les tables du module news - bess - 09/10/2010 les dates sous la bdd de cmsms sont transformable en date php de cette manière Code : /** C'est un vieux code que j'utilise et qui fonctionne, je peux pas t'assurer qu'il soit parfait, moins même je le trouve archi-lourd, mais il fonctionne... il te reste à le caler dans ton code et a faire appel à la fonction Code : $dbdate = _dbToDate($row['news_date']); [Resolu] Pb avec une requette SQL sur les tables du module news - AG1111 - 09/10/2010 Un vieux code mais qui fonctionne bien. Bon ce coup là je pense que j'ai résolu mes problèmes du moment. Mille fois merci pour ton aide efficace et merci à la communauté cms d'exister. Je modifie le premier poste et à bientôt pour d'autres aventures. Amicalement Alain |