Page 1 sur 2

Questions (boucle sur tables, requêtes via formulaire, etc.)

Posté : 21 nov. 2005, 20:50
par spirou
Bonsoir !!!

J'aurais quelques questions :P

1- J'ai fais un petit programme(ci-dessous) pour faire mes stats sur une table MySQL, je voudrais que ce programme se fasse sur 20 tables, il va donc falloir, je pense que j'utilise une boucle, mais je ne sais pas trop comment procéder pour faire une boucle sur une base de données, les noms de tables auront un morceau en commun (ex: sedan_matchs et lehavre_matchs), je pense que ceci pourrait être exploitable, pourriez-vous m'indiquez la manière de faire, ou une piste ?

2- Pour la mise à jour de mes tables, je souhaiterais savoir si aller chercher des informations sur un autre site web est "légal", faut-il des autorisations spécifiques du webmaster du site concerné (un site pro) ?
En clair, est-ce du piratage de données ?

3- Je souhaiterais faire mes requêtes SQL en passant par le formulaire de contact de mon site, bien sûr avec un user et un mot de passe complexe, ect-ce dangereux pour la sécurité de mon site de faire ceci ?

4- Subsidiaire : J'aimerais savoir sur ce code, si cela est possible de l'optimiser en l'allégeant, car étant débutant, il y a forcément des choses auxquelles je n'ai pas forcément connaissance et peut-être pas pensé, et je trouve le code un peu long pour le résultat que j'obtiens.
// Initialisation des variables 
//*******

$tt_bp_dom = 0;
$tt_bc_dom = 0;
$tt_spect_dom = 0;
$tt_bp_ext = 0;
$tt_bc_ext = 0;
$tt_spect_ext = 0;

mysql_connect('', '', '');	//connexion à mysql
mysql_select_db('');	// sélection de la base de données

// ****************************
// concerne les matchs à domicile
//*******

$dom = mysql_query("SELECT * FROM sedan_matchs WHERE lieu = 'dom'"); 
while($resultat_dom = mysql_fetch_array($dom))	// boucle récupérant les matchs à domicile
{
$bp_dom = $resultat_dom['bp'];
$bc_dom = $resultat_dom['bc'];
$spect_dom = $resultat_dom['spect'];
$tt_bp_dom += $bp_dom;
$tt_bc_dom += $bc_dom;
$tt_spect_dom += $spect_dom;
}

$max_spect_x = mysql_query("SELECT max(spect) FROM sedan_matchs WHERE lieu = 'dom'");		// plus forte affluence à domicile
$max_spect_dom = mysql_result($max_spect_x, 0);

$min_spect_x = mysql_query("SELECT min(spect) FROM sedan_matchs WHERE lieu = 'dom'");		// plus faible affluence à l'extérieur
$min_spect_dom = mysql_result($min_spect_x, 0);

$max_bp_x = mysql_query("SELECT max(bp) FROM sedan_matchs WHERE lieu = 'dom'");		// nbre maximum de but pour marqués à domicile
$max_bp_dom = mysql_result($max_bp_x, 0);

$max_bc_x = mysql_query("SELECT max(bc) FROM sedan_matchs WHERE lieu = 'dom'");		// nbre maximum de but contre encaissés à domicile
$max_bc_dom = mysql_result($max_bc_x, 0);

$jour_x_dom = mysql_query("SELECT COUNT(*) FROM sedan_matchs WHERE lieu = 'dom'");	// détermination du nbre de rencontre jouée à domicile
$jour_dom = mysql_result($jour_x_dom, 0);


$moy_spect_dom = ceil($tt_spect_dom / $jour_dom);		// moyenne spectateur à domicile (ceil arrondi à l'entier supérieur)
$moy_bp_dom = $tt_bp_dom / $jour_dom;		// moyenne des buts pour à domicile
$moy_bp_dom = number_format($moy_bp_dom, 2);	// arrondi le nbre avec deux décimale
$moy_bc_dom = $tt_bc_dom / $jour_dom;		// moyenne de buts contre à domicile
$moy_bc_dom = number_format($moy_bc_dom, 2);

$dif_but_dom = $tt_bp_dom - $tt_bc_dom;		// différence de but à domicile
if($dif_but_dom > 0)		// sert à placer le signe + si la différence de buts est positive
{
$dif_but_dom = "+ ".$dif_but_dom;
}

// ****************************
// concerne les matchs à l'extérieur
//*******

$ext = mysql_query("SELECT * FROM sedan_matchs WHERE lieu = 'ext'");
while($resultat_ext = mysql_fetch_array($ext))
{
$bp_ext = $resultat_ext['bp'];
$bc_ext = $resultat_ext['bc'];
$spect_ext = $resultat_ext['spect'];
$tt_bp_ext += $bp_ext;
$tt_bc_ext += $bc_ext;
$tt_spect_ext += $spect_ext;
}

$max_spect_y = mysql_query("SELECT max(spect) FROM sedan_matchs WHERE lieu = 'ext'");		// plus forte affluence à l'extérieur
$max_spect_ext = mysql_result($max_spect_y, 0);

$min_spect_y = mysql_query("SELECT min(spect) FROM sedan_matchs WHERE lieu = 'ext'");		// plus faible affluence à l'extérieur
$min_spect_ext = mysql_result($min_spect_y, 0);

$max_bp_y = mysql_query("SELECT max(bp) FROM sedan_matchs WHERE lieu = 'ext'");		// nbre maximum de but pour marqués à l'extérieur
$max_bp_ext = mysql_result($max_bp_y, 0);

$max_bc_y = mysql_query("SELECT max(bc) FROM sedan_matchs WHERE lieu = 'ext'");		// nbre maximum de but contre encaissés à l'extérieur
$max_bc_ext = mysql_result($max_bc_y, 0);

$jour_x_ext = mysql_query("SELECT COUNT(*) FROM sedan_matchs WHERE lieu = 'ext'");	// détermination du nbre de rencontre jouée à l'extérieur
$jour_ext = mysql_result($jour_x_ext, 0);

$moy_spect_ext = ceil($tt_spect_ext / $jour_ext);		// moyenne spectateurs à l'extérieur
$moy_bp_ext = $tt_bp_ext / $jour_ext;		// moyenne des buts pour à l'extérieur
$moy_bp_ext = number_format($moy_bp_ext, 2);	// arrondi le nbre avec deux décimale
$moy_bc_ext = $tt_bc_ext / $jour_ext;		// moyenne de buts contre à l'extérieur
$moy_bc_ext = number_format($moy_bc_ext, 2);
$dif_but_ext = $tt_bp_ext - $tt_bc_ext;		// différence de but à domicile
if($dif_but_ext > 0)		// sert à placer le signe + si la différence de buts est positive
{
$dif_but_ext = "+ ".$dif_but_ext;
}

// ****************************
// concerne tous les matchs
//*******

$journee = $jour_dom + $jour_ext;
$bp = $tt_bp_dom + $tt_bp_ext;
$bc = $tt_bc_dom + $tt_bc_ext;
$moy_bp = ($moy_bp_dom + $moy_bp_ext) / 2;
$moy_bc = ($moy_bc_dom + $moy_bc_ext) / 2;
$max_but_pour = max($max_bp_dom, $max_bp_ext);
$max_but_contre = max($max_bc_dom, $max_bc_ext);
$dif = $bp - $bc;
if($dif > 0)		// affiche le + en cas de différence positive
{
	$dif = "+ ".$dif;
}
$total_spect = $tt_spect_dom + $tt_spect_ext;
$moy_spect = ceil(($moy_spect_dom + $moy_spect_ext) / 2);
$max_spect = max($max_spect_dom, $max_spect_ext);
$min_spect = min($min_spect_dom, $min_spect_ext);

mysql_close();

// ****************************
//  Affichage des statistiques générales
//*******

echo '
<table class="stat">
  <tr>
    <th colspan="2"><div class="statTitreHG"></div><div class="statTitreHD"></div>Statistiques générales</th>
  </tr> 
	<tr>
		<td>Nombre total de matchs joués</td>
		<td>'.$journee.' matchs</td>
	</tr>
	<tr>
		<td>Total buts marqués</td>
		<td>'.$bp.' buts marqués</td>
	</tr>
	<tr>
		<td>Moyenne des buts marqués</td>
		<td>'.$moy_bp.' par match</td>
	</tr>
	<tr>
		<td>Maximum de buts marqués en un match</td>
		<td>'.$max_but_pour.' buts marqués</td>
	</tr>
	<tr>
		<td>Total des buts encaissés</td>
		<td>'.$bc.' encaissés</td>
	</tr>
	<tr>
		<td>Moyenne des buts encaissés</td>
		<td>'.$moy_bc.' par match</td>
	</tr>
	<tr>
		<td>Différence de buts</td>
		<td>'.$dif.'</td>
	</tr>
	<tr>
		<td>Total des spectateurs</td>
		<td>'.$total_spect.' spectateurs</td>
	</tr>
	<tr>
		<td>Moyenne des spectateurs</td>
		<td>'.$moy_spect.' spectateurs</td>
	</tr>
	<tr>
		<td>Plus forte affluence</td>
		<td>'.$max_spect.' spectateurs</td>
	</tr>
	<tr>
		<td>Plus faible affluence</td>
		<td>'.$min_spect.' spectateurs</td>
	</tr>
	<tr>
    <td class="piedStat" colspan="2">
      <div class="piedStatBG"></div>
      <div class="piedStatBD"></div>
    </td>
  </tr>
</table>';
	
// ****************************
//  Affichage des statistiques à domicile
//*******

echo '
<table class="stat">
    <tr>
      <th colspan="2"><div class="statTitreHG"></div><div class="statTitreHD"></div>Statistiques à domicile</th>
    </tr>   
	<tr>
		<td>Nombre de matchs joués à domicile</td>
		<td>'.$jour_dom.' matchs</td>
	</tr>
	<tr>
		<td>Buts marqués</td>
		<td>'.$tt_bp_dom.' buts marqués</td>
	</tr>
	<tr>
		<td>Moyenne des buts marqués</td>
		<td>'.$moy_bp_dom.' par match</td>
	</tr>
	<tr>
		<td>Maximum de buts marqués en un match</td>
		<td>'.$max_bp_dom.' buts marqués</td>
	</tr>
	<tr>
		<td>Buts encaissés</td>
		<td>'.$tt_bc_dom.' encaissés</td>
	</tr>
	<tr>
		<td>Moyenne buts encaissés</td>
		<td>'.$moy_bc_dom.' par match</td>
	</tr>
	<tr>
		<td>Différence de buts</td>
		<td>'.$dif_but_dom.'</td>
	</tr>
	<tr>
		<td>Total des spectateurs</td>
		<td>'.$tt_spect_dom.' spectateurs</td>
	</tr>
	<tr>
		<td>Moyenne des spectateurs</td>
		<td>'.$moy_spect_dom.' spectateurs</td>
	</tr>
	<tr>
		<td>Plus forte affluence</td>
		<td>'.$max_spect_dom.' spectateurs</td>
	</tr>
	<tr>
		<td>Plus faible affluence</td>
		<td>'.$min_spect_dom.' spectateurs</td>
	</tr>
	<tr>
    <td class="piedStat" colspan="2">
      <div class="piedStatBG"></div>
      <div class="piedStatBD"></div>
    </td>
  </tr>
</table>';

// ****************************
//  Affichage des statistiques à l'extérieur
//*******

echo '
<table class="stat">
    <tr>
      <th colspan="2"><div class="statTitreHG"></div><div class="statTitreHD"></div>Statistiques à l\'extérieur</th>
    </tr>   
	<tr>
		<td>Nombre de matchs joués à domicile</td>
		<td>'.$jour_ext.' matchs</td>
	</tr>
	<tr>
		<td>Buts marqués</td>
		<td>'.$tt_bp_ext.' buts marqués</td>
	</tr>
	<tr>
		<td>Moyenne des buts marqués</td>
		<td>'.$moy_bp_ext.' par match</td>
	</tr>
	<tr>
		<td>Maximum de buts marqués en un match</td>
		<td>'.$max_bp_ext.' buts marqués</td>
	</tr>
	<tr>
		<td>Buts encaissés</td>
		<td>'.$tt_bc_ext.' encaissés</td>
	</tr>
	<tr>
		<td>Moyenne buts encaissés</td>
		<td>'.$moy_bc_ext.' par match</td>
	</tr>
	<tr>
		<td>Différence de buts</td>
		<td>'.$dif_but_ext.'</td>
	</tr>
	<tr>
		<td>Total des spectateurs</td>
		<td>'.$tt_spect_ext.' spectateurs</td>
	</tr>
	<tr>
		<td>Moyenne des spectateurs</td>
		<td>'.$moy_spect_ext.' spectateurs</td>
	</tr>
	<tr>
		<td>Plus forte affluence</td>
		<td>'.$max_spect_ext.' spectateurs</td>
	</tr>
	<tr>
		<td>Plus faible affluence</td>
		<td>'.$min_spect_ext.' spectateurs</td>
	</tr>
	<tr>
    <td class="piedStat" colspan="2">
      <div class="piedStatBG"></div>
      <div class="piedStatBD"></div>
    </td>
  </tr>
</table>';

?>
5 - Merci :D

Posté : 21 nov. 2005, 21:19
par alexbad
1- J'ai fais un petit programme(ci-dessous) pour faire mes stats sur une table MySQL, je voudrais que ce programme se fasse sur 20 tables, il va donc falloir, je pense que j'utilise une boucle, mais je ne sais pas trop comment procéder pour faire une boucle sur une base de données, les noms de tables auront un morceau en commun (ex: sedan_matchs et lehavre_matchs), je pense que ceci pourrait être exploitable, pourriez-vous m'indiquez la manière de faire, ou une piste ?
Tu veux enregistrer toutes les mêmes données 20 fois?
2- Pour la mise à jour de mes tables, je souhaiterais savoir si aller chercher des informations sur un autre site web est "légal", faut-il des autorisations spécifiques du webmaster du site concerné (un site pro) ?
En clair, est-ce du piratage de données ?
S'il a pas mis son copyright nulle part, tu es protégé :P mais si c'est vraiment des trucs qui lui appartiennent, avise le (quoi que ça m'étonnerait qu'il te cherche avec une hace....
3- Je souhaiterais faire mes requêtes SQL en passant par le formulaire de contact de mon site, bien sûr avec un user et un mot de passe complexe, ect-ce dangereux pour la sécurité de mon site de faire ceci ?
Oui, c'est dangereux dans un certain sens. Mais si tu sécurise bien le tout, ça peut faire l'affaire. En plus, tu peux empêcher les requêtes "DELETE" , "TRUNCATE" etc. (à moins que tu en aie besoin).
4- Subsidiaire : J'aimerais savoir sur ce code, si cela est possible de l'optimiser en l'allégeant, car étant débutant, il y a forcément des choses auxquelles je n'ai pas forcément connaissance et peut-être pas pensé, et je trouve le code un peu long pour le résultat que j'obtiens.
J'ai pas lu tout le code (je suis pas un robot!!) mais c'est certain que tu peux l'alléger. C'est toujours le même tableau qui se répète, avec des données différentes:
données qui se répète = faire une boucle, c'est beaucoup plus simple et en plus, on n'aurait pas besoin de descendre l'ascenseur pour le voir au complet:P
5 - Merci Very Happy
De rien[/quote]

Posté : 21 nov. 2005, 21:57
par spirou
Tu veux enregistrer toutes les mêmes données 20 fois?
Non, en fait comme tu l'aura deviné, ce sont des tables concernant des résultats de matchs de foot, donc une table par équipe, soit 20 au total, donc ce que je voudrais, c'est remplacer chaque requête de mon code, par exemple :
$max_bp_x = mysql_query("SELECT max(bp) FROM sedan_matchs WHERE lieu = 'dom'");
Mais sedan_matchs serait remplacé par une variable, selon le choix de l'utilisateur, ah oui en fait je ne sais pas pourquoi j'étais parti sur une boucle, donc est-ce que c'est possible de faire par exemple une requête de ce style :
$table = "$_post['choix_equipe_utilisateur'];

$max_bp_x = mysql_query("SELECT max(bp) FROM $table WHERE lieu = 'dom'");
edit: oups, question à ignorer :oops:
S'il a pas mis son copyright nulle part, tu es protégé :P mais si c'est vraiment des trucs qui lui appartiennent, avise le (quoi que ça m'étonnerait qu'il te cherche avec une hace....
Ce sera d'un site pro, donc le copyright est certainement établi, je vais m'en tenir à mettre à jour moi même ma bdd, merci.
Oui, c'est dangereux dans un certain sens. Mais si tu sécurise bien le tout, ça peut faire l'affaire. En plus, tu peux empêcher les requêtes "DELETE" , "TRUNCATE" etc. (à moins que tu en aie besoin).
C'est pour l'instant un petit site perso qui va s'agrandir en fonction du temps que j'ai à passer dessus, la base de données, je la sauvegarderais régulièrement, donc ce qui m'ennuierais le plus, ce n'est pas que quelqu'un efface ma base de données, mais que l'on se serve de mon site pour émettre un virus ou autres cochonneries (j'ai vu que cela était possible).
Le html est bien désactivé dans mon formulaire.
J'ai pas lu tout le code (je suis pas un robot!!) mais c'est certain que tu peux l'alléger. C'est toujours le même tableau qui se répète, avec des données différentes:
données qui se répète = faire une boucle, c'est beaucoup plus simple et en plus, on n'aurait pas besoin de descendre l'ascenseur pour le voir au complet:P
Je me doute bien que tu n'es pas un robot :lol:
Dans mon tableau, les phrases diffèrent dans les <td>, c'est pour cela que je n'ai pas utilisé une boucle, je ne vois pas comment faire si les données de mes tableaux sont différentes :?


Merci de tes réponses :wink:

Posté : 21 nov. 2005, 23:11
par alexbad
Non, pas une table par équipe, mauvaise idée et perte de temps: 1 table au total avec un champ "équipe" dans lequel tu écris le nom de l'équipe "Les cougars de ST-Germain" par exemple :lol:

Ensuite, ça devient facile, tu fais une boucle ordinaire pour mysql:
<?php5

mysql_connect("localhost", "root", "");
mysql_select_db("database");

$sql = "SELECT * FROM table";
echo '<table>';
echo '<tr>';
echo '<th>Résultat</th>';
echo '<th>Adversaire</th>';
echo '</tr>';
$retour = mysql_query($sql);
while ($donnees = mysql_fetch_array($retour))//elle est ici la boucle 


          {
		  echo '<tr>';
		  echo '<td>' . $donnees['resultat'] . '</td>';
		  echo '<td>' . $donnees['adversaire'] . '</td>';
		  echo '</tr>';
          }

echo '</table>';		  
	  
	
mysql_close();
?>
Donc là, je me suis pas retaper ta table, je comprenais pas ton tableau, tu fais un <tr></tr> par <td></td>, ça m'a mélangé. Donc, le secret, une table pour tout le monde, elle est là la répétition inutile :wink:

Posté : 22 nov. 2005, 21:33
par spirou
Désolé, mais j'ai vraiment pas compris :?

Le code que tu m'as construit, c'est pour l'appliquer au code que j'ai déjà fait ?

Car je ne vois pas comment l'appliquer :oops:

J'aurais une autre question, comment construire une variable automatiquement, à partir d'un mot, exemple qui ne fonctionne pas :
if(!empty($_POST['valeur']))
{
	$variable = "$"."valeur";
}
C'est à dire faire que le $ se rajoute devant le texte, faire une génération automatique, je ne sais pas si je suis clair :sleeping:

:merci:

Posté : 22 nov. 2005, 21:51
par alexbad
Bah, tu mets le nom de ta variable:
$variable = $_POST['valeur'], autrement, je comprends pas la question. Mon script, c'est un exemple. C'est cette forme que doit prendre ton script.

Posté : 22 nov. 2005, 22:01
par spirou
Ok, je vais essayer de faire en utilisant ton exemple.

Ensuite pour ma question de variable se construisant automatiquement, ce serait en récupérant les valeurs d'un select, donc par exemple, je voudrais que 'choix1' devienne automatiquement $choix1, cela m'éviterait de définir une variable pour chaque <option> différentes.

Pendant que j'y suis, j'ai un autre problème, mon titre de page(h1), s'affiche 2 fois et je ne comprends pas pourquoi, pourrait tu m'éclairer ?
	if(empty($_POST['equipe']))
	{
			$choix_equipe = "sedan_matchs";
	}
	else
	{
			$choix_equipe = $_POST['equipe'];
	}
	
	list($equipe_titre_h1, $inutile) = explode('_', $choix_equipe);		// 1ère variable pour afichage du <h1>, la 2ème ne sert à rien
	
	echo'<h1>Statistiques championnat de '.$equipe_titre_h1.'</h1>'; ?>

Posté : 22 nov. 2005, 22:11
par alexbad
Tu parles d'un SELECT avec plusieurs choix ou avec 1 choix?

Que contient $inutile?

Posté : 22 nov. 2005, 22:25
par spirou
Oui il y a plusieurs choix, c'est pour cela que je me demandais s'il y avait moyen de générer les variables automatiquement, ce qui m'éviterait de faire par exemple :
$choix1 = $_POST['choix1'];
$choix2 = $_POST['choix2'];

Etc ...
Les noms de mes tables sont comme sedan_matchs, amiens_matchs, etc ..., donc je récupère le nom de l'équipe, matchs ne me servant pas, c'est pour cela que je l'ai appelée inutile.

Voilà :D

Posté : 22 nov. 2005, 22:28
par alexbad
Les <select></select> sont vraiment pas efficaces pour les choix multiples: 80% des gens ne savent pas comment les utiliser. Utilise des checkbox, si quelqu'un sait pas s'en servir... Voilà qui te sera utile pour récupérer les checkbox: http://www.creation-du-web.com/honolulu ... -php4.html

Posté : 22 nov. 2005, 22:51
par spirou
Les <select></select> sont vraiment pas efficaces pour les choix multiples: 80% des gens ne savent pas comment les utiliserl
Pourtant c'est pas bien difficile :(

Utiliser une vingtaine de boutons radios, cela fait beaucoup, c'est pour cela que j'avais opté pour les selects qui sont quand même plus appropriés pour le nombre de choix que j'aurais à proposer.
Tant pis je définirais une variable pour chaque option.

Pour mon problème de <h1>, je viens de modifier pour mettre tous mes caractères en majuscules, alors le 1er titre est en minuscule, et le 2nd en majuscule, et je ne comprends pas ce problème, comme si ce code était ignorer... et réexécuter une seconde fois ....

En tout cas merci beaucoup pour tes conseils :wink:

Posté : 22 nov. 2005, 22:55
par alexbad
C'est pas bien difficle, accordé. Seulement, si ton site est un site pour Monsieur et Madame tout le monde, tu devrais mentionné plus haut comment le faire parce que, tu te rendras vite compte que plusieurs personnes ne choisiront qu'un truc. Les cases à cocher, si tu regardes quand tu t'abonnes à Lycos par exemple, elle sont 4 par rangées (lorsqu'il demande "vos champs d'intérêts").

Posté : 26 nov. 2005, 18:33
par spirou
Bonjour !!

Je reprends mon post car je n'arrive pas à récupérer les valeurs de chaque table, on m'a conseillé d'utiliser foreach pour lister toutes mes tables, mais ensuite je bloque :(

Voici un bout de mon code :
foreach(array('sedan_matchs', 'bastia_matchs', 'amiens_matchs') as $table)
	{
			$dom = mysql_query("SELECT * FROM $table WHERE lieu = 'dom'"); 
			while($resultat_dom = mysql_fetch_array($dom))	
			{
					$bp_dom = $resultat_dom['bp'];
					$bc_dom = $resultat_dom['bc'];
					$tt_bp_dom += $bp_dom;
					$tt_bc_dom += $bc_dom;
					if($resultat_dom['bp'] > $resultat_dom['bc'])
					{
							$vict_dom++;
					}
					elseif($resultat_dom['bp'] < $resultat_dom['bc'])
					{
							$def_dom++;
					}
					else
					{
							$nul_dom++;
					}
			}
Je voudrais récupérer par exemple la valeur de $vict_dom de chaque table, j'ai essayé en utilisant ['..'], mais ça ne fonctionne pas.
Comment faut-il faire ?

Merci de votre aide.

Posté : 26 nov. 2005, 19:44
par Truc
Salut, ejoute le nom du cleub sur le quel tu veut avoir les résultats:
$dom = mysql_query("SELECT * FROM $table WHERE lieu = 'dom' AND club=".$table);
c'est ce que tu souhaites ?!

Posté : 26 nov. 2005, 20:17
par spirou
Oui, mais en faisant comme ça, je suis obligé de répéter autant de fois mon code qu'il n'y a a de table, et donc foreach n'a je pense plus d'utilité.
(dans mon exemple, il y a 3 tables, mais il y en a en tout 20)

Le code risque d'être très long.
Donc il n'y a pas d'autre choix que de faire la même requête sur chaque table ?