Sujet fermé
Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

[Resolu] Pb avec une requette SQL sur les tables du module news
#1

Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS: 1.8.1
#~ Nom de l'hébergeur : local
#~ Informations Système :
#~ ----------------------------------------------
#~ Cms Version: 1.8.2
#~ Installed Modules:
#~ * CMSMailer: 2.0
#~ * FileManager: 1.0.2
#~ * MenuManager: 1.6.5
#~ * ModuleManager: 1.4
#~ * News: 2.10.6
#~ * nuSOAP: 1.0.2
#~ * Printing: 1.1.0
#~ * Search: 1.6.5
#~ * ThemeManager: 1.1.1
#~ * TinyMCE: 2.7.2
#~ * Album: 0.9.3
#~ * DownCnt: 1.0.0
#~ * FormBuilder: 0.6.4
#~ * Captcha: 0.4.2
#~ * CGExtensions: 1.19.6
#~ * FrontEndUsers: 1.12
#~ * CustomContent: 1.7.3
#~ * Statistics: 1.0.1
#~ * CGUserDirectory: 1.2.4
#~ Config Information:
#~ * php_memory_limit:
#~ * process_whole_template: false
#~ * output_compression: false
#~ * max_upload_size: 10000000
#~ * default_upload_permission: 664
#~ * url_rewriting: mod_rewrite
#~ * page_extension: .html
#~ * query_var: page
#~ * use_hierarchy: true
#~ * image_manipulation_prog: GD
#~ * auto_alias_content: true
#~ * locale:
#~ * default_encoding: utf-8
#~ * admin_encoding: utf-8
#~ * set_names: true
#~ Php Information:
#~ * phpversion: 5.3.0
#~ * md5_function: On (Vrai)
#~ * gd_version: 2
#~ * tempnam_function: On (Vrai)
#~ * magic_quotes_runtime: Off (Faux)
#~ * E_STRICT: 0
#~ * E_DEPRECATED: 0
#~ * memory_limit: 128M
#~ * max_execution_time: 60
#~ * output_buffering: 1
#~ * safe_mode: Off (Faux)
#~ * file_uploads: On (Vrai)
#~ * post_max_size: 10M
#~ * upload_max_filesize: 10M
#~ * session_save_path: c:/wamp/tmp (0777)
#~ * session_use_cookies: On (Vrai)
#~ * xml_function: On (Vrai)
#~ Server Information:
#~ * Server Api: apache2handler
#~ * Server Db Type: MySQL (mysql)
#~ * Server Db Version: 5.1.36
#~ ----------------------------------------------
#~~~~~ 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">';
echo '<thead><tr class="toprow">';
echo '<table id="planning" align="center" cellspacing="2">';
echo '<thead><tr class="toprow">';
echo '<th>Tâche</th>';
echo "<th>Description</th>";
echo "<th>Postée le</th>";
echo "<th>Postée par</th>";
echo "<th>Action</th>";
echo "<th>Prévue le</th>";
echo "</tr></thead>";
global $gCms; //pour pouvoir travailler avec les objets, classes et méthodes du cms
$db = &$gCms->GetDb(); //connection à la bd cms, recherche de la catégorie Travail et de sa filiation
$query = "SELECT news_category_id, news_category_name FROM as1_module_news_categories WHERE parent_id = 7 ORDER BY hierarchy ";
$dbretour = &$db->Execute($query);//exécution de la requête
    while ($dbretour && !$dbretour->EOF)
    {
        $CodeCategory = $dbretour->fields['news_category_id'];
        $resultChamps1 =  $dbretour->fields['news_category_name'];//recherche des news de la category
    $query = "SELECT news_id, news_title, news_date, author_id FROM as1_module_news WHERE news_category_id = '$CodeCategory' ORDER BY news_date ";
    $dbresult = &$db->Execute($query);//exécution de la requête
        while ($dbresult && !$dbresult->EOF)
        {
                    $resultChamps2 = $dbresult->fields['news_title'];
                    $resultChamps3 = $dbresult->fields['news_date'];
                    $CodeAuteur = $dbresult->fields['author_id'];
                    $CodeNews = $dbresult->fields['news_id'];// recherche du nom de l'auteur de la news
                    $query = "SELECT username FROM as1_users WHERE user_id = '$CodeAuteur' ";
                    $dbtoto = &$db->Execute($query);//exécution de la requête
                         $resultChamps4 = $dbtoto->fields['username']; // recherche des 2 autres champs
                         $query = "SELECT fielddef_id, value FROM as1_module_news_fieldvals WHERE
news_id = '$CodeNews' SORTED BY fielddef_id ";
                       $dbresultat = &$db->Execute($query); //exécution de la requête
                       $codechamp = $dbresultat->fields['fielddef_id'];
                    while ($dbresultat && !$dbresultat->EOF)
                    {
                                                $resultChamps5;
                                                $resultChamps6;
                        if ($dbresultat->fields['fielddef_id'] == 1)
                        {
                            $resultChamps5 = $dbresultat->fields['value'];
                        }    
                        elseif ($dbresultat->fields['fielddef_id'] == 3)
                        {
                            $resultChamps6 = $dbresultat->fields['value'];
                        }
                    $dbresultat->MoveNext();// enregistrement suivant    
                    }// tous les champs sont remplis on affiche la ligne
    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;
        $dbresult->MoveNext();//enregistrement suivant
        }//Toutes les news de la categorie ont été lues
    $dbretour->MoveNext();// catégorie suivante
    }
if ($dbretour) $dbretour->Close();//Toutes les news de toutes les catégories sont lues, on ferme la connection
echo "</table>";
"
Je soupçonne une chose que je ne sais pas gérer, c'est le fait qu'il est possible que pour une News, il n'y ai pas d'entrées dans la table des champs supplémentaires. J'ai cherché dans la doc SQL mysql ect.. et je ne m'en sors pas, mes compétences en SQL sont trop limitées.

Si vous avez des idées ??? je suis preneur, merci d'avance

Alain
#2

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 Smile )

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 Wink

la suite de mon post dans un second message
#3

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
FROM
as1_module_news_categories c,
as1_module_news n
LEFT JOIN as1_module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN as1_module_news_fieldvals f2 ON f2.news_id = n.news_id,
as1_users u,
WHERE
c.parent_id = 7
AND f1.fielddef_id = 1
AND f2.fielddef_id = 3
AND c.news_category_id = n.news_category_id
AND u.username = n.author_id
ORDER BY
c.hierarchy ASC, n.news_date ASC

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
SELECT news_id, news_title, news_date, author_id FROM as1_module_news WHERE news_category_id = '$CodeCategory' ORDER BY news_date
SELECT username FROM as1_users WHERE user_id = '$CodeAuteur
SELECT fielddef_id, value FROM as1_module_news_fieldvals WHERE news_id = '$CodeNews' SORTED BY fielddef_id

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 Smile
#4

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
#5

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
FROM
as1_module_news n
LEFT JOIN as1_module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN as1_module_news_fieldvals f2 ON f2.news_id = n.news_id
LEFT JOIN as1_module_news_categories c ON c.news_category_id = n.news_category_id
LEFT JOIN as1_users u ON u.username = n.author_id
WHERE
c.parent_id = 7
AND f1.fielddef_id = 1
AND f2.fielddef_id = 3
ORDER BY
c.hierarchy ASC, n.news_date ASC

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 Smile
#6

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 ?
#7

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
FROM
as1_module_news n
LEFT JOIN as1_module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN as1_module_news_fieldvals f2 ON f2.news_id = n.news_id
LEFT JOIN as1_module_news_categories c ON c.news_category_id = n.news_category_id
LEFT JOIN as1_users u ON u.user_id = n.author_id
WHERE
c.parent_id = 7
AND f1.fielddef_id = 1
AND f2.fielddef_id = 3
ORDER BY
c.hierarchy ASC, n.news_date ASC

ca t'aurais pu le trouver seul je pense Wink 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
#8

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
FROM
as1_module_news n
LEFT JOIN as1_module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN as1_module_news_fieldvals f2 ON f2.news_id = n.news_id
LEFT JOIN as1_module_news_categories c ON c.news_category_id = n.news_category_id
LEFT JOIN as1_users u ON u.user_id = n.author_id
WHERE
c.parent_id = 7
AND (f1.fielddef_id = 1 OR f1.fielddef_id is null)
AND (f2.fielddef_id = 3 OR f2.fielddef_id is null)
ORDER BY
c.hierarchy ASC, n.news_date ASC

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 Smile on en parle à la fin.
#9

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 ...
#10

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);
if($compteur=== false) {/* faire code de gestion de l'erreur */}
echo "il y a ".$compteur." résultats en base";
tu peux utiliser $compteur directement

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);
if($resultat === false) {/* faire code de gestion de l'erreur */}
while ($row = $result->FetchRow()))
{
   echo "valeur1 =". $row['valeur1'];
   echo "valeur2 =". $row['valeur2'];
   echo "valeur3 =". $row['valeur3'];
}
court et efficace non ? Smile

oublie donc ton foreach et les accès en ->move et ->close qui sont d'autant de possibilité pour insérer un bug Smile
#11

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
$db = &$gCms->GetDb(); //connection à la bd cms, recherche de la catégorie Travail et de sa filiation
$query =" SELECT COUNT* as Compteur
          FROM as1_module_news n
                LEFT JOIN as1_module_news_categories c ON c.news_category_id = n.news_category_id
          WHERE
                c.parent_id = 7
          ORDER BY
                c.hierarchy ASC, n.news_date ASC";
$compteur= $db->getOne($query);
if($compteur=== false) {print_r($db->errorInfo());}
echo "il y a ".$compteur." résultats en base";"

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
          FROM
            as1_module_news n
                LEFT JOIN as1_module_news_fieldvals f1 ON f1.news_id = n.news_id
                LEFT JOIN as1_module_news_fieldvals f2 ON f2.news_id = n.news_id
                LEFT JOIN as1_module_news_categories c ON c.news_category_id = n.news_category_id
                LEFT JOIN as1_users u ON u.user_id  = n.author_id
          WHERE
            c.parent_id = 7
            AND (f1.fielddef_id = 1 OR f1.fielddef_id is null)
            AND (f2.fielddef_id = 3 OR f2.fielddef_id is null)
          ORDER BY
            c.hierarchy ASC, n.news_date ASC";
$dbretour = &$db->Execute($query);//exécution de la requête
if($dbretour === false)
    {
    print_r($db->errorInfo());
    }
    while ($row = $dbretour->FetchRow())
   {
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;
    }
if ($dbretour) $dbretour->Close();//Toutes les news de toutes les catégories sont lues, on ferme la connection
echo "</table>";
que je sais pas si c'est correcte puisque je n'avance pas sur la gestion de l'erreur.
#12

prend l'habitude d'entourer ton code des balises [ code ] ou [ quote ] dans le forum afin d'aider à lire Wink

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
$db = &$gCms->GetDb(); //connection à la bd cms, recherche de la catégorie Travail et de sa filiation
$query =" SELECT COUNT(*) as Compteur
FROM as1_module_news n
LEFT JOIN as1_module_news_categories c ON c.news_category_id = n.news_category_id
WHERE
c.parent_id = 7
ORDER BY
c.hierarchy ASC, n.news_date ASC";
$compteur= $db->getOne($query);
if($compteur=== false) { echo "Erreur lors du comptage des lignes";exit();}
echo "il y a ".$compteur." résultats en base";

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
FROM
as1_module_news n
LEFT JOIN as1_module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN as1_module_news_fieldvals f2 ON f2.news_id = n.news_id
LEFT JOIN as1_module_news_categories c ON c.news_category_id = n.news_category_id
LEFT JOIN as1_users u ON u.user_id = n.author_id
WHERE
c.parent_id = 7
AND (f1.fielddef_id = 1 OR f1.fielddef_id is null)
AND (f2.fielddef_id = 3 OR f2.fielddef_id is null)
ORDER BY
c.hierarchy ASC, n.news_date ASC";
$dbretour = &$db->Execute($query);//exécution de la requête
if($dbretour === false) { echo "Erreur lors de la remontée des données";exit();}

while ($row = $dbretour->FetchRow())
{
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;
}
if ($dbretour) $dbretour->Close();//Toutes les news de toutes les catégories sont lues, on ferme la connection
echo "</table>";

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 !
#13

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?
#14

Je viens d'essayer de mettre les balises [ code ] mais il me jette ?? comprends pas
#15

[ 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
$db = &$gCms->GetDb(); //connection à la bd cms, recherche de la catégorie Travail et de sa filiation
$query =" SELECT COUNT(*) as Compteur
FROM ".cms_db_prefix()."module_news n
LEFT JOIN ".cms_db_prefix()."module_news_categories c ON c.news_category_id = n.news_category_id
WHERE
c.parent_id = 7
ORDER BY
c.hierarchy ASC, n.news_date ASC";
$compteur= $db->getOne($query);
if($compteur=== false) { echo "Erreur lors du comptage des lignes";exit();}
echo "il y a ".$compteur." résultats en base";
#16

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)?
#17

Accolades pour les variables : parce que vous êtes dans la syntaxe heredoc.
Date : voir smarty http://www.smarty.net/manual/fr/language...format.php
{$taDate|date_format:"%A, %B %Y"}

Merci Bess, tu as encore réalisé un beau tuto Smile
#18

Citation :Accolades pour les variables : parce que vous êtes dans la syntaxe heredoc.

bon a savoir Smile


pour la date, Jean le Chauve à parfaitement répondu, je pense que t'es SQL-ready maintenant Big Grin

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 ?
#19

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())
   {
    $date = $row['news_date'];
echo <<<REQUETE
    <tr>
    <td class="leftcol">{$row['news_category_name']}</td>
    <td class="datadesc">{$row['news_title']}</td>
    <td class="data">{$date|date_format:"%D"}</td>
    <td class="data">{$row['username']}</td>
    <td class="data">{$row['champs5']}</td>
    <td class="data">{$row['champs6']}</td>
    </tr>
REQUETE;
Sur la ligne du adte format, il me met qu'il espère une accolade ....?
j'ai pourtant lu la page date_format du site Smarty ....
#20

HOUAAA!!!!... tu as vu, j'ai réussi à écrire comme vous dans le forum. Je vais finir par croire que le progresse
#21

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 Smile

PS : GG pour le [ code ], va sérieusement falloir que je penses à vous préparer des diplômes papier pour les envoyer moi Big Grin
#22

http://php.net/manual/fr/function.date.php
date("A B Y", $date)
#23

Merci à tous les 2 pour vos réponse.

J'ai testé le code Jean le Chauve comme ceci :
Code :
$dbdate = $row['news_date'];
    $date = date("d m Y",$dbdate);
echo <<<REQUETE
    <tr>
    <td class="leftcol">{$row['news_category_name']}</td>
    <td class="datadesc">{$row['news_title']}</td>
    <td class="data">{$date}</td>
J'ai bien le format comme je voulais, par contre il ne m'affiche que la même date le 01 01 1970. J'en déduis qu'il ne comprends pas la valeur de la date issue de la base. J'ai également essayé d'utiliser le UNIX_TIME_STAMP de MySql, comme je l'ai lu dans le manuel php :
Code :
$dbdate = $row['news_date'];
    $quer = "SELECT UNIX_TIMESTAMP('$dbdate')";
    $tstamp = &$db->Execute($quer);
     if (ststamp === false) {echo "Erreur lors de la transformation du timestamp";exit();}
    $date = date("d m Y",$tstamp);// c'est la ligne 49
Là il me sort un Warning :
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.....?
#24

les dates sous la bdd de cmsms sont transformable en date php de cette manière

Code :
/**
    * Transforme la date issue de la base en une veritable date php
    **/
    function _dbToDate($stringDate)
    {
        return mktime(substr($stringDate, 11,2),
                    substr($stringDate, 14,2),
                    substr($stringDate, 17,2),
                    substr($stringDate, 5,2),
                    substr($stringDate, 8,2),
                    substr($stringDate, 0,4));
    }

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']);
#25

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
Sujet fermé


Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)