8796 sujets

Développement web côté serveur, CMS

Bonjour / Bonsoir à tous

Je ne sais pas si je suis débutant ou non car j'ai déjà développez pas mal de chose mais j'ai tout appris seul devant mon pac avec des site comme le site du zero pour ne pas le citer...

mais j'ai malgré tout un peu de mal à comprendre tout tjrs seul et ici je n'arrive pas à faire une ou deux requête sur deux tables différentes d'une même bdd à afficher dans un même et unique tableau.

en faite je vous montre direct ce que je tente de faire

classement joueur

ce que vous voyiez de ce classement vient tout de la même table

dans ma deuxieme table j'ai le nom de la tribu qui sera à remplacer par la valeur du tableau et le rang qui sera aussi à afficher dans le tableau.

<?php
	$temps_debut = microtime(true);
	
	require_once(dirname(__FILE__) ."./includes/fonctions.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
	<head>
		<meta http-equiv="Content-Language" content="fr"/>
		<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
		<meta name="robots" content="index, follow, all"/>
		<meta http-equiv="pragma" content="no-cache" />
		<meta name="Googlebot" content="no-archive" />
		<meta name="Publisher" content="Taaazzz" />
		<meta name="author" content="Taaazzz" />
		<meta name="Reply-to" content="zephirot@angel-le-prophete.be"/> 
		<meta name="Identifier-URL" content="http://www.angel-le-prophete.be/Les Anges Dechus/site/"/>
		<meta name="description" content="Ce forum est le regroupement des meilleurs joueurs de guerre tribal."/>
		<meta name="keywords" content="board, angel-le-prophete.be, angel-le-prophete.be/Les Anges Dechus, GT, humour, Guerre Tribal, jeu en ligne, mmorpg, jeux, pc, amusement, humour, délire, avatar, informatique, guerre, comment, web, pub, banniere, aide, glandage, pc"/>
		<meta name="Revisit-after" content="8" />
		<meta name="Date" content="Mon, 16 Aug 2009 20:37:00" />
		<link rel="first" href="index.php" title="Premier" />
		<link rel="shortcut icon" href="http://www.angel-le-prophete.be/favicon.ico" type="image/x-icon"/>
		
		<title>Les Anges Déchus - Gestionnaire de troupes</title>
		
		<!-- CSS -->
		<link rel="stylesheet" media="screen" type="text/css" href="./css/style.css"/>
	</head>
	<body>
	
		<center>	
		<!-- Banniéres aleatoire par javascript 
			<script language="javascript" src="js/banniere.js"></script>-->
		<!-- fin bannieres alea -->
			<a href='http://angel-le-prophete.be/Les%20Anges%20Dechus/' target="_blank"><img src="images/bannieres/ban-1.jpg" height="140px" alt="banniere"/></a>
<?php 

	// Spacer maison (créé des saut de ligne sans taper 10 000 <br />
	for ($i = 0; $i < 4; $i++) 
	{
		echo "<br />";
	}
?>
<table width="20%">
	<tr>
    	<td width="500" class="valign center">Rechercher un joueur : <input type="text" id="Name" onkeydown="doSearch(arguments[0]||event)"></td>
	</tr>
</table>

<div id="cadre_general">
<?php 
		connect(DB_GT);
		// --------------- Etape 1 -----------------
		// On écrit les liens vers chacune des pages
		// -----------------------------------------

		// On met dans une variable le nombre de village qu'on veut par page
		$NombreDeJoueurParPages = 100; // Essayez de changer ce nombre pour voir :o)
	
		// On récupère le nombre total de village
		$retour = mysql_query('SELECT COUNT(*) AS nb_joueurs FROM player_stats');
		$donnees = mysql_fetch_array($retour);
		$TotalDesJoueurs = $donnees['nb_joueurs'];
	
		// On calcule le nombre de pages à créer
		$nombreDePages  = ceil($TotalDesJoueurs / $NombreDeJoueurParPages);
		$nombreDePagesAAfficher = 14;
		$pageCourante = (!isset($_GET['page']) ? 1 : $_GET['page']);
		$pageDebut = (int)(($pageCourante - ($nombreDePagesAAfficher / 2) <= 0) ? 1 : $pageCourante - ($nombreDePagesAAfficher / 2));
		$estALaFin = false;

		if ($pageDebut + $nombreDePagesAAfficher >= $nombreDePages) {
			$pageDebut = $nombreDePages - $nombreDePagesAAfficher;
			$estALaFin = true;
		}

		// Puis on fait une boucle pour écrire les liens vers chacune des pages
	echo '<font color="#000000"><h1>Cliquer sur un des chiffres pour changer de page !</h1></font><br /> ';

		if ($pageDebut != 1) {
			echo '<div id="td_lien"><a href="classement_joueur.php?page=1" id="bouton_lien">1 ...</a> ';
		}
		

	for ($i = $pageDebut ; $i <= $pageDebut + $nombreDePagesAAfficher; ++$i)
		{
		echo '<a href="classement_joueur.php?page=' . $i . '" id="bouton_lien">' . $i . '</a> ';
		}

	if (!$estALaFin) {
		echo '<a href="classement_joueur.php?page=' . $nombreDePages . '" id="bouton_lien">... ' . $nombreDePages . '</a></div> ';
	}
?>
<br /><br />
<table align="center" border="1" cellpadding="1" cellspacing="0" width='70%'>
	<thead>
		<tr>
			<th colspan="7">
				<center><font size="4" color="#0707BD">Classement des joueurs (joueurs enregistré : <?php echo $TotalDesJoueurs ?>)</font><center>
			</th>
		</tr>
		<tr>
			<th><center>Rang</center></th>
			<th><center>Nom joueur</center></th>
			<th><center>Nbre de villes</center></th>
			<th><center>Points joueur</center></th>
			<th><center>Nom tribu</center></th>
			<th><center>Class. tribu</center></th>
		</tr>
	</thead>

<?php
// --------------- Etape 2 ---------------
// Maintenant, on va afficher les joueur
// ---------------------------------------
if (isset($_GET['page']))
{
	$page = intval($_GET['page']);
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
    $page = 1; // On se met sur la page 1 (par défaut)
}
// On calcule le numéro du premier joueur qu'on prend pour le LIMIT de MySQL
$PremierJoueurAafficher = ($page - 1) * $NombreDeJoueurParPages;
	$req = mysql_query('SELECT * FROM player_stats ORDER BY Rank LIMIT ' . $PremierJoueurAafficher . ', ' . $NombreDeJoueurParPages);
	$res = mysql_num_rows($req);
	$i=0;
	while ($i != $res) {
		$Id = mysql_result($req,$i,"Id");
		$Name = mysql_result($req,$i,"Name");
		$Alliance_id = mysql_result($req,$i,"Alliance_id");
		$Points = mysql_result($req,$i,"Points");
		$Rank = mysql_result($req,$i,"Rank");
		$Towns = mysql_result($req,$i,"Towns");
		$i++;
?>
	<tbody>
		<tr>
			<td align="center"><?php echo $Rank ?></td>
			<td align="center"><?php echo $Name ?></td>
			<td align="center"><?php echo $Towns ?></td>
			<td align="center"><?php echo $Points ?></td>
			<td align="center"><?php echo $Alliance_id ?></td>
			<td align="center"><?php echo "" ?></td>
		</tr>
	</tbody>


<?php
	}
	mysql_close();
?>
</table>

		<br />
</div>

<?php
	// Spacer maison (créé des saut de ligne sans taper 10 000 <br />
	for ($i = 0; $i < 5; $i++) 
	{
		echo "<br />";
	}

?>
		
		</center>

<?php 
	include('copyright.php');
	include('footer.php'); 
	
?>


Voici la structure de ma première table (celle quiaffiche les premiers info)

ps: dans la première table seul le Alliance_id est de même valeur que le id de la seconde table.


CREATE TABLE `player_stats` (
  `Id` int(11) NOT NULL,
  `Name` varchar(30) character set utf8 NOT NULL,
  `Alliance_id` int(11) NOT NULL,
  `Points` int(11) NOT NULL,
  `Rank` int(11) NOT NULL,
  `Towns` int(11) NOT NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


et voici le structure de la table ou allez chercher le reste des infos à afficher dans mon classement

CREATE TABLE `alliances_stats` (
  `Id` int(11) NOT NULL,
  `Name` varchar(30) character set utf8 NOT NULL,
  `Points` int(11) NOT NULL,
  `Rank` int(11) NOT NULL,
  `Towns` int(11) NOT NULL,
  `Members` int(11) NOT NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



je ne vous demande pas de me refaire tout mon script.. mais de bien vouloir me dire la requête à faire et me l'expliquer.. l'explication est importante aussi pour cas l'avenir je le retienne (je l'ai lue sur le site du zéro mais ils font trop de bourrage de crane et à la fin on comprend plus rien)



un énorme merci en tout cas à ceux qui accepterons de me venir en aide.

Amicalement Taaazzz
Modifié par Taaazzz (17 Apr 2010 - 11:47)
si ton alliance_id est bien le id de la deuxieme table.alors c'est une simple jointure de base.

je vais te faire une syntaxe a la INNER JOIN. au lieu de WHERE car c'est la methode à préferer
pour une jointure et là s'en est une.

exemple :

  FROM A INNER JOIN B ON A.id = B.Id_a


on va avoir des données de A plus les données de B qui correspondent à la condition dans
le ON ( les id correspondent quoi).

ensuite je vais introduire des raccourcis et des alias. parce que je suis déjà fatigué d'écrire^^
et puis le fait que tu utilises des champs ayant le même nom dans les 2 tables entrainent une subtilité d'ecriture.

eh oui si tu fais une requete qui ramene 2 champs ayant le même nom. tu n'auras la valeur que du 2eme champs ( le 2eme dans le select)

et les raccourcis c'est pour éviter de retaper entièrement tous les champs avec tous les noms de tables. hors si on le fait pas il y aura une requete AMBIGOUS QUERY de levé. et oui pareil tu as des champs au nom similaire.

mais c'est normal d'avoir des champs de même nom. c'est une bonne pratique.

par contre mettre des Majuscules dans les noms de champs de bases de données bof bof.
oui je sais insensibilité a la casse ( déjà tout dépend du classement) mais penses a ceux qui peuvent reprendre ton code.


raccourci
from player_stats ps

pour l'alliance j'ai pas mis as. as est un mot clé. celui des alias justement

exemple d'alias
ps.Name as `name_player`
ast.Name as name_alliance les ` ( c'est des ALT GR 7, Smiley biggol heureusement ils sont facultatif presque toujours, 2eme exemple je ne les mets pas )


Taaazzz a écrit :

SELECT * FROM player_stats ORDER BY Rank LIMIT ' . $PremierJoueurAafficher . ', ' . $NombreDeJoueurParPages);


devient

SELECT 
    ps.Rank as rank_player,
    ps.Name as nom_player,
    ps.Towns,
    ps.Points,
    ast.Rank as rank_alliance,
    ast.Name as name_alliance
FROM player_stats ps
INNER JOIN  alliances_stats ast ON ast.Id = ps.Alliance_id
ORDER BY ps.Rank LIMIT ' . $PremierJoueurAafficher . ', ' . $NombreDeJoueurParPages);


voila j'ai essayé d'expliquer.

j'ai pu me tromper dans les Majuscules ou faire une erreur bête mais le principe est là et je crois que c'est bon

bon courage pour la suite. je te laisse continué.
Modifié par CPascal (16 Apr 2010 - 21:20)
Franchement merci beaucoup, ton explication bien plus courte mais très clair (surtout que ça va dans ce que j'ai besoin en plus) m'a permis de faire ce que je voulais... elle était incomplète mais déjà bien partie pour que je puisse la finir..; maintenant je vais pouvoir améliorer tous mes scripts

mais bon va falloir que j'apprenne un peu plus sur les requêtes car je me sens bien souvent limiter en ne connaissant que celles de base Smiley langue


Encore un énorme merci Smiley smile
cool!

c'est bien que tu ais été autonome pour finir.

et je suis content d'avoir été clair Smiley ravi

peut-tu mettre le sujet à Smiley resolu dans le titre de ton premier post? (cf regle du forum)

Pascal
j'ai tester mais mon titre est un peu trop long Smiley langue

J'ai tjrs été autonome mais des fois le site du zéro( en faite tjrs pas juste des fois) est pas très clair il dise quoi faire mais pas quand le faire en plus de leur bourrage de crane donc de temps en temps j'ai besoin d'une bonne explication dans le probleme que je rencontre...


Grâce à toi j'ai fini de faire mon classement joueurs, meilleur combattant etc etc...