[php] Probleme de doublons

Résolu/Fermé
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 - 4 mars 2008 à 13:10
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 - 5 mars 2008 à 10:32
Bonjour,

Voila j'ai un probleme de doublons j'ai beau regarder partout personne n'a le meme probleme que moi.

Pos
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8

Voila en faite j'ai deux enregistrement dans ma bdd il me double 2 fois les chiffre j'en ai 3 il me triple 3 fois etc etc voici mon bout de code

for($z=1;$z<11;$z++)//pour de 1 à 10
{
$terri = mysql_query("SELECT * FROM territoire ORDER BY territoire");//vais chercher les enregistrements
while($terre = mysql_fetch_array($terri))
{

if($terre[$i+3] == $z)//si $terre[$i+3] est egal a $z alors on exécute ci dessous
{
echo '<td><center>' .$terre[$i+3]. '</center></td>';
echo '</tr><tr>';
}
elseif($terre[$i+3] != $z)//sinon si c'est different a execute cela
{
echo '<td><center>' .$z. '</center></td>';

}

voila pouvez-vous m'aidez svp
A voir également:

10 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
4 mars 2008 à 13:25
Bonjour,

Première remarque (et grosse remarque!), ta requète SQL :
$terri = mysql_query("SELECT * FROM territoire ORDER BY territoire");

Elle ne dépends d'aucune variable, donc je te conseille de la sortir de ta boucle principale, sinon avec ton script tu exécute a chaque passage dans boucle ( 11 fois donc) cette requête sur ta base de données, ce qui alourdie pour rien le traitement et le trafic réseau sur ta base de données. Il s'agit donc d'une erreur critique (en ce qui me concerne) même si ça n'a aucun rapport avec ton erreur.

Ensuite concernant ton algo je dirais qu'il n'y a aucune erreur, et que ton résultat (pseudo doublon) est tout à fait normal.
Reste à savoir ce que tu veux faire exactement en fait ?

Ce que fait précisément ton script :

Pour z de 1 à 11 :
  Si (mon_champ == z )
         out <- mon_champ  (ce qui revient à faire :  out <- z puisque c'est égal)
  Sinon
         out <- z


Ce qui peut etre traduit en ceci :
Pour z de 1 à 11 :
    out <- z


Code auquel tu rajoute une boucle sur le nombre d'enregistrements retournés par ta requête.
Conclusion sur ta sortie, tu aura bien écrit les chiffres de 1 à 11 autant de fois qu'il y a d'enregistrement retournés, ce qui est donc ton résultat actuel.

Que veux tu faire exactement ?

0
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 12
4 mars 2008 à 13:32
Ben en faite je voudrais qu'il m'affiche de 1 à 10 mais que les enregistrement dans ma bdd soit sorti bon en exemple j'ai dans ma bdd 1 5 et 9 et bien je voudrais que sa m'affiche le 1 de la bdd le 2 3 4 du script le 5 de la bdd 6 7 8 du script et le 9 de la bdd voila.
J'espere que tu as compris.

Merci de bien vouloir m'aider
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
4 mars 2008 à 13:57
Voilà pour te faire avancer un peu :


$result = mysql_query("SELECT * FROM territoire ORDER BY territoire");
$list = array();
while ( $line = @mysql_fetch_array($result) ){
   if( ! in_array($line[$i+3], $terrs ) )
   		$terrs[] = $line[$i+3];
}

for ( $z = 1; $z < 11; z++ ){
   // --- Check presence of $z in the array
   if ( in_array($z, $terrs ) {
		echo '<td><center>' .z. ' (array)</center></td>';
		echo '</tr><tr>'; 
	 }
	 else {
		echo '<td><center>' .z. ' (counter)</center></td>';
		echo '</tr><tr>'; 
	 }
   		
}


Utilisation d'un tableau pour stocker les valeurs de ta base de donnés, puis parcours de 1 à 11 avec un test de la présence de $z dans le tableau. Si oui, affichage d'une trace liée au tableau, si non affichage d'une trace liée au curseur.

Je n'ai pas testé le code donc il se peut qu'il y ai des erreurs, auquel cas corrige les.
0
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 12
4 mars 2008 à 15:26
re

$result = mysql_query("SELECT * FROM territoire ORDER BY territoire");
$list = array();
while ( $line = @mysql_fetch_array($result) ){
if( ! in_array($line[$i+3], $terrs ) )//alors il y a une petite erreur ici il n'aime pas $terrs
$terrs[] = $line[$i+3];
}

for ( $z = 1; $z < 11; $z++ ){
// --- Check presence of $z in the array
if ( in_array($z, $terrs )) {
echo '<td><center>' .$z. ' (array)</center></td>';
echo '</tr><tr>';
}
else {
echo '<td><center>' .$z. ' (counter)</center></td>';
echo '</tr><tr>';
}

}

sinon si je remplace $terrs par list il m'affiche que des counter, mais sinon je pense que c'est sur la bonne voie sinon c'est normale qu'à la ligne $terrs[] entre les crochet il n'y est rien???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
4 mars 2008 à 15:49
Oui effectivement il faut remplacer $terrs par $list, et ceci partout ^^ Au dépard j'avais écrit $terrs puis j'ai changé.

Sinon $lterrs[] = balabla permet de mettre quelque chose dans le tableau sans spécifier pour autant ou dans ce tableau (a quel indice). L'intéret est de stocker tes valeurs dans ce tableau, et si par la suite regarde si les indices (que tu incrémente dans ta boucle) sont stockés dans ce tableau (correspondent aux valeurs retrouvées dans la base de données)

Pour vérifier ce qui est stocké dans le tableau tu peux tenter de l'afficher juste avant ta boucle, ou encore mettre une trace lors de l'ajout :
if( ! in_array($line[$i+3], $list ) )//alors il y a une petite erreur ici il n'aime pas $terrs
$list[] = $line[$i+3];
echo "<BR>ajout de la valeur : ".$line[$i+3];
} 


Sinon je ne sais pas a quoi correspond $i (??) mais est tu certain que $i+3 correspondent bien à l'indice d'un élément retourné par ta requête SQL ?
0
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 12
4 mars 2008 à 16:23
je suis totalement perdu la pfiooouuu j'avais oublier une ligne de code et la ca me fait n'importe quoi


for($z=1;$z<11;$z++)//pour de 1 à 10
{
if($territoire[$i+2] == $a)//ceci permettait de filtrer car il y a plusieurs département de 1 à 10 et plusieurs territoire sur ces département de 1 à 10 aussi
{
$terri = mysql_query("SELECT * FROM territoire ORDER BY territoire");//vais chercher les enregistrements
while($terre = mysql_fetch_array($terri))
{

if($terre[$i+3] == $z)//si $terre[$i+3] est egal a $z alors on exécute ci dessous
{
echo '<td><center>' .$terre[$i+3]. '</center></td>';
echo '</tr><tr>';
}
elseif($terre[$i+3] != $z)//sinon si c'est different a execute cela
{
echo '<td><center>' .$z. '</center></td>';

}
}

Donc j'ai essayer de faire des modification ce qui me donne ca

$result = mysql_query("SELECT * FROM territoire ORDER BY territoire");
$list = array();
$list2 = array();
while ( $line = mysql_fetch_array($result) ){

if( ! in_array($line[$i+3], $list ) )
$list[] = $line[$i+3];
echo "<BR>ajout de la valeur : line +3".$line[$i+3];
if( ! in_array($line[$i+2], $list2 ) )
$list2[] = $line[$i+2];
echo "<BR>ajout de la valeur line +2: ".$line[$i+2];
}


for ( $z = 1; $z < 11; $z++ ){
if( in_array($a, $list2 )) {
// --- Check presence of $z in the array
if ( in_array($z, $list )) {
echo '<td><center>' .$z. ' (rentre)</center></td>';
echo '<td><center>' .$line[$i+1]. '</center></td>';
echo '<td><center>' .$line[$i+4]. '</center></td>';
echo '</tr><tr>';
}
else {
echo '<td><center>' .$z. ' (rentre pas)</center></td>';
echo '</tr><tr>';
}

}}

mais au final elle rentre tous aucune va dans ne rentre pas, peux-tu encore m'aidez stp
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
4 mars 2008 à 16:38
if( in_array($a, $list2 )) {


C'est quoi cette variable $a, rien à faire là, remplace par $z.


De toute manière ce que tu chercher à faire ne peut pas fonctionner.
Tu ne m'avais pas donné tout le problème au départ...

Là je vois que tu souhaite afficher des champs de ta requête SQL si tu trouve les valeurs, or ce n'est pas de cette manière que j'ai conçu le code plus haut.
En plus le code que je t'ai donné il faut fermer la boucle while, sinon ça ne risque pas de fonctionner correctement.

Voilà ce que je te propose à la place :
$result = mysql_query("SELECT * FROM territoire ORDER BY territoire");
$list = array();
$list2 = array();
while ( $line = mysql_fetch_array($result) ){

   if( ! in_array($line[$i+3], $list ) ){
    $list[] = $line[$i+3];
    echo "<BR>ajout de la valeur : line +3".$line[$i+3];
   }
   if( ! in_array($line[$i+2], $list2 ) )
     $list2[] = $line[$i+2];
      echo "<BR>ajout de la valeur line +2: ".$line[$i+2];
   }
}

for ( $z = 1; $z < 11; $z++ ){

   // --- Check presence of $z in the array
   if ( in_array($z, $list )) {
       echo '<td><center>' .$z. ' (rentre)</center></td>';
       echo '</tr><tr>';
     }
     else {
        echo '<td><center>' .$z. ' (rentre pas)</center></td>';
        echo '</tr><tr>';
     }

}
 


Pour ce qui est du système pour afficher les autres données je te laisse trouver.
0
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 12
4 mars 2008 à 18:41
re,

Le $a sert d'identifiant a la page car comme j'ai expliquer il y a 10 départements donc $a et l'un deux, je n'avais pas mis cette ligne la je m'en excuse je l'avais totalement zapper, et la boucle while n'était pas fermer car j'ai pas copier jusqu'au bout.
P.S: le liste2 servira juste a filtré car sinon je me retrouve avec plusieurs territoire du meme chiffre
edit: en faite ce que je veux vraiment c'est que si $a(est egal a département) est egal a 1 ben je veux que le script me prenne tous les territoire du département 1 parce que avec ton script il me prend tous les enregistrements c'est pour cela que j'ai plein de doublons et comme je l'ai dit j'ai en tout 10 département et 10 territoire par département.

J'espere que cette fois si je me suis bien fait comprendre
donc voici mon script en entier cette fois

<?
@session_start();
$pseudo= $_SESSION['pseudo'];
?>
<html>
<head>
<style type="text/css">
a:link {color:green}
a:visited {color:green}
</style>
</head>
<body bgcolor="black" style="color: #FFFFFF" >

<?php


include("common.php");
@sql($row);//fonction de requete
@sqlterritoire($ter);
includeLang('tech');//fonction des technologies
includeLang('buildings');//fonction des batiments
?>
<center>

<? include("includes/afficheressource.php"); ?>

<br>
<h1>Tous les territoires</h1><br>
<table border="2">

<tr>
<td width="50px"><center>Pos</center></td>
<td width="100px"><center>Pseudo</center></td>
<td width="100px"><center>Nom</center></td>
<td width="100px"><center>Action</center></td>
</tr>
<tr>

<?

$i=0;
$a=$ter['num_pla'];//permet d'afficher directement le joueur a son territoire
echo '<form action="territoire.php?page=next" method=post>';
echo 'Choississez la département ou vous voulez voir les territoires<br>';
echo '<p></p>';
echo '<input name="next" type="textbox">';
echo '<input type=submit value=">"><br>';
echo '<p></p>';
//echo 'Planete ' .$k;
if(@$_GET['page'] == 'next')
{
$a = @$_POST['next'];
}
if($a>10)//si $a supérieur a 10 alors message d'erreur
{
echo 'Aucun département n\'est aussi éloigné';
exit();
}
if($a == '')//si $a = rien ben $a=1
{
$a=1;
}
echo 'Département(s) ' .$a;


// $terri = mysql_query("SELECT * FROM territoire ORDER BY territoire");//vieux script que j'essayé
// while($territoire = mysql_fetch_array($terri))
// {
// if($territoire[$i+2] == $a)//si c'est egal à $a on affiche tous les territoire du département
// {

// echo '<td><center>' .$territoire[$i+3]. '</center></td>';
// echo '<td><center>' .$territoire[$i+1]. '</center></td>';
// echo '<td><center>' .$territoire[$i+4]. '</center></td>';
// echo '<td><center><a href="mail.php?page=' .$territoire[$i+1]. '"><img src="images/mail.jpg"></a><a href="attaque.php?num_pla=' .$territoire[$i+2]. '&territoire=' .$territoire[$i+3]. '"> <img src="images/attaque.jpg"></a><a href="espionnage.php?num_pla=' .$territoire[$i+2]. '&territoire=' .$territoire[$i+3]. '"> <img src="images/espion.jpg"></a></center></td>';
// echo '</tr><tr>';
// }
// $terri = mysql_query("SELECT * FROM territoire ORDER BY territoire LIMIT 100");
// while($terre = mysql_fetch_array($terri))
// {
// for($z=1;$z<11;$z++)
// {

// if($terre[$i+2] == $a)
// {
// if($terre[$i+3] == $z)
// {
// echo '<td><center>' .$terre[$i+3]. '</center></td>';
// echo '<td><center>' .$terre[$i+1]. '</center></td>';
// echo '<td><center>' .$terre[$i+4]. '</center></td>';
// echo '<td><center><a href="mail.php?page=' .$terre[$i+1]. '"><img src="images/mail.jpg"></a><a href="attaque.php?num_pla=' .$terre[$i+2]. '&territoire=' .$terre[$i+3]. '"> <img src="images/attaque.jpg"></a><a href="espionnage.php?num_pla=' .$terre[$i+2]. '&territoire=' .$terre[$i+3]. '"> <img src="images/espion.jpg"></a></center></td>';
// echo '</tr><tr>';
// }
// elseif($terre[$i+3] != $z)
// {
// echo '<td><center>' .$z. '</center></td>';
// echo '<td><center>Coloniser</center></td>';
// echo '<td><center>  </center></td>';
// echo '<td><center>  </center></td>';
// echo '</tr><tr>';

// }

// }
// }
// }
$result = mysql_query("SELECT * FROM territoire ORDER BY territoire");
$list = array();
$list2 = array();
while ( $line = mysql_fetch_array($result) ){

if( ! in_array($line[$i+3], $list ) )
$list[] = $line[$i+3];

if( ! in_array($line[$i+2], $list2 ) )
$list2[] = $line[$i+2];

}

//if( in_array($a, $list2 )) {
for ( $z = 1; $z < 11; $z++ ){

// --- Check presence of $z in the array
if (in_array($z, $list )) {

echo '<td><center>' .$z. ' (rentre)</center></td>';
echo '<td><center>' .$line[$i+1]. '</center></td>';
echo '<td><center>' .$line[$i+4]. '</center></td>';
echo '</tr><tr>';
}
else {
echo '<td><center>' .$z. ' (rentre pas)</center></td>';
echo '</tr><tr>';
//}

}}

?>

</table><br>


<center>
<? include("includes/pubsbaspages.php") ?>
<br>
<? include('copy.html'); ?>
</center>

<script type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2137276-2";
urchinTracker();
</script>

</body>
</html>

Voila j'espere que maintenant sa sera bon .
Franchement c'est super sympa de m'aidez malgres que je n'est pas expliquer bien comme il faut m'ont probleme
0
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 12
5 mars 2008 à 09:37
UP ^^
0
neo2099 Messages postés 164 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 9 avril 2020 12
5 mars 2008 à 10:32
Probleme resolu il fallait juste que je filtre dans la requete avec un where
0