Tirage au sort aléatoire de question sans doublon

Petit nouveau ! | 5 Messages

20 mars 2015, 12:35

Bonjour à tous,

je fais appel a votre communauté car on m'en a dit que du bien, et aujourd'hui c'est pas mon jour .. Malheureusement pour moi je m'en sors mieux sur MySQL 5 que PHP 5

Voila mon objectif, je dois être censé faire un tirage aléatoire de question pour un QCM, et ce sans avoir de doublons.
J'ai ma DB de faite avec ma table de question(No_question, lib_question, No_theme, No_competence) et ma table de réponse(No_reponse, lib_reponse, statut_reponse, #No_question)

Je vois pas comment je pourrais faire, mon idée était de récupérer les No_question dans un tableau avec une taille de x question (x est défini dans ma table Competence) et mélanger le tableau.

Si vous pouvez me mettre sur la voix, m'aider, m'éclairer, je vous en serais reconnaissant,

Merci à vous

Edit: dans ma logique ça pourrait donner ça
$sql3 = "SELECT nb_question FROM competence WHERE No_competence='".$competence."'";
$req = mysqli_query($con, $sql) or die("<center>La récupération du nombre de question à échoué</center>");
Pour Nb_question
Insérer le No_question dans un tableau (de taille Nb_question)
Sans avoir de doublons
Mélanger le tableau
Modifié en dernier par roooh le 20 mars 2015, 13:02, modifié 1 fois.

Mammouth du PHP | 2278 Messages

20 mars 2015, 13:01

Tu peux faire avec le tableau et en le mélangeant comme tu dis;
ensuite il suffit soit de faire une boucle
foreach ($tableau as $numquest)
{
    appel mysql sur avec $numquest
}
OU Supposant que tu connais le nombre de questions ($nbquest):
tirage au sort d'un nombre aléatoire ainsi
$deja = array();
$numquest = rand (0, $nbquest); // OU 1 
while (in_array ($numquest, $deja)
{
    $numquest = rand (0, $nbquest); // OU 1 
}
$deja[] = $numquest;
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

20 mars 2015, 13:10

Merci de ta réponse rapide,

Effectivement le nombre de question est récupéré par la requête qui sera stocké dans la variable, ici $nbquest. Il sera souvent entre 50 et 80 questions, donc variable en fonction de la compétence

En traduction ton second code nous insère le numéro de la question dans un tableau pour $nbquest si j'ai bien compris ?

Voici mon existant, j'essaie de faire au plus simple pour comprendre pour l'instant à partir de l'appel de la fonction.
function ajoutTest($candidat, $competence, $technologie) {
    /* On ajoute un test */
    $sql = "INSERT INTO `test`(`No_test`, `date_test`, `h_debut_test`, `h_fin_test`, `No_candidat`, `No_competence`, `No_technologie`) VALUES ('','','','','" . $candidat . "','" . $competence . "','" . $technologie . "')";
    $con = connexion();
    $req = mysqli_query($con, $sql) or die("<center>Le test n'a pas pu être attribué</center>");
    
    /* On récupère le numero du test lié au candidat */
    $sql2 = "SELECT No_test FROM test WHERE No_candidat ='".$candidat."' ";
    $req_noTest = mysqli_query($con, $sql2) or die("<center>Le SELECT de l'id du test à échoué</center>");
    $noTest = mysqli_fetch_assoc($req_noTest);
    $noTestFinal = $noTest['No_test'];
    
    /* On retourne le numero du test */
    return $noTestFinal;
}

if (isset($_POST['attribuer_test'])) {
    /* On récupère les valeurs des select */
    $candidat = $_POST['ajout_candidat'];
    $competence = $_POST['ajout_competence'];
    $technologie = $_POST['ajout_technologie'];

    $No_test = ajoutTest($candidat, $competence, $technologie);

    $sql3 = "SELECT nb_question FROM competence WHERE No_competence='".$competence."'";
    $nb_question = mysqli_query($con, $sql) or die("<center>La récupération du nombre de question à échoué</center>");
    
    $deja = array();
    $numquest = rand(0, $nb_question); // OU 1 
    while(in_array($numquest, $deja) {
        $numquest = rand(0, $nb_question); // OU 1 
    }
    $deja[] = $numquest;
}

Mammouth du PHP | 2278 Messages

20 mars 2015, 13:48

En traduction ton second code nous insère le numéro de la question dans un tableau pour $nbquest si j'ai bien compris ?
OUI, l'inconvénient c'est qu'il peut faire beaucoup de boucles, de plus en plus en allant vers la fin du qcm.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

20 mars 2015, 13:58

Merci !

Par contre Netbeans prends pas le in_array
Ca serait pas array ?

Mammouth du PHP | 688 Messages

20 mars 2015, 14:10

pas tout lu, mais une simple requet sql : select * from matable order by rand() limit 5
ne ferait pas l'affaire ?

Mammouth du PHP | 2278 Messages

20 mars 2015, 14:45

confirmation
http://php.net/manual/fr/function.in-array.php
que j'avais relu avant de poster (le lien est aec un tiret mais la fonction est avec un underscore)
Quelle idée de se servir de netbeans pour du PHp ! au miimum Bluefish, ou mieux eclipse avec l'extension php
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

20 mars 2015, 15:07

confirmation
http://php.net/manual/fr/function.in-array.php
que j'avais relu avant de poster (le lien est aec un tiret mais la fonction est avec un underscore)
Quelle idée de se servir de netbeans pour du PHp ! au miimum Bluefish, ou mieux eclipse avec l'extension php
Du coup j'ai regardé juste après avoir posté mon dernier message

Netbeans, oui mais notre prof (un peu en décalage avec la réalité), veut en projet netbeans php


Et $numquest sera alors le resultat de la requete SELECT No_question FROM question ?


Edit : Je viens de comprendre que le bout de code ne correspondra pas.
Je m'explique :
Les questions qui seront tirés dans la base de données ne correspondra pas à 1 - 2 - 3 ....
Dans la table Question il y aura pleins de questions mais qui n'appartiendront pas au même theme et à la même technologie,
on pourra très bien avoir 2 - 28 - 29 - 55 - 56 - 59 ....

Me suit-tu ?

Mammouth du PHP | 2278 Messages

21 mars 2015, 10:24

Il y a des cons partout : netbeans c'est vaguement bon pour java et d'une lenteur à faire peur.
A ce moment là, tu te sers de l'idée de top:
select * from matable order by rand() limit leombrevoulu where (test sur la compétence)
sur une table à moi
select * from mots  where categorie ='NOM' order by rand() limit 10;
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD