Aller au contenu

TheRec

Hubmaster
  • Compteur de contenus

    1 777
  • Inscrit(e) le

  • Dernière visite

Tout ce qui a été posté par TheRec

  1. TheRec

    Images intuitive

    C'est de cela dont je parlais... Ce ne sont pas des "hacks" se sont des commentaires conditionnels (la nuance est importante), enfin là n'est pas le sujet (le code produit pour Internet Explorer n'est plus sémantique). Le système de cache est une bonne idée et c'est facile à mettre en place, une autre idée serait de positionner le texte qui change (je suppose que c'est du texte, sinon la suite n'est pas réalisable, ou du moins ne sera pas aussi profitable que le système de cache) au dessus de l'image grâce au positionnement absolu, mais cela va s'avérer fastidieux si tu ne trouves pas un moyen de générer tes zones dans une boucle Par contre, le fait que tu aies besoin de zones "irrégulières" (qui ne sont pas carrées ou rectangulaires) sans recourir à un vrai "imagemap" (balise (x)HTML : <map>, <area>, <shape>, etc.), au vu des limitations de mise en forme, pose un problème... la seule solution que je connaisse n'est absolument pas sémantique et fastidieuse (pour une zone déjà) donc elle ne te conviendra pas. Bref, je ne vois pas réellement de solution en (x)HTML/CSS qui convienne à toutes tes exigences, désolé de ne pas pouvoir plus t'aider.
  2. TheRec

    Images intuitive

    En fait le code que tu cites c'est pour réaliser les arrondis des boîtes qui apparaissent, effectivement ce n'est pas sémantique, mais cet exemple n'est pas à prendre tel quel... "l'imagemap" à proprement parler est sémantique, il me semblait que c'était ce que tu cherchais Concernant le reste du code qui n'est pas très propre il peut être épuré si la compatibilité avec IE5.5 est négligée. Concernant le chargement des images supplémentaires, si tu as une autre technique fais-moi signe... je ne vois pas d'autres solution si tu veux appliquer un "effet graphique" (autre que changer le style de l'élément... car ce n'est certainement pas ce type de "surlignage" que tu recherches) à une image sans charger une autres image. Peut-être que si tu as tant de zones à gérer c'est que tu as une erreur de conception, ne peux tu pas décomposer ton problème en plusieurs sous problèmes ? Par exemple, si ton but est de présenter beaucoup de lieux sur une carte, tu peux commencer par une carte avec des régions, puis présenter les lieux pour la région sélectionnée. Finalement je ne vois pas l'intérêt de générer des images à chaque appel d'un script si elle ne changent pas d'un appel à l'autre... mais comme je ne connais pas les détails de ton implémentation mais à priori si tu dois fait générer ces images à chaque appel du script ce n'est pas la bonne solution, comme tu le dis au niveau des ressources et à plus forte raison au niveau du temps d'exécution
  3. TheRec

    Images intuitive

    Bonjour, J'ai récemment vu un nouvel exemple "d'imagemap" de Stu Nicholls et j'ai trouvé cela bien fait... peut-être que cela t'aidera... l'idéal serait de rester sémantique en ayant une lise à puce pour chaque zone de ton image, cet exemple va dans ce sens. Il y a d'autres exemples sans le "popup" (inline) sur le même site dans la section "Demos" sous "Demos - Image maps". Bonne chance.
  4. Bonjour, Désolé de ne pas avoir pu répondre, mais afin de faire profiter la communauté de ta solution, puis-je te demander de la poster ou éventuellement de poster le ou les liens vers le ou les tutoriaux que tu aurais utilisés. Merci d'avance.
  5. Bonsoir, Tu trouveras un belle "collection" de menus sur le site de Stu Nicholls également... dont quelques uns correspondant à tes attentes. Il y a généralement des explications sur les techniques utilisées et sur la compatibilité de chacun de ces menus. Bonne continuation.
  6. D'accord, si tu arrives à une solution avec un seul motif je serais intéressé de la connaître, donc n'hésite pas à la poster
  7. Je ne suis pas certain d'avoir compris ce que tu veux dire dans ta dernière réponse :S Enfin, si tu me demande comment le faire avec la fonction split, pas de problème. Je n'ai pas mis ce code parce que tu semblais ne pas vouloir d'autres solutions que les expressions rationnelles (pour te citer, (Je ne cherche pas une autre technique, mais une réponse à ce problème.)) : $chaines = array('toto=1234', 'toto=1234&tutu=1234&tata=1234&titi=1234', 'tata=1234&tutu=1234&toto=1234&titi=1234', 'tata=1234&tutu=1234&titi=1234&toto=1234'); foreach($chaines as $chaine) { $params = split("&",$chaine); foreach($params as $key => $val) { if($val == 'toto=1234') { unset($params[$key]); // On pourrait éventuellement sortir de la boucle ici, // si on considère que ce paramètre ne "devrait" apparaître qu'une seule fois } } echo join("&",$params)."\n"; } Si ce n'est pas ce que tu voulais dire, pardon... enfin ça servira peut-être à quelqu'un d'autre, un jour
  8. Bonjour, Il me semble que tes exemples ne reflètent pas réellement ce que ton code retourne... mais je me trompe peut-être, enfin je vais me baser sur la description que tu as faite plutôt que sur les résultats de tex exemples. À défaut de te proposer un seul motif (et je pense que réaliser cela en une seule expression deviendrait trop complexe : assertions, sous masques conditionnels, etc.), voici comme tu peux le faire : $chaines = array('toto=1234', 'toto=1234&tutu=1234&tata=1234&titi=1234', 'tata=1234&tutu=1234&toto=1234&titi=1234', 'tata=1234&tutu=1234&titi=1234&toto=1234'); $motif = array("/^toto=1234&?/", // 1. Lorsque le paramètre est en première position (précédé ou non d'un &) "/&?toto=1234$/", // 2. Lorsque le paramètre est en dernière position (précédé ou non d'un &) "/&toto=1234&/"); // 3. Lorsque le paramètre est au milieu d'autres (donc entourée de &) $replace = array('', // 1. '', // 2. '&'); // 3. foreach($chaines as $chaine) { echo preg_replace($motif,$replace,$chaine)."\n"; } Mais franchement je ne vois pas pourquoi tu n'utilises tout simplement pas la fonction split sur le caractère "&" et ensuite parcourir le tableau en vérifiant si la valeur de la cellule courrant est celle dont tu veux te débarrasser (toto=1234) et l'enlever (avec unset) puis de reformer ta chaîne grâce à la fonction join. Enfin procède comme tu veux, je ne connais pas toutes les contraintes de ton projet Bonne continuation.
  9. TheRec

    Clefs étrangères

    Ce n'est pas néfaste en soi, mais de tous les cours de base de données auquels j'ai participé et lors de mes lectures, je n'ai jamais appris ce genre de pratiques. Selon moi toucher aux clés primaires de cette façon peut, tôt ou tard, mener à des incohérences (cela dépend du système de base de données, des moyens utilisés pour ajouter des enregistrements, etc.). Effectivement cela fonctionnera, mais je ne me vois pas utiliser cette méthode, peut-être que c'est la vieille école je ne sais pas... Cela fait un moment que je n'ai plus pris part à un cours à ce sujet je l'avoue. Je l'espère, en tous cas ces cours sont complets et de ce que j'ai pu en lire les approches ne sont pas totalement similaires donc tu auras le choix P.S. : Allez, la prochaine fois je ne réponds pas avant que mon message apparaisse en page 2, histoire de d'éviter de jouer celui qui veut imposer "ma" pensée universelle
  10. TheRec

    Clefs étrangères

    Bonsoir, En cherchant on trouve beaucoup de cours sur les SGBDR Certains de ces cours traitent des questions que tu poses... et surtout reviennent aux fondamentaux de la modélisation ("organiser" n'est pas vraiment le terme utilisé lorsque l'on parle de la conception d'une base de données). Les deux plus intéressants et complets, après une lecture succincte, sont ceux-ci selon moi : Conception d'une base de données Base de Données et langage SQL Pour ta question plus précise, ce que je comprends c'est que tu fais appel aux contraintes de clés étrangères dans le cas que tu décris. Le fait est que ces contraintes ne sont appliquées que lorsqu'une requête met à jour (ON UPDATE) ou supprime (ON DELETE) un ou plusieurs enregistrements de la table en question. Bref sans altérer la table source, tu ne déclancheras pas ces actions. Si toutefois tu le fais ainsi, tu devras recréer l'enregistrement de la table à la base de ces contraintes et si tu veux rester cohérent tu devras lui attribuer la même clé primaire qu'avant sa suppression, ce qui n'est pas si évident que cela lorsque ta clé primaire est en "auto-increment" et est "UNIQUE", donc cette solution est à oublier à mon avis. Dans ton cas, j'effacerais les enregistrements des autres tables, une à une (solution la plus portable) ou, depuis MySQL 4.0, avec une requête DELETE multi-tables) en te basant sur la clé primaire et les jointures. C'est du travail et lorsque le schéma évolue par la suite cela implique des modifications dans ton code (si cela à un rapport avec la même clé primaire), mais tu es bien obligé de dire à MySQL ce que tu veux supprimer précisément si tu ne lui dit pas de TOUT supprimer
  11. De rien Le fait que ce soit une classe en PHP devrait te simplifier la tâche pour l'inclure dans ton projet Bonne chance.
  12. Bonjour, Je te conseille d'intéresser au sujet "Représentation d'arborescence en PHP depuis MySQL", il décrit les avantages d'une structure arborescente en "Nested sets" (accès à une partie ou à tous l'arbre en une requête et modifications de noeuds impliquant un changement de tous les noeuds en aval)... par rapport à la structure "Adjacente" (accès récursif, modifications de noeuds individuelles). Selon moi ton cas un très bon exemple qui justifie l'utilisation de ce modèle "Nested sets", l'accès à l'arbre sera certainement plus courant que les modifications de ce dernier, donc l'optimisation doit se faire pour l'accès. Bonne lecture et bonne continuation.
  13. Bonjour, MySQL depuis la version 3.23.23 propose, sur les tables de type MyISAM, la recherche "FULLTEXT". Il faut définir les champs sur lequel ou lesquels se fait la recherche et leur attribuer un INDEX FULLTEXT. Ensuite il est possible d'utiliser la syntaxe destinée aux recherches en "texte intégral" (le manuel explique très bien toutes les étapes et en plus il est en français ). L'avantage de ce type de recherche est que tu obtiens le "score" des enregistrements retournés. Bonne lecture. P.S. : Ce type de recherche n'a pas que des avantages bien entendu, mais ce genre calculs de "score" avec une simple clause WHERE s'avèrent difficiles à réaliser.
  14. TheRec

    Reformater une Chaîne

    À mon avis la seule limitation que tu auras c'est que tu ne peux pas avoir plusieurs application qui utilisent le même port... en l'occurrence tes serveurs HTTP (celui de EasyPHP et celui de WAMP) ne devront pas utiliser le même port TCP (par défaut c'est le port 80 pour HTTP). Il suffit de spécifier deux ports différents dans les deux fichiers httpd.conf, cherche cette ligne : Port 80 Et spécifie des ports différents... attention de ne pas choisir des ports utilise par d'autres applications (serveur FTP, MySQL, etc.) ensuite lorsque tu accèdes au serveurs avec ton navigateurs utilise le port adéquat : -http://localhost:<port spécifié dans httpd.conf> P.S. : Pour plaider la cause de ma solution en PHP, elle ne tient qu'en une ligne également et est compatible avec PHP4 et PHP5
  15. TheRec

    Reformater une Chaîne

    Bonsoir, Une autre possibilité est de tirer avantage des expression régulières... preg_match_all('/(.+) (.+)/i',$nom_complet,$matches); Ensuite dans le tableau $matches tu trouvera dans l'ordre : Le premier sous-masque signifie toutes suites de caractères quelconques ".+" (espaces compris) jusqu'à un espace (jusqu'à ce point l'expression n'est pas déterminante), ensuite le deuxième sous-masque est suivi de "$" qui indique la fin de la chaîne... Donc seul la dernière suite de caractères quelconques précédée d'un espace lui correspond. Il subsiste un problème, si le prénom est composé avec un espace tu n'obtiendra que la dernière partie de ce prénom... par exemple deux prénoms, mais si ce cas n'apparaît pas dans ta liste cette expression rationnelle devrait te contenter. (Comme certain code précédents, je propose juste cette solution car elle te permet somme toute plus de flexibilité si la nature de tes données devait évoluer). Bonne continuation. P.S. : Pour PHP4 et PHP5 sur le même ordinateur, sous Windows, tu peux utiliser WAMP qui est également une solution qui intègre Apache, MySQL, PHP et qui offre un "plugin" pour PHP4 (car PHP5 est la version par défaut) et le changement se fait en un seul clic... toutefois les deux versions ne peuvent pas fonctionner en même temps avec cette solution. Je ne crois pas que EasyPHP permet ceci non plus, mais cela fait un moment que je n'ai plus utilisé cette application.
  16. C'est juste. Il y a une liste des cas ou LIMIT optimise les requêtes SELECT : Source: 7.2.12 Comment MySQL optimise LIMITBien vu aspeum
  17. Bonjour, Attention toutefois à bien vérifier le contenu des variables envoyées par l'utilisateur ($_POST en l'occurrence) que tu vas utiliser dans la fonction mail. Cette partie du sujet à été traité récemment dans le sujet "Abusive Script" Bonne continuation. **EDIT** : Remplace ta boucle while par celle-ci : foreach($_POST as $key => $val) { $message .= "$key : $val\n"; } $HTTP_POST_VARS peut être désactivé selon ta configuration PHP et de plus il est conseillé de ne plus les utiliser : Source : Manuel PHP - Variables pré-définies
  18. Bonjour, Ce que tu peux faire également c'est de nommer toutes tes cases à cocher du même nom et d'ajouter "[]" après ce nom, par exemple, dans ton formulaire : while ($row = mysql_fetch_array($sql)) { echo "<input type=\"checkbox\" name=\"uid[]\" value=\"".$row['id']."\" class=\"checkbox\" /> ".$row['nom']; } Et lors du traitement en PHP tu pourras accéder au tableau $_POST['uid'] : foreach($_POST['uid'] as $value) { echo $value.'<br />'; } Bonne continuation.
  19. C'est discutable dans la mesure ou l'allocation mémoire d'un champ VARCHAR est faite selon la longueur de son contenu (plus un octet, pour stocker cette longueur), donc plus ton champ va occuper de mémoire, plus l'INDEX aura de données à traiter (sur des quantités de données cela a un impact). Il est possible d'indexer un préfix sur ce type de champs (CHAR et VARCHAR), mais cela ne résout pas les inconvénient que j'ai cités précédemment (collation, encodage... ceux-ci sont réglés sans problèmes avec les entiers, car la représentation est la même quel que soit l'encodage et/ou la collation). Mais cela reste une pratique possible... je ne me vois juste pas la conseiller C'est vrai que j'aurais du être moins catégorique et ajouter "généralement" dans cette phrase.
  20. Bonjour, SELECT nom, prenom,ville,description FROM membres INNER JOIN villes ON membres.ville=ville.nom; Premièrement, cette requête (et l'autre également) révèle probablement une erreur lors de la modélisation de ta base de données. Les tables sur lesquelles tu veux faire des jointures doivent avoir une clé primaire (unique) et une ou des clés étrangères, sous la forme d'"INTEGER" (nombre entier), chaque table aura un id et éventuellement une ou plusieurs clés étrangères. Dans ton cas la table membres aura une clé étrangère nommée par exemple ville_id qui fera référence à la table ville qui aura un champ id (unique pour chaque enregistrement). Les jointures se font sur ces champs et non sur des champs de type "VARCHAR" (comme je suppose ville.nom et membres.ville) et pour au moins deux raisons, lier des tables sur un champs entier est beaucoup plus sûr (pas besoin de s'inquiéter de la collation, l'encodage, etc. car ce sont des entiers) et car sur ces champs il est nécessaire de définir un INDEX (c'est d'ailleurs ainsi qu'il sont "différenciés" des autres) et c'est sur ce point que tu gagnes énormément en performances. Les moteurs de bases de données favorisent un accès rapide aux données qui sont "indexées". Concernant la deuxième syntaxe qui fonctionne mais dont le but n'est pas tout à fait équivalent et pour citer un bon article sur les types de jointures, dont je te conseille la lecture : Source : Le SQL de A à Z - le SELECT sur plusieurs tables Bonne continuation.
  21. Bonsoir, À ma connaissance ce n'est pas possible... C'est entièrement dépendant du navigateur, simplement pour des raisons de sécurité, de plus les environnements de tes utilisateurs étant hétérogènes, tu auras de la peine à trouver des valeurs qui fonctionnent pour tous (lettre de lecteur différentes, systèmes de fichiers différents, etc.). Ceci, au même titre qu'il est impossible de définir une valeur (par HTML, par Javascript, etc.) aux champs de types file, si c'était permis, il serait facilement possible de cacher un tel champ (avec une valeur par défaut) et de récupérer des fichiers lorsqu'un visiteur enverrait (volontairement ou non) un formulaire.
  22. TheRec

    Addition de durées

    Bonjour, Hé bien, tu n'as pas dû cherché bien loin pour modifier cette fonction... enfin donne cela : function duration($timestamp) { $hrs = floor($timestamp / (60*60)); $timestamp %= 60*60; $mins = floor($timestamp / 60); $secs = $timestamp % 60; $str = ""; if ($hrs >= 1) { $str .= $hrs.' heure'.($hrs>1 ? 's' : '').' '; } if ($mins >= 1) { $str .= $mins.' minute'.($mins>1 ? 's' : '').' '; } if ($secs >= 1) { $str .= $secs.' seconde'.($secs>1 ? 's' : '').' '; } return $str; } Bref, j'ai juste supprimé les parties qui correspondaient à ce que tu ne souhaitait plus voir apparaître... le calcul s'effectuant sur la même variable ($timestamp) à laquelle on attribue le reste de la division (%=) à chaque saut d'unité, en partant bien entendu de la plus grosse unité que l'on souhait afficher, la modification n'est pas plus compliquée que cela. Bonne continuation.
  23. TheRec

    Addition de durées

    Re-bonsoir Pour plus de souplesse, je te conseilles d'avoir une fonction permettant de faire ce que tu souhaite depuis un nombre de secondes... pour plusieurs raisons (la fonction time, entre autres renvoie un nombre de secondes et donc les calculs s'effectuent souvent avec cette unité). function duration($timestamp) { $years = floor($timestamp / (60*60*24*365)); $timestamp %= 60*60*24*365; $weeks = floor($timestamp / (60*60*24*7)); $timestamp %= 60*60*24*7; $days = floor($timestamp / (60*60*24)); $timestamp %= 60*60*24; $hrs = floor($timestamp / (60*60)); $timestamp %= 60*60; $mins = floor($timestamp / 60); $secs = $timestamp % 60; $str = ""; if ($years >= 1) { $str .= $years.' année'.($years>1 ? 's' : '').' '; } if ($weeks >= 1) { $str .= $weeks.' semaine'.($weeks>1 ? 's' : '').' '; } if ($days >= 1) { $str .= $days.' jour'.($days>1 ? 's' : '').' '; } if ($hrs >= 1) { $str .= $hrs.' heure'.($hrs>1 ? 's' : '').' '; } if ($mins >= 1) { $str .= $mins.' minute'.($mins>1 ? 's' : '').' '; } if ($secs >= 1) { $str .= $secs.' seconde'.($secs>1 ? 's' : '').' '; } return $str; } Source : PHP Help: duration() Je l'ai juste modifiée afin que les unités soient accordées correctement avec le nombre ou le chiffre qui les précèdent
  24. De rien, mais rien ne t'empêche d'utiliser mysql_fetch_array comme tu le fais dans le premier exemple. L'utilisation de ressources supplémentaires est négligeable à mon avis (allocation d'un tableau et accès aux données par un index). Tu recherches la syntaxe "la plus simple", mais il faudrait définir cette expression (Celle qui utilise le moins de ressources, celle qui rend le code plus lisible, etc.)
  25. Tu pourrais le faire ainsi : $result = mysql_query("SELECT nom, prenom FROM utilisateurs WHERE id='1'"); echo mysql_result($result,0,0).mysql_result($result,0,1); **EDIT** J'ai supprimé une partie de mon message...qui ne te servait pas vraiment.
×
×
  • Créer...