selection aleatoire

Eléphant du PHP | 171 Messages

18 nov. 2005, 12:55

Bonjour,
je souhaite créer une requête qui sélectionne 4 enregistrements au hasard dans une table à partir de leur id, sachant qu'un même enregistrement ne peut être tiré 2 fois.
J'enregistre ensuite les 4 sélections dans des vars de session pour traitement.
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4";
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() );
while ($total = mysql_fetch_array($result)) {

//création tableau sélection dans la session
$_SESSION['selection0'] = $total[0]; 
$_SESSION['selection1'] = $total[1] ;
$_SESSION['selection2'] = $total[2] ;
$_SESSION['selection3'] = $total[3] ;
}
Ce qui est étrange, c'est que par exemple echo $total[0] ne m'affiche rien,
mais echo $_SESSION['selection0'] me retournera bien un chiffre. idem pour les autres sélections.
Voyez vous ce qui ne va pas?

Eléphant du PHP | 171 Messages

18 nov. 2005, 12:58

de la même manière,
echo count($total);
me retourne 1, alors que
echo count($_SESSION)
me retourne 4

Mammouth du PHP | 1029 Messages

18 nov. 2005, 13:23

Le while fais une boucle donc tu devrais avoir ceci
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4";
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() );
while ($total = mysql_fetch_array($result)) {

//création tableau sélection dans la session
$_SESSION['selection'] = $total;
}
Ce qui ne t'arrangeras pas
mais ceci devrait-fonctionner non
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4";
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() );
$total = mysql_fetch_array($result)

//création tableau sélection dans la session
$_SESSION['selection0'] = $total[0];
$_SESSION['selection1'] = $total[1] ;
$_SESSION['selection2'] = $total[2] ;
$_SESSION['selection3'] = $total[3] ;
Heu c'est juste une réflexion
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 171 Messages

18 nov. 2005, 13:37

ça ne marche pas à cause de la boucle while qui manque sur le fetch_array

Invité
Invité n'ayant pas de compte PHPfrance

18 nov. 2005, 14:54

et si tu fais
var_dump ($total)
cela donne quoi?

Eléphant du PHP | 171 Messages

18 nov. 2005, 15:05

avec var_dump j'obtiens
bool(false)
 

Eléphant du PHP | 171 Messages

18 nov. 2005, 15:07

j'ai tendence à penser que c'est ma requête qui est mal construite, parcequ je ne vois vraiment pas pourquoi $total ne serait pas un tableau de 4 éléments.

Eléphant du PHP | 171 Messages

18 nov. 2005, 15:14

Bon, la requete a l'air bonne car quand je fais
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4"; 
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() ); 
while ($total = mysql_fetch_array($result)) { 

//création tableau sélection dans la session 
echo $total[0]; 
echo $total[1] ; 
echo $total[2] ; 
echo $total[3] ; 
} 
j'obtiens bien 4 valeurs distinctes. ça veut dire que le pb vient de l'enregistrement des éléments de $total dans la session, mais je ne vois pas ce qui cloche là...

Mammouth du PHP | 1029 Messages

18 nov. 2005, 15:25

avec var_dump j'obtiens
bool(false)
 
Ben là tu devrais avoir un tableau de 4 éléménts, après avoir fais mysql_fetch=_array
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 983 Messages

18 nov. 2005, 15:28

Salut,

Essaies cela:
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4";
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() );
while ($row = mysql_fetch_row($result)) 
     $total[] = $row[0];

foreach($total as $id) 
     echo 'Total: '.$id.'<br>';

Eléphant du PHP | 171 Messages

18 nov. 2005, 15:31

Salut,

Essaies cela:
PHP:
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4";
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() );
while ($row = mysql_fetch_row($result))
$total[] = $row[0];

foreach($total as $id)
echo 'Total: '.$id.'<br>';
ben ça marche parceque je ne fais pas appel à $_SESSION dans ce cas.

Eléphant du PHP | 171 Messages

18 nov. 2005, 15:44

pour éviter de se perdre, je récapitule ma question:
Pourquoi en faisant ceci
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4"; 
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() ); 
while ($total = mysql_fetch_array($result)) { 

//création tableau sélection dans la session 
$_SESSION['selection0'] = $total[0]; 
$_SESSION['selection1'] = $total[1] ; 
$_SESSION['selection2'] = $total[2] ; 
$_SESSION['selection3'] = $total[3] ; 
} 
on obtient count($total)=1, mais en faisant ceci
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4"; 
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() ); 
while ($total = mysql_fetch_array($result)) { 

//création tableau sélection dans la session 
echo $total[0]; 
echo $total[1] ; 
echo $total[2] ; 
echo $total[3] ; 
} 
on obtient count($total)=4

Mammouth du PHP | 983 Messages

18 nov. 2005, 15:46

Il suffit d'adapter un peu le code:
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4";
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() );
while ($row = mysql_fetch_row($result))
{
     $_SESSION['selection'][]=$row[0];
}
Tu obtiens une variable de session $_SESSION['selection'] étant elle-même u n tableau (tu y accèdes ainsi: $_SESSION['selection'][0] : sélection 1, $_SESSION['selection'][1] : sélection 2...)

Eléphant du PHP | 171 Messages

18 nov. 2005, 21:55

ripat, ta première solution me plait pas mal.
Seule interrogation, je pensais qu'à chaque actulisation de la page, la sélection aléatoire reprendrait depuis le début.
dans mon cas, la sélection est toujours la même quand on actualise la page.
Est-ce normal?

Mammouth du PHP | 983 Messages

19 nov. 2005, 00:33

:?:

Je te propose sinon cela:
$requete = "SELECT DISTINCT ID FROM occasions ORDER BY RAND() LIMIT 4";
$result= mysql_query($requete) or die (mysql_error() . mysql_errno() );
$i=0;
while ($row = mysql_fetch_row($result))
{
     $_SESSION['selection'.$i]=$row[0];
     $i++;
}
En sortie, tu auras tes variables de session $_SESSION['selection0'],$_SESSION['selection1']...
Testes ce code et dis si ca convient.
Modifié en dernier par rami le 19 nov. 2005, 17:55, modifié 1 fois.