[(x)HTML- CSS - PHP - SQL - JS] - Problèmes & Choix d'applications

Pages: [1]

Weby

  • Invité
05 juin 2009, 17:45
Ce topic sera destiné à parler de programmation et design Web.

Je commence avec une petite question, à tous les connaisseurs uniquement : A votre avis, pour un forum chargé comme celui de PT ci-présent, pour le nombre de messages postés par membre, est-il mieux de créer un champ "nombre de posts" pour chaque membre, ou de faire un comptage de chaque post à l'affichage ?
Je précise que j'ai une taille de BDD et une BP illimités...
(Donc Aurelniño, j'ai besoin d'toi...)

Ichiz

  • Membre
  • 1993 posts
05 juin 2009, 18:36
PUTAIN PILE LE TOPIC QU'IL ME FALLAIT

WEBY J'AI TON MSN?

Aurelgadjo

  • Membre
  • 2377 posts
05 juin 2009, 22:46
ça dépend si tu veux te casser les couilles ou pas. Mais pour moi niveau performances c'est mieux d'avoir un champ en bd que tu incrémente/décrémente.

Imagine une page d'un forum sans cache. tu as 20 posts, 20 invervenants. Ces 20 invervenants ont tous 500 posts. Tu dois faire 20 comptages de 500 posts, donc 20 tris sur potentiellement plusieurs dizainnes de milliers...

Weby

  • Invité
05 juin 2009, 23:55
Oui vu comme ça, j'sais même pas pourquoi j'ai posé la question tiens, ça coule de source... Puis vu que je suis pas limité par la taille... Bon le truc chiant c'est de pas oublier d'incrémenter le compteur au postage, de NE PAS l'incrémenter à l'édition et de le Décrémenter à la suppression...

Du coup, ça fait quand même, dépendant comment tu bosses, le même nombre de requêtes...
Putain mais pourquoi j'y ai pas pensé...

Ah tu peux me dire si SMF utilise justement ce système (champ bdd) ?

Ichiz

  • Membre
  • 1993 posts
05 juin 2009, 23:57
un grand merci à weby qui m'a bcp aidé

Weby

  • Invité

Ichiz

  • Membre
  • 1993 posts
06 juin 2009, 00:06
t'auras un shout out sur le truc tkt

Weby

  • Invité

Aurelgadjo

  • Membre
  • 2377 posts
06 juin 2009, 01:16
Oui vu comme ça, j'sais même pas pourquoi j'ai posé la question tiens, ça coule de source... Puis vu que je suis pas limité par la taille... Bon le truc chiant c'est de pas oublier d'incrémenter le compteur au postage, de NE PAS l'incrémenter à l'édition et de le Décrémenter à la suppression...

Du coup, ça fait quand même, dépendant comment tu bosses, le même nombre de requêtes...
Putain mais pourquoi j'y ai pas pensé...

Ah tu peux me dire si SMF utilise justement ce système (champ bdd) ?

SMF l'utilise.
Sinon bah, simple pour tes requetes, t'utilise quand même pas la même requete pour toutes ces actions...
UPDATE table SET msg='lol', compteur+=1, lol='slt' WHERE ...
INSERT INTO table SET msg='lole', compteur+=1, lol='non'

enfin, pas sur pour +=1, si ça va pas essaie compteur=compteur+1

Weby

  • Invité
06 juin 2009, 01:20
Je crois que +=1 fonctionne. Je testerai, mais le truc c'est que j'ai tendance maintenant à m'embrouiller dans mes codes... mec qui met pas de commentaires, yes !
J'ai toutes les requêtes de bases dans un fichier "functions. //une certaine pré-extension // . // une certaine extension //" dans "un certain dossier", et ça m'emmele un peu... Je manque de sommeil moi putain.

Shruikan

  • Membre
  • 201 posts
06 juin 2009, 02:43
Mets des commentaires dans ton code, connard  :castor:

 T'as la Javadoc en natif pour tout ce qui est programmation en Java, et pour les autres langages parce qu'il n'y a pas que le Java dans la vie même si j'ai parfois tendance à l'oublier, tu as l'irremplaçable tuerie "Doxygen" qui oxygène la vie du programmeur lambda  :winner:

Aurelgadjo

  • Membre
  • 2377 posts
06 juin 2009, 13:04
phpDocumentor pour le php aussi

Et utilise des classes, pour certains usages ça révolutionne ta façon de coder

Weby

  • Invité
06 juin 2009, 17:03
Oui, mais pas pour ça.

Sinon, pour un panier par exemple, c'est vrai que c'est vachement pratique...

Weby

  • Invité
25 juin 2009, 01:37
Putain je sais pas pourquoi je pose ces questions ici, vu la horde de boulz qui hantent le lieu, mais m'y voilà forcé...

IIS7, impossible de créer un site... Pourtant sur le 6 ça fonctionnait nickel... Des idées ? J'ai pas de messages d'erreur, juste la page classique du loopback.
« Modifié: 25 juin 2009, 01:40 par Weby »

Aurelgadjo

  • Membre
  • 2377 posts
25 juin 2009, 01:54
apt-get remove windows

lolimut

  • Membre
  • 13981 posts
28 juillet 2009, 02:30
Question php

Admettons que je veuille récupérer 7 données de la BDD. Pour le moment tout ce que j'ai trouvé comme moyen c'est :

$mysql_donnee1 = mysql_query('SELECT * FROM table WHERE id =' . $donnees['d1'] . '') ;
// La variable $donnees est un array issu d'une autre requête mysql
$donnee1 = mysql_fetch_array($mysql_donnee1) ;
// Ensuite je bosse sur l'array $donnee1...

$mysql_donnee2 = mysql_query('SELECT * FROM table WHERE id =' . $donnees['d2'] . '') ;
// La variable $donnees est un array issu d'une autre requête mysql
$donnee2 = mysql_fetch_array($mysql_donnee2) ;
// Ensuite je bosse sur l'array $donnee2...

// ... et ainsi de suite jusqu'à $donnee7.

Pour le moment ça me dérange pas de faire du copier-coller puis de remplacer le chiffre correspondant, mais pour de grandes séries de données, composée de $caracteres (qui a comme valeur 50, 100... ce que vous voulez), y aurait pas moyen d'aller plus vite, en utilisant une boucle par exemple ?

Perso j'ai pensé à :

$a = 1 ;
while ($a <= $caracteres)
{
   $mysql_donnee{$a} = mysql_query('SELECT * FROM table WHERE id =' . $donnees['d' . $a . ''] . '') ;
   $donnee{$a} = mysql_fetch_array($mysql_donnee{$a}) ;
   $a++ ;
}

Ca me semble plus pratique, car je pourrais ensuite utiliser $donnee1, $donnee2... Selon la valeur que $a a prise. Seulement ça marche pas, lolz.

Y a-t-il un problème dans ma manière de coder, et si oui, quelqu'un saurait comment traiter de la sorte un grand nombre de requêtes mysql ?

Aurelgadjo

  • Membre
  • 2377 posts
28 juillet 2009, 14:21
Premiére chose, n'utilise pas mysql_fetch_array. je me doute que tu accédes tout le temps à tes variables issues de cette fonction via leur nom ($toto['lol'] et non $toto[0]) : utilise mysql_fetch_assoc (performances issues)

Ensuite au lieu de $donnee{$a} (syntaxe que je ne connais pas mais je pense avoir compris ce que tu veux faire, à savoir si a vaut de 1 à 5, tu auras $donnee1, $donnee2, ...), utilise un tableau, ca $donnees[$a]. comme ça tu pourras comprendre ce qu'il se passe en dumpant ta variable (var_dump($donnees), et ensuite affiche la source dans ton navigateur pour avoir qqch de lisible).

Sinon, explique mieux ce que tu veux faire à la base, cad que contiens ta bdd et ce que tu veux. Les boucles de requetes sql, c'est super moche, et la plupart du temps ça peut etre évité par des jointures ou sous requetes, bien plus propres, performantes et lisibles

lolimut

  • Membre
  • 13981 posts
28 juillet 2009, 14:56
Premiére chose, n'utilise pas mysql_fetch_array. je me doute que tu accédes tout le temps à tes variables issues de cette fonction via leur nom ($toto['lol'] et non $toto[0]) : utilise mysql_fetch_assoc (performances issues)

Je connaissais pas cette fonction, je viens de voir la doc, ça m'a l'air en effet plus utile, thanks.

Ensuite au lieu de $donnee{$a} (syntaxe que je ne connais pas mais je pense avoir compris ce que tu veux faire, à savoir si a vaut de 1 à 5, tu auras $donnee1, $donnee2, ...), utilise un tableau, ca $donnees[$a]. comme ça tu pourras comprendre ce qu'il se passe en dumpant ta variable (var_dump($donnees), et ensuite affiche la source dans ton navigateur pour avoir qqch de lisible).

Cherchant à faire un truc de ce genre depuis pas mal de temps, j'ai essayé de trouver quelque chose qui me le permettait sur le site du zéro, utilisant la syntaxe $var1{$var2}. A croire que j'ai mal compris.
Idem pour var_dump, je connaissais pas, j'ai vu la doc. Je pense que j'arriverais à en tirer quelque chose.
Et sinon ouais, tu as compris que je comptais utiliser tout ça pour avoir $donnee1, $donnee2...

Sinon, explique mieux ce que tu veux faire à la base, cad que contiens ta bdd et ce que tu veux. Les boucles de requetes sql, c'est super moche, et la plupart du temps ça peut etre évité par des jointures ou sous requetes, bien plus propres, performantes et lisibles

Je suis sur un site qui a pour concept d'établir un classement online suite à des résultats de matchs sur un jeu, classement qui fonctionne (entre autres) par team. A défaut de tout dévoiler, voici les principales tables de ma bdd :
membres : table qui contient les pseudos des membres, leur id, l'id_team qui a comme valeur bien évidemment l'id de la team dans laquelle ils sont, et d'autres infos qui ne sont pas utiles ici
teams : table qui contient le nom des teams, leur id, lien de leur forum, et autres infos
resultats_team : table contenant tous les inter-teams joués, et comportant exactement 33 champs (ce qui est beaucoup, il y a peut-être un moyen pour raccourcir mais je le connais pas) que je mets en spoiler :
Spoiler
id = id du match, rien de particulier
t1 = id de la team 1 (int)
t2 = id de la team 2 (int)
j11 = id du joueur 1 de la team 1 (int)
j12 = id du joueur 2 de la team 1, vaut 0 s'il s'agit d'un inter-team à 1vs1 (int)
...
j17 = id du joueur 7 de la team 1, vaut 0 s'il s'agit d'un inter-team à 6 joueurs ou moins (int)
j1s = id du joueur de la team 1 qui participe au match de mort subite s'il a lieu, vaut 0 sinon (int)
j21 = id du joueur 1 de la team 2 (int)
...
j2s = id du joueur de la team 2 qui participe au match de mort subite s'il a lieu, vaut 0 sinon (int)
rs1 = résultat du match j11 vs j21, NULL si l'IT est en matchs de 2vs2 (text)
rs2 = résultat du match j12 vs j22, NULL s'il n'y a qu'un joueur par team ou si l'IT est en matchs de 2vs2(text)
...
rd1 = résultat du match j11-j12 vs j21-j22, NULL si l'IT est en matchs de 1vs1 (text)
rd2 = résultat du match j13-j14 vs j23-j24, NULL s'il n'y a que 2 joueurs par team ou si l'IT est en matchs de 2vs2
rd3 = résultat du match j15-j16 vs j25-j26, NULL s'il n'y a que 4 joueurs par team ou si l'IT est en matchs de 2vs2
rf = résultat du match j1s vs j2s, NULL s'il n'y a pas eu de mort subite
timestamp = indique le timestamp de la fin de l'inter-team
Principe : chaque team est limitée à 7 joueurs (j'ai mes raisons) et les matchs se font en 1vs1 ou 2vs2. On regarde quelle équipe a remporté le plus de matchs et, si les circonstances venaient à faire qu'elles soient à égalité (genre s'ils ont décidé de jouer à 4 joueurs, en 2vs2, et que chaque team gagne un match) on refait un dernier match 1vs1 comportant de chaque côté un joueur désigné par la team, ce match déciderait de l'issue générale.

Pour le moment je n'ai rien trouvé de mieux que de faire autant de tables. C'est redondant au moment où je l'utilise, mais je m'en sors pas trop mal. Seulement je risque de galérer si je venais à nécessiter plus de joueurs, et je me vois mais faire des tables de 100 champs. Ce pourquoi un petit conseil à ce sujet ne serait pas de refus.

Aurelgadjo

  • Membre
  • 2377 posts
28 juillet 2009, 20:48
Ensuite au lieu de $donnee{$a} (syntaxe que je ne connais pas mais je pense avoir compris ce que tu veux faire, à savoir si a vaut de 1 à 5, tu auras $donnee1, $donnee2, ...), utilise un tableau, ca $donnees[$a]. comme ça tu pourras comprendre ce qu'il se passe en dumpant ta variable (var_dump($donnees), et ensuite affiche la source dans ton navigateur pour avoir qqch de lisible).

Cherchant à faire un truc de ce genre depuis pas mal de temps, j'ai essayé de trouver quelque chose qui me le permettait sur le site du zéro, utilisant la syntaxe $var1{$var2}. A croire que j'ai mal compris.
Idem pour var_dump, je connaissais pas, j'ai vu la doc. Je pense que j'arriverais à en tirer quelque chose.
Et sinon ouais, tu as compris que je comptais utiliser tout ça pour avoir $donnee1, $donnee2...

${donnee$var2} ou ${donnee{$var2}} je sais pas

Sinon, explique mieux ce que tu veux faire à la base, cad que contiens ta bdd et ce que tu veux. Les boucles de requetes sql, c'est super moche, et la plupart du temps ça peut etre évité par des jointures ou sous requetes, bien plus propres, performantes et lisibles

Je suis sur un site qui a pour concept d'établir un classement online suite à des résultats de matchs sur un jeu, classement qui fonctionne (entre autres) par team. A défaut de tout dévoiler, voici les principales tables de ma bdd :
membres : table qui contient les pseudos des membres, leur id, l'id_team qui a comme valeur bien évidemment l'id de la team dans laquelle ils sont, et d'autres infos qui ne sont pas utiles ici
teams : table qui contient le nom des teams, leur id, lien de leur forum, et autres infos
resultats_team : table contenant tous les inter-teams joués, et comportant exactement 33 champs (ce qui est beaucoup, il y a peut-être un moyen pour raccourcir mais je le connais pas) que je mets en spoiler :
Spoiler
id = id du match, rien de particulier
t1 = id de la team 1 (int)
t2 = id de la team 2 (int)
j11 = id du joueur 1 de la team 1 (int)
j12 = id du joueur 2 de la team 1, vaut 0 s'il s'agit d'un inter-team à 1vs1 (int)
...
j17 = id du joueur 7 de la team 1, vaut 0 s'il s'agit d'un inter-team à 6 joueurs ou moins (int)
un champ id_team_1, id_team_2, ... et une table teams(id_team, id_joueur (+ eventuellement d'autres trucs))

j21 = id du joueur 1 de la team 2 (int)
...
j2s = id du joueur de la team 2 qui participe au match de mort subite s'il a lieu, vaut 0 sinon (int)
rs1 = résultat du match j11 vs j21, NULL si l'IT est en matchs de 2vs2 (text)
rs2 = résultat du match j12 vs j22, NULL s'il n'y a qu'un joueur par team ou si l'IT est en matchs de 2vs2(text)
...
rd1 = résultat du match j11-j12 vs j21-j22, NULL si l'IT est en matchs de 1vs1 (text)
rd2 = résultat du match j13-j14 vs j23-j24, NULL s'il n'y a que 2 joueurs par team ou si l'IT est en matchs de 2vs2
rd3 = résultat du match j15-j16 vs j25-j26, NULL s'il n'y a que 4 joueurs par team ou si l'IT est en matchs de 2vs2
rf = résultat du match j1s vs j2s, NULL s'il n'y a pas eu de mort subite
timestamp = indique le timestamp de la fin de l'inter-team
là je suis un peu paumé dans la finanlité de ta table en fait donc pour comprendre...
tjrs est-il que tu devrais diviser tes tables pour ne pas avoir de redondance d'un point de vue stockage des infos, c'est ensuite qu'on recompose lors des requetes.

tu connais les jointures ?

lolimut

  • Membre
  • 13981 posts
28 juillet 2009, 20:53
un champ id_team_1, id_team_2, ... et une table teams(id_team, id_joueur (+ eventuellement d'autres trucs))

id_team_1 et id_team_2 c'est fait, c'est en réalité t1 et t2, j'ai abrégé au max. J'avoue que pour s'y retrouver c'est pas top.
La table teams c'est aussi fait, sauf que j'ai pas besoin de id_joueur, en réalité dans la table membres y a un champ id_team pour relier directement le joueur à la team, et non l'inverse. Ca me semble plus pratique.

tjrs est-il que tu devrais diviser tes tables pour ne pas avoir de redondance d'un point de vue stockage des infos, c'est ensuite qu'on recompose lors des requetes.

tu connais les jointures ?

Jamais entendu parler...

Weby

  • Invité
28 juillet 2009, 21:02
left_join(...)

Aurelgadjo

  • Membre
  • 2377 posts
28 juillet 2009, 21:08
ça c'est l'inconvénient du sdz c'est qu'avec on apprend à faire du php mais pas du sql, donc on en arrive à des trucs hallucinants (cf ton probléme).

tu as deux tables:
voitures(id, id_proprietaire, couleur)
proprios(id, nom)

SELECT * FROM voitures, proprios WHERE voitures.id_proprietaire=proprios.id AND nom='robert' te donnera toutes les infos des voitures de robert, et ce même s'il en a plusieurs.

imagine appliquer ça à tes "matchs", je vais prendre un truc un peu plus pokemon pour prendre qqch que je connais

pokemon((int)id, (varchar)nom)
joueur((int)id, (varchar)nom)
pokemons_possedes((int)id_joueur, (int)id_pokemon, (int)niveau, (int)points_exp, (varchar)surnom, (datetime)date_cap, (bool)dans_equipe (ou (int) ordre_equipe, avec 0 = pas ds l'equipe))


SELECT pokemon.nom, joueur.nom
FROM pokemon, joueur, pokemons_possedes
WHERE pokemons_possedes.id_joueur=joueur.id AND pokemons_possedes.id_pokemon=pokemon.id AND joueur.id=1
va te retourner tous les pokemons du joueur n°1.
cette jointure là fait un produit cartésien des tables, produit cartésien sur lequel tu va faire tes WHERE & co. sql c'est surpuissant. voir http://sql.developpez.com/ (attention, sql est une norme, mysql un logiciel... mysql utilise certaines syntaxes qui ne sont pas normalisées)

lolimut

  • Membre
  • 13981 posts
28 juillet 2009, 21:20
Ah ouais je vois comment ça fonctionne.

Je vais retaper immédiatement mon script en adaptant les tables, pour voir ce que ça donne. Je donnerai des nouvelles en fonction du résultat.

Thanks

lolimut

  • Membre
  • 13981 posts
31 juillet 2009, 00:22
Bon, résultat : mon code est beaucoup plus simple, et le script a l'air de fonctionner.  :tibia:

Maintenant j'ai un autre problème. Je me lance dans le codage du forum (non, je veux pas de forum phpBB-like) et j'aimerais faire quelque chose concernant l'affichage des sujets (ça sera plus simple à comprendre là).

Voici ma table sujets_forum :
Spoiler
id (INT) (A_I)
categorie (SMALLINT) // L'id de la catégorie dans laquelle le sujet a été posté.
titre (TEXT)
pseudo (TEXT) // Le pseudo de l'auteur, évidemment...
message (LONGTEXT)
timestamp (BIGINT)
priorite (TINYINT) // 0 si sujet commun, 1 si "post-it", et éventuellement 2 pour un truc méga important.

Je voudrais donc faire une requête mysql qui renvoie les messages prioritaires en premier. Cool, ça je sais faire.
Par contre, ce que je ne sais pas faire, c'est classer les messages ayant une même priorité par leur timestamp pour afficher les plus récents en premier.


EDIT : Au passage, je ne comprends pas quelle est la différence entre les *CHAR et les *TEXT...


EDIT 2 : Je viens de m'apercevoir que j'ai une autre question à poser.

Dans ma table membres, j'ai les champs victoires (INT) et defaites (INT). Admettons que je veuille faire un classement des membres par le quotient victoires/defaites. Comment je fais, sans créer de nouveau champ si possible ?
« Modifié: 31 juillet 2009, 00:52 par Ang3l »

Weby

  • Invité
31 juillet 2009, 06:35
Pour le classement par timestamp, un simple "ORDER BY timestamp DESC" ?

Pour le 2nd, "ORDER BY victoires DESC AND defaites ASC" ?

EDIT : j'ai bien peur que ce ne soit plus compliqué que ça en fait, l'idéal étant de faire une sorte de "ORDER BY victoires/defaites DESC", mais je sais pas si c'est possible de faire un truc du genre...
« Modifié: 31 juillet 2009, 06:41 par Weby »

lolimut

  • Membre
  • 13981 posts
31 juillet 2009, 13:37
Pour le classement par timestamp, un simple "ORDER BY timestamp DESC" ?

Oui mais non, il faut que ce soit un ORDER BY priorite DESC puis un ORDER BY timestamp DESC pour les mêmes priorités.

Citer
"ORDER BY victoires/defaites DESC", mais je sais pas si c'est possible de faire un truc du genre...

Et en plus, si c'est possible, faut que je renvoie uniquement les entrées avec 1 défaite au moins, sinon kiffe ta division par zéro.

Weby

  • Invité
31 juillet 2009, 13:50
Bah, "ORDER BY priorite, timestamp DESC", la priorité est traîtée en premier, puis le timestamp est géré.

Pour la division par 0, lol, vivent les nombres irréels !

Aurelgadjo

  • Membre
  • 2377 posts
31 juillet 2009, 14:45
Un titre c'est un varchar (<255 chars) et des dates ça se stocke, pour etre propre, avec les champs qui vont bien (et on traite aprés les dates avec les fonctions qui vont bien, et ça c'est assez hard à piger).
Donc tu stockes un timestamp dans un type soit timestamp, soit date/datetime

Dans ma table membres, j'ai les champs victoires (INT) et defaites (INT). Admettons que je veuille faire un classement des membres par le quotient victoires/defaites. Comment je fais, sans créer de nouveau champ si possible ?

ORDER BY victoires/defaites DESC et pour la division par zero tu rajoute +0.0001 .. ? ou alors 3 requetes jointes" avec un union au milieu
ou peut-etre avec une table temporaire (cf man CREATE TEMPORARY TABLE)

EDIT : Au passage, je ne comprends pas quelle est la différence entre les *CHAR et les *TEXT...
Pour toi, c'est selon la capacité que tu as à stocker. Sinon, aprés mysql s'en sert pour s'organiser lui même sur la façon de stocker ses données. Simplement, si tu dis que tu va stocker un CHAR 30, à chaque ligne mysql va faire dans son fichier un espace de 30 chars, même si tu ne stockes que 10 chars. comme ça, si tu update avec une valeur de 20 chars, l'espace utilisé est toujours contigu. Inconvénient, si tu as à stocker du vide c'est à chier...
Alors qu'un varchar, tu dis à mysql que les champs seront de taille variable. si tu stockes 10 chars dans un varchar 30, il prendra 10 chars sur le disque. et en faisant un update avec un char 20, tu utilisera ~20 chars sur le disque mais de façon non contigue (pense à la défragmentation & co)

Pages: [1]    En haut ↑