Aller au contenu

fingolfin

Hubmaster
  • Compteur de contenus

    127
  • Inscrit(e) le

  • Dernière visite

Tout ce qui a été posté par fingolfin

  1. fingolfin

    [MySQL] Trigger

    Bien le bonjour à tous, Je suis actuellement en train d'essayer de faire fonctionner un trigger sur mon site internet, je n'ai aucun soucis en local étant donné que j'utilise directement le compte root, par contre, en ligne, j'utilise un compte n'ayant pas le droit SUPER, aussi, j'ai créé le trigger sans soucis en utilisant le compte admin et en précisant le "DEFINER" afin de dire que le compte sans droit SUPER peut déclencher le trigger. Malheureusement, vous l'aurez compris, dès que je fais l'action censée déclencher le trigger, MySQL me dit qu'il faut avoir le droit SUPER... Je ne comprends donc pas le pourquoi de l'erreur, DEFINER est bien censé dire que le trigger peut être lancé par le compte qu'on lui passe en argument ? Si oui, pour quelle raison le déclenchement pourrait-il réclamer le droit SUPER ? Merci d'avance pour votre aide, Fingolfin.
  2. Une requête d'insertion universelle ? Pour ce faire il te suffit, comme indiqué dans le message précédent de procéder par système de requête dynamique comme on dit, en gros tu stockes dans un tableau les noms de colonnes de ta table avec les valeurs à insérer, puis tu as juste à générer ta requête en plaçant le début au dessus de la boucle et la fin en dessous de la boucle (l'intérieur servant donc à générer la liste d'insertion et l'insertion elle même).
  3. Afin de pouvoir rediriger selon la langue indiquée par le navigateur il te faut exploiter les entêtes HTTP fournies par le client, voici la variable qu'il te faudra utiliser, je te laisse faire des recherches à son sujet pour obtenir ce que tu veux exactement. (si tu n'y parvient pas tu peux toujours le dire et on te donnera la réponse.) $_SERVER['HTTP_ACCEPT_LANGUAGE']
  4. Qu'appelles tu un champ simple en trois parties distinctes ? Tu veux un champ dans la Base De Donnée qui contienne trois données ? Si c'est le cas c'est possible, mais quelle que peu inutile et stupide au niveau de l'organisation de celle-ci. En gros il te suffirait de prendre les trosi variables de retour du formulaire d'inscription (ou autre), d'utiliser la fonction imlplde() afin de mettre ces trois valeurs les unes derrières les autres dans une chaîne de caractère en séparant chaque valeur par un point virgule ou par une virgule par exemple. Toujours est il que ton problème est assez vague et qu'il est compliqué de savoir ce que tu veux réellement obtenir à l'arrivée, s'il s'agit juste de réaliser un formulaire d'inscription comme il y en partout il te suffit de regarder un tutoriel à ce sujet tu auras ta réponse, car là je ne vosi pas vraiment le soucis qu'il y a à gérer trosi variables et l'envoi d'un e-mail. Bonne chance quand même
  5. Qu'appelles tu un champ simple en trois parties distinctes ? Tu veux un champ dans la Base De Donnée qui contienne trois données ? Si c'est le cas c'est possible, mais quelle que peu inutile et stupide au niveau de l'organisation de celle-ci. En gros il te suffirait de prendre les trosi variables de retour du formulaire d'inscription (ou autre), d'utiliser la fonction imlplde() afin de mettre ces trois valeurs les unes derrières les autres dans une chaîne de caractère en séparant chaque valeur par un point virgule ou par une virgule par exemple. Toujours est il que ton problème est assez vague et qu'il est compliqué de savoir ce que tu veux réellement obtenir à l'arrivée, s'il s'agit juste de réaliser un formulaire d'inscription comme il y en EDIT : Euh blem de tabulation, merci de supprimer ce message
  6. J'ai l'impression que tu te compliques la vie, tu veux t'amuser à sélectionner tout les codes de validation / activation des membres pour renvoyer celui d'un seul membre à ce membre en question, tu ne trouves pas ça un peu bête ? En gros ce que tu dois faire c'est demander le pseudo du membre dans un formulaire, une fois cela fait il ne te reste qu'à sélectionner dans la Base De Donnée le code de validation de celui-ci selon son pseudo avec une requête toute bête du genre : <?php $usr_tbl = 'membre'; $pseudo = mysql_real_escape_string(htmlspecialchars(trim($_POST['pseudo']))); $req = mysql_query("SELECT user_verify_code AS code FROM $usr_tbl WHERE pseudo = '" . strtolower($pseudo) . "'")or die(mysql_error()); $donnee _membre = mysql_fetch_assoc($req); $code_validation = $donnee_membre['code']; ?> Enfin si du moins j'ai bien compris ton problème qui est donc de renvoyer un code d'activation à une personne précise et non d'envoyer tout les codes à tout le monde.
  7. C'est pourtant simple comme problème, tu as deux variables, tu n'en veux qu'une, il te suffit de faire une condition afin de savoir si tu utilises l'une ou l'autre dans ton url. Donc comme tu ne précises pas les conditions d'affichage des variables, on ne peut pas vraiment les deviner, mais en gros un code du genre devrait suffire : $variable_affiche = 1; $id = !empty($_GET['id']) ? $_GET['id'] : 14; // Affiché si $varaible_affiche = 1 $affl_id = !empty($_GET['affl_id']) ? $_GET['affl_id'] : 34084; // Affiché si $variable_affiche = 2 if($variable_affiche == 1) { echo '<a href="ton_lien.php?id=' . $id . '"> Le blabla </a>'; } if($variable_affiche == 1) { echo '<a href="ton_lien.php?affl_id=' . $affl_id . '"> Le blabla </a>'; } Le problème n fait c'est surtout que tu ne sais pas vraiment ce que tu veux faire j'ai l'impression, ou du moins tu es plutôt embrouillé dans tes pensées.
  8. Vous voulez le rang d'un type selon sa note ou son id ? Si c'est son id il vous suffit de la sétionner, si c'est la note bah vous sélectionner le tout et vous faites ça à la main avec PHP dans une boucle.
  9. fingolfin

    script serveur

    Non justement, c'est pour cela que je te conseille une tâche cron, mais du moment que personne ne se connecte il n'y a de toute façons aucun problème à ce que l'UPDATE n'ai pas lieu vu que personne ne sera là pour le voir normalement
  10. fingolfin

    script serveur

    Euh date() ça ne marche pas comme ça, pour vérifier s'il est 14h50 il faut faire la condition suivante : if(date('G') == 14 AND date('i') == 50) { echo 'Il est 14h50 et tout va bien!'; } http://www.php.net/manual/fr/function.date.php
  11. fingolfin

    script serveur

    Personnellement j'utilise time() pour obtenir le timestamp, si tu veux utiliser mktime() tu peux tout à fait le faire D'ailleurs en y pensant, ce que je dis est un peut faux, vérifier l'heure ne sert pas totalement, en réalité il faut vérifier qu'il est plus de minuit PUIS que la mise à jour a été faites (car si personne ne se connecte entre 00h00 et 5h00 par exemple ce serait dommage que la mise à jour ne se fasse pas )
  12. fingolfin

    script serveur

    Utilises les crons si tu en as la possibilité, sinon tu met sur chacune de tes pages une condition exploitant date() et time() afin de définir l'heure et donc s'il faut faire la mise à jour ou non (le problème étant dans ce cas là qu'à chaque chargement de page de 24h00 à 1h00 il y aura une requête supplémentaire (celle qui dira "c'est déjà à jour" ou "c'est pas déjà à jour") à cause du faites qu'il y a peut de probabilité qu'un utilisateur charge une page à 00h00 00s.) Donc le mieux reste une petite tâche cron toute simple appelant un script tout les jours à minuit. Si tu ne connais pas les crons et donc certainement l'éditeur Vim : Cron : http://doc.ubuntu-fr.org/cron Vim : http://doc.ubuntu-fr.org/vim (les commandes dépendent de la version bien sûr)
  13. Bah le principe c'est de relier les données des deux tables entre elles suivant certaines conditions, en l'occurrence là on join la table "marques" et l'on sélectionne donc la table "telephones" seulement lorsque l'id de la marque du téléphone est égale à l'id d'une des marques de la table "marques". Bon je ne suis pas bien doué pour expliquer certes ... Pour faire ça de façons schématique, tu as deux tables : telephones id marque ref [*]marques id marques Avec une jointure basique où nous sélectionnerions tout (avec jointure) nous obtiendrons ceci : Résultat de la requête Telephone.id Telephone.marque Telephone.ref Marques.id Marques.marques Si tu ne comprends pas le principe, il y a des tutoriaux sur internet assez bien pour les jointures si je me rappelle bien.
  14. Si tu possèdes les accès à ce site (mot de passe, identifiant) et que tu as le droit de t'y connecter par FTP (il y a une différence entre posséder les identifiant et avoir le droit de les exploiter), tu peux utiliser les librairie CURL afin de te connecter au FTP pour y déposer un nouveau fichier PHP qui aura préalablement été crée par le script CURL, il te suffirai de connaître les différentes includes à mettre à la base du fichier (en-tête, menus, pied de page ...) et d'insérer ton article au bonne endroit dans cette include. Sinon tu peux aussi utiliser tout bonnement la librairie FTP (le nom a un rapport avec le protocole en théorie ) Documentations des deux librairies citées : FTP : http://fr.php.net/manual/fr/ref.ftp.php CURL : http://fr.php.net/manual/fr/ref.curl.php Après faut voir si j'ai bien compris ce que tu veux. (et je te conseille au passage la librairie FTP, ça à l'air très simple d'utilisation et assez efficace, après je ne l'ai jamais utilisé donc je ne peux pas t'en dire plus.)
  15. InnerHTML je suppose que tu sais à quoi ça sert vu que tu l'utilises, cette propriété permet d'accéder au contenu d'un bloc et de le remplacer entièrement (dans ton cas) si tu veux que ton truc soit écrit plusieurs fois il faudrait penser à remplacer "=" par ".=" qui signifie que tu rajoutes ce que tu as d'indiquer à l'innerHTML actuelle et non pas que tu le remplaces.
  16. Une bête jointure et tu obtiens ce que tu veux : $select = mysql_query("SELECT telephones.marque, marques.marques FROM telephones LEFT JOIN marques ON telephones.marque = marques.id")or die(mysql_error()); while ($donnees = mysql_fetch_assoc($select)) { echo $donnees['marques']; } ?> Avec les tables suivantes : CREATE TABLE `telephones` ( `id` mediumint(9) NOT NULL auto_increment, `marque` varchar(30) NOT NULL, `ref` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3; -- -- Contenu de la table `telephones` -- INSERT INTO `telephones` (`id`, `marque`, `ref`) VALUES (1, '1', 'n65'), (2, '2', 'i63'); CREATE TABLE `marques` ( `id` mediumint(9) NOT NULL auto_increment, `marques` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3; -- -- Contenu de la table `marques` -- INSERT INTO `marques` (`id`, `marques`) VALUES (1, 'nokia'), (2, 'sagem'); Ça me renvoie "nokiasagem" (j'ai pas mis de saut de ligne comme tu as pu le remarquer )
  17. fingolfin

    Plusieurs COUNT

    Oui, cette requête c'était pour tester, elle est très lourde et peut être divisé en deux requêtes avec jointures dont une qui ne lit que X entrées (X = nombre de ressources existantes et exploitées par le joueur) et l'autre qui donc lit seulement toutes les entrées des bâtiments du joueur dans la zone, alors qu'avant pour chaque bâtiment sélectionné je sélectionnai aussi les informations fixes concernant l'exploitation (active / inactive / nombre de charrettes de transport / production demandé par le joueur ...), en gros, voici à quoi ressemble mes requêtes dorénavant : $donnees_fixe = mysql_query("SELECT production.production, production.prod_demande, production.etat, transport.nombre_char, transport.quantite FROM production LEFT JOIN transport ON production.id_region = transport.region_dep AND production.id_territoire = transport.territoire_dep AND production.type_zone = transport.type_zone AND production.production = transport.type_ressource WHERE production.type_zone = 'plaine' AND production.id_region = '" . $_SESSION['region'] . "' AND production.id_territoire = '" . $_SESSION['territoire'] . "' AND transport.type_zone = 'plaine' AND transport.region_dep = '" . $_SESSION['region'] . "' AND transport.territoire_dep = '" . $_SESSION['territoire'] . "'")or die(mysql_error()); /* On fait une seconde requête qui permettra de compter les stock et les productions */ $productions = mysql_query("SELECT donnees_batiment.capacite, donnees_batiment.quantite, batiment.place_occupe, batiment.etat, batiment.nom, batiment.stock, donnees_batiment.production AS batiment_produit FROM batiment LEFT JOIN donnees_batiment ON batiment.type_zone = donnees_batiment.type_zone AND batiment.nom = donnees_batiment.nom WHERE batiment.type_zone = 'plaine' AND batiment.id_region = '" . $_SESSION['region'] . "' AND batiment.id_territoire = '" . $_SESSION['territoire'] . "'")or die(mysql_error());
  18. fingolfin

    Plusieurs COUNT

    Bon bah, j'ai trouvé une autre solution qui n'a plus rien à voir avec cette histoire, j'ai refait ma Base De Donnée ce qui me permet maintenant d'avoir juste une requête avec des jointures pour sélectionner toutes les informations nécessaires à l'affichage des productions, bon c'est une belle requête qui ne doit pas être légère à exécuter, mais sachant qu'il n'y en aura donc qu'une sur la page (en dehors des menus) je pense que c'est pas mal quand même, voici à quoi elle ressemble : $productions = mysql_query("SELECT production.production, production.etat AS etat_production, transport.nombre_char, transport.quantite AS transport_quantite, transport.type_ressource, donnees_batiment.capacite, donnees_batiment.quantite, batiment.place_occupe, batiment.etat, batiment.nom, batiment.stock FROM production LEFT JOIN transport ON production.id_region = transport.region_dep AND production.id_territoire = transport.territoire_dep AND production.type_zone = transport.type_zone AND production.production = transport.type_ressource LEFT JOIN batiment ON transport.region_dep = batiment.id_region AND transport.territoire_dep = batiment.id_territoire AND transport.type_zone = batiment.type_zone LEFT JOIN donnees_batiment ON batiment.type_zone = donnees_batiment.type_zone AND batiment.nom = donnees_batiment.nom WHERE production.type_zone = 'plaine'")or die(mysql_error());
  19. fingolfin

    Plusieurs COUNT

    Bien le bonjour, Voilà, je suis en ce moment en train de faire un jeu, j'en suis à la partie d'affichage des productions du joueur dans une certaine zone, le problème étant que chaque bâtiment est unique (il n'y a pas 100 moulins mais 100 * 1 moulins), ce qui m'oblige à compter le nombre de moulins, champs ... Mais voilà, en plus que chaque bâtiment soit unique, il possède un état de sa structure qui peut varié s'il a subit des dégâts liés à des combats ou à des catastrophes naturelles, mon problème est donc que je me retrouve avec une requête faisant 6 COUNT rien que pour deux bâtiments, sachant que j'aurais dans les 10 bâtiments au final, j'effectuerais donc une trentaine de COUNT, ce qui me paraît être assez lourd pour mon hébergement (et pas optimisé du tout), aussi j'aimerai savoir si vous connaissiez un autre moyen pour avoir le même résultat que ces 30 COUNT sans en faire 30 justement Voici à quoi ressemble ma requête actuellement (je précise qu'elle marche ce n'est donc pas le problème) $donnees_batiment = mysql_query("SELECT (SELECT COUNT(*) FROM batiment WHERE nom = 'moulin' AND etat = 'neuf') AS moulin_neuf, (SELECT COUNT(*) FROM batiment WHERE nom = 'champ' AND etat = 'neuf') AS champ_neuf, (SELECT COUNT(*) FROM batiment WHERE nom = 'champ' AND etat = 'abime') AS champ_abime, (SELECT COUNT(*) FROM batiment WHERE nom = 'moulin' AND etat = 'abime') AS moulin_abime, (SELECT COUNT(*) FROM batiment WHERE nom = 'champ' AND etat = 'detruit') AS champ_detruit, (SELECT COUNT(*) FROM batiment WHERE nom = 'moulin' AND etat = 'detruit') AS moulin_detruit FROM batiment WHERE id_region = '" . $_SESSION['region'] . "' AND id_territoire = '" . $_SESSION['territoire'] . "' AND type_zone = 'plaine'")or die(mysql_error()); Voici la structure de la table en question : CREATE TABLE `batiment` ( `id` mediumint(9) NOT NULL auto_increment, `id_region` mediumint(9) NOT NULL, `id_territoire` mediumint(9) NOT NULL, `type_zone` varchar(30) NOT NULL, `nom` varchar(30) NOT NULL, `etat` varchar(30) NOT NULL, `place_occupe` int(11) NOT NULL, `statue` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7; Et quelques entrées de test : INSERT INTO `batiment` (`id`, `id_region`, `id_territoire`, `type_zone`, `nom`, `etat`, `place_occupe`, `statue`) VALUES (1, 1, 1, 'plaine', 'champ', 'neuf', 2, 'actif'), (2, 1, 1, 'plaine', 'moulin', 'neuf', 1, 'inactif'), (3, 1, 1, 'plaine', 'moulin', 'abime', 1, 'actif'), (4, 1, 1, 'plaine', 'moulin', 'detruit', 0, 'inactif'), (5, 1, 1, 'plaine', 'champ', 'abime', 1, 'actif'), (6, 1, 1, 'plaine', 'champ', 'detruit', 0, 'inactif'); Alors voilà, si vous connaissez une méthode plus optimisé afin d'alléger la requête, je vous remercie de bien vouloir la partager
  20. Bon, n'arrivant toujours pas à faire une boucle dans une requête j'ai trouvé un autre moyens, faire une requête dynamique généré par PHP, donc si sa intérresse quelqu'un, voici le code en question : /* On construit la requête qui aura pour but de mettre à jour les champs de la table */ $req = 'UPDATE groupe, groupe_autorisation SET groupe.nom = "' . $nom . '", groupe.description = "' . $description . '",'; $i = 0; while(!empty($tableau_autorisation[$i])) { $i_suivant = $i + 1; if(empty($tableau_autorisation[$i_suivant])) { $req.= ' groupe_autorisation.' . $tableau_autorisation[$i] . ' = "' . $_POST[$tableau_autorisation[$i]] . '"'; } else { $req.= ' groupe_autorisation.' . $tableau_autorisation[$i] . ' = "' . $_POST[$tableau_autorisation[$i]] . '",'; } $i++; } $req.= ' WHERE groupe.id = "' . $id_groupe . '" AND groupe_autorisation.id = "' . $id_groupe . '"'; echo $req; mysql_query($req) or die(mysql_error()); Ce code générant une requête dans ce style : UPDATE groupe, groupe_autorisation SET groupe.nom = "admin", groupe.description = "Kawa !!", groupe_autorisation.index_membre = "1", groupe_autorisation.compte = "1", groupe_autorisation.index_admin = "1", groupe_autorisation.non_actif = "1", groupe_autorisation.gestion_groupe = "1" WHERE groupe.id = "1" AND groupe_autorisation.id = "1" Voilà, par contre si quelqu'un connais la structure d'une boucle SQL je suis toujours preneur
  21. Mysql 5.0, sa change quelque chose au niveau du code ? (n'étant pas d'un bon niveau je ne connais franchement pas les différences entre les deux versions )
  22. Pas de problème Donc en faites il s'agit de la gestion des autorisations d'accès aux différentes pages , donc j'ai une table nommé "groupe_autorisation" ayant pour le moment cette structure : Donc dans ma page de gestion des groupes, une fois que l'on a décidé quelle est le groupe dont on veut modifier les accès et que l'on a fait les modifications, je voudrais faire une requête de type UPDATE avec une boucle prenant comme argument un tableau dont chaque case a pour valeur un champ de la table "groupe_autorisation" (à part id), le but serait donc de modifier tout les champs dans la boucle. Pour être précis j'ai besoin de cela, car à chaque fois que je rajouterai une page dans le site, il y aura un champ de plus dans la BDD, et si je ne veux pas m'ennuyer à modifier le script à chaque fois il faut que le nombre de champ modifiable soit infini grâce à la boucle.
  23. Bien le bonjour à tous ! Alors voilà, j'ai un petit (gros) problème, il s'avère que j'ai grand besoin de faire une boucle dans une requête pour ne pas avoir à faire l'inverse qui demanderait bien plus de puissance (requête dans une boucle ), le seul problème, vous l'aurez compris, réside dans le faites que je ne connais pas et que je n'arrive pas à trouver la syntaxe de ce genre de requête ... (en l'occurence il s'agit d'une boulce dans une requête de type UPDATE), donc du coup je suis bloqué à attendre bêtement de trouver comment faire cela Voilà, donc merci d'avance
  24. C'est pas grave du momment que je trouve^^ Euh tant que j'y suis au lieu de créer un autre topic pour trois messages j'aimerais demander ceci: Comme vous le savez surement je veut effectuer le script toute les heure qui modifierait les ressources et autres de chaque joueur, mais pour cela j'aimerais savoir comment faire pour qu'une requêtes s'applique à tous les joueur. Par exemple il y a deux joueur au totale un qui gagne 20 de bois par tour et l'autre 15 bah j'aimerais savoir coment faire pour dire de modifier les deux champs "bois" dans la BDD pour les deux joueur différent. en gros: mysql_query("UPDATE ressource SET bois = $bois_totale WHERE pseudo = '" . $_SESSION['pseudo'] . "' AND id = '" . $_SESSION['idmembre'] . "'"); mais qui s'aplliquerait à tous les joueurs (euh je sais je n'arrive pas à bien expliquer comme d'hab lol)
  25. A se doit être le truc des tâches planifier
×
×
  • Créer...