Avatar billede searchjob Nybegynder
16. marts 2007 - 20:18 Der er 22 kommentarer og
1 løsning

Lave et random udtræk

jeg har en tabel i Mysql som hedder "onlineusers" og en anden tabel som hedder "locked_fields".

Den skal simpelthen lave en random udtræk fra 1-49, hvor i online_users IKKE er nogle der har samme felt fra det random udtræk.

det samme med "locked_fields".

Altså den skal hente et random tal, hvor det random tal IKKE er i "onlineusers" => "field_id" og "locked_fields" => "felt_id"

Svært at forklare, men håber i forstår på forhånd tak
Avatar billede jakobdo Ekspert
16. marts 2007 - 21:33 #1
Det giver slet ikke mening for mig! :o)
Avatar billede searchjob Nybegynder
17. marts 2007 - 02:01 #2
Den skal finde et random tal mellem 1-49.
Så er MySQL-tabellen "online_users" fyldt med nogle rækker, hvor felt_id indeholder et tal. Det samme med MySQL-tabellen "locked_field", hvor felt_id et et tal.

Så skal den tjekke om det random'e tal som var mellem 1-49 er "optaget" i tabellerne "online_users" og "locked_field" !
Avatar billede dkfire Nybegynder
17. marts 2007 - 12:23 #3
Du kan finde et tal med rand(1,49)
Derefter er det bare at lave to queries, en på onlineusers og en på locked_fields
Avatar billede searchjob Nybegynder
17. marts 2007 - 13:27 #4
sikke et fint svar.. det kunne jeg ikke bruge til noget
Avatar billede dkfire Nybegynder
17. marts 2007 - 13:50 #5
Okay jeg prøver en anden metode så:
rand() giver en vilkårligt tal, se evt http://dk.php.net/manual/da/function.rand.php

du kan så gøre
$tal = rand(1,49); // Finder et vilkårligt tal mellem 1 og 49, begge inclucive.
$query_users = "SELECT * FROM online_users WHERE felt_id = $tal ";
$query_locked = "SELECT * FROM locked_field WHERE felt_id = $tal ";

$result_users = mysql_query( $query_users );
if( !$result_users )
{
echo "Databasenfejl";
}elseif( mysql_num_rows( $result_users ) > 0 )
{
echo "Tallet $tal findes i tabelen online_users";
}else
echo "Tallet $tal findes ikke i online_users";

$result_locked = mysql_query( $query_locked );
if( !$result_locked )
{
echo "Databasenfejl";
}elseif( mysql_num_rows( $result_locked ) > 0 )
{
echo "Tallet $tal findes i tabelen locked_field";
}else
echo "Tallet $tal findes ikke i locked_field";
Avatar billede searchjob Nybegynder
17. marts 2007 - 14:43 #6
ja, ved godt hvordan jeg kan tjekke om de er i tabellen. men den skal jo lave et nyt tal, hvis det allerede eksisterer.

altså den skal udskrive det randomme tal som IKKE befinder sig i tabellerne!
Avatar billede dkfire Nybegynder
17. marts 2007 - 15:54 #7
Det kan gøre med en while løkke, men så kommer du nok til at forespørge databasen en del gange.
En anden idé vil måske være at finde ud af hvilke tal som findes i databasen og så derefter finde et tilfældigt tal som ikke er mellem dem.

$query_users = "SELECT felt_id FROM online_users ";
$query_locked = "SELECT felt_id FROM locked_field ";

$result_users = mysql_query( $query_users );
$result_locked = mysql_query( $query_locked );

while( $row = mysql_fetch_assoc($result_users))
    $userno[] = $row['felt_id'];
   
while( $row = mysql_fetch_assoc($result_locked))
    $lockedno[] = $row['felt_id'];

$tal = rand(1,49);   
while( !in_array($tal, $userno) && !in_array($tal,$lockedno))
    $tal = rand(1,49);

echo "Tallet $tal findes ikke i tabellerne";
Avatar billede searchjob Nybegynder
17. marts 2007 - 17:48 #8
så vil $tal jo bare få et nyt random tal, som ikke vides om er i databasen heller.. det fungere jo heller ikke
Avatar billede searchjob Nybegynder
17. marts 2007 - 18:02 #9
lavede selv en klasse...

<?php

/** MySQL data **/
define( "HOST"  , "localhost"  );
define( "USER"  , "root"      );
define( "PASS"  , "xxxxxxxxx"  );
define( "DB"    , "xxxxxxxx"  );

class RandomField
{
    var $LockedFields = array();
    var $UserFields  = array();
    var $Startroom    = 1;

    public function GetConnectionToMySQL()
    {
          mysql_connect( HOST, USER, PASS );
          mysql_select_db( DB );
    }

    public function CloseMySQLData()
    {
            mysql_close();
            exit;
    }

    public function InsertIntoArrayFromUsers()
    {
          $Query = mysql_query("SELECT field_id FROM onlineusers WHERE roomid = '" . $this->Startroom . "'");
          while ( $FetchData = mysql_fetch_assoc ( $Query ) )
          {
                $this->UserFields[] = $FetchData['field_id'];
          }
    }

    public function InsertIntoArrayFromLockedFields()
    {
          $Query = mysql_query("SELECT felt_id FROM locked_fields WHERE rumid = '" . $this->Startroom . "'");
          while ( $FetchData = mysql_fetch_assoc ( $Query ) )
          {
                $this->LockedFields[] = $FetchData['felt_id'];
          }
    }

    public function GetRandomField ()
    {
          $this->RandomField = mt_rand(0,50);
    }

    public function CheckFields ()
    {
          if ( !in_array ( $this->RandomField, $this->LockedFields ) && !in_array ( $this->RandomField, $this->UserFields ) )
          {
                echo "Tallet " . $this->RandomField . " er ledigt.";
          } else {
                $this->GetRandomField();
                $this->CheckFields();
                return false;
          }
    }
}

$Klasse = new RandomField;

$Klasse->GetConnectionToMySQL();
$Klasse->InsertIntoArrayFromUsers();
$Klasse->InsertIntoArrayFromLockedFields();
$Klasse->GetRandomField();
$Klasse->CheckFields();
$Klasse->CloseMySQLData();

?>
Avatar billede dkfire Nybegynder
17. marts 2007 - 20:56 #10
Det passer nu altså ikke helt hvad det er du siger, den kode jeg viste dig sidst finder et tal som ikke er i databasen.

Pas på dem at få en function til at kalde sig selv, når du ikke har styr over hvor mange gange den vil kalde sig selv. Det kan give dig resourseproblemer.
Avatar billede searchjob Nybegynder
17. marts 2007 - 20:58 #11
ja det frygtede jeg.. men kan du ikke forkalre din kode bedre så og bruge tuborg rammer i stedet for ? synes det er lidt rodet og forstår ikke en meter af det...!?
Avatar billede dkfire Nybegynder
17. marts 2007 - 23:49 #12
Jo det kan jeg da godt.
Grunden til at jeg ikke bruger { og } i while-løkker er at når jeg kun har en linie kode, så behøver jeg det ikke.
Men det ændre jeg lidt på så. :-)

$query_users = "SELECT felt_id FROM online_users ";
$query_locked = "SELECT felt_id FROM locked_field ";

// Finder de tal som er i tablerne
$result_users = mysql_query( $query_users );
$result_locked = mysql_query( $query_locked );

// Ligger tallene fra online_users i et array
while( $row = mysql_fetch_assoc($result_users))
{
    $userno[] = $row['felt_id'];
}

// Ligger tallene fra Locked_field i et array
while( $row = mysql_fetch_assoc($result_locked))
{
    $lockedno[] = $row['felt_id'];
}

// Laver et tilfældigt tal
$tal = rand(1,49);

// Sålænge $tal er i et eller begge array kører while-løkken, som bare finder et
// nyt tilfældigt tal. Whileløkken stopper når et tal, som ikke er en del af de
// to arrays er fundet.   
while( !in_array($tal, $userno) && !in_array($tal,$lockedno) )
{
    $tal = rand(1,49);
}

// Udskriver det fundne tal
echo "Tallet $tal findes ikke i tabellerne";

Håber du forstå det lidt bedre nu, ellers bare spørg.
Avatar billede dkfire Nybegynder
17. marts 2007 - 23:53 #13
$array[] = 34, lægger 34 ind på næste plads i et array, dvs at arrayet bliver forøget med 1.
Avatar billede searchjob Nybegynder
17. marts 2007 - 23:59 #14
while( !in_array($tal, $userno) && !in_array($tal,$lockedno) )
{
    $tal = rand(1,49);
}

så bliver tal jo bare et andet random tal, som ikke bliver tjekket om det er optaget jo!
Avatar billede dkfire Nybegynder
18. marts 2007 - 00:16 #15
Jo det er hele ideen med while.
Men jeg har lige lavet lidt forkert kan jeg se. Typisk mig.
Ret while til:
while( in_array($tal, $userno) || in_array($tal,$lockedno) )
{
    $tal = rand(1,49);
}

Jeg fik lige bytte rundt på sandt og falsk, lidt uheldigt.

Sålænge in_array($tal, $userno) && in_array($tal,$lockedno) er sandt, dvs $tal er i en af de to arrays, så kører while-løkken forfra. Den tjekker $tal hver gang indtil $tal har en værdi som gør at in_array($tal, $userno) || in_array($tal,$lockedno) er falsk, så stopper while-løkken og koden fortsætter.

for at gøre det kort, gør den følgende:
tjekker om in_array($tal, $userno) || in_array($tal,$lockedno) er sandt
hvis, laver den et nyt tal.
tjekker om in_array($tal, $userno) || in_array($tal,$lockedno) er sandt
hvis, laver den et nyt tal.
og sådan fortætter den indtil in_array($tal, $userno) || in_array($tal,$lockedno) er falsk.
Avatar billede searchjob Nybegynder
18. marts 2007 - 00:37 #16
kan da se det ikke virker..

den udskriver 1 selvom 1 er i en af tabellerne..
Avatar billede dkfire Nybegynder
18. marts 2007 - 12:48 #17
Har du ændret udtrykket i whileløkken ???
Avatar billede searchjob Nybegynder
18. marts 2007 - 12:50 #18
ja.
Avatar billede dkfire Nybegynder
18. marts 2007 - 13:14 #19
$query_users = "SELECT felt_id FROM online_users ";
$query_locked = "SELECT felt_id FROM locked_field ";

// Finder de tal som er i tablerne
$result_users = mysql_query( $query_users );
$result_locked = mysql_query( $query_locked );

// Ligger tallene fra online_users i et array
while( $row = mysql_fetch_assoc($result_users))
{
    $userno[] = $row['felt_id'];
}

// Ligger tallene fra Locked_field i et array
while( $row = mysql_fetch_assoc($result_locked))
{
    $lockedno[] = $row['felt_id'];
}

// Laver et tilfældigt tal
$tal = rand(1,49);

// Sålænge $tal er i et eller begge array kører while-løkken, som bare finder et
// nyt tilfældigt tal. Whileløkken stopper når et tal, som ikke er en del af de
// to arrays er fundet.   
while( in_array($tal, $userno) || in_array($tal,$lockedno) )
{
    $tal = rand(1,49);
}

// Udskriver det fundne tal
echo "Tallet $tal findes ikke i tabellerne";

Jeg har lige testet denne kode, dog med nogle fiktive tal i de to arrays, men det virker helt fint hos mig
Avatar billede dkfire Nybegynder
18. marts 2007 - 13:15 #20
Prøv lige at printe de to arrays ud inden whileløkken. Bare for at være sikker på at der findes nogle tal i dem.
Avatar billede dkfire Nybegynder
18. marts 2007 - 13:18 #21
Jeg prøvede med følgende kode:
<?php
$userno = array(1,2,3,4,5,9,46,23,36,27);
$lockedno = array(6,7,8,10,11,12,25,27,17,15,31,34,39,49,44);

$tal = rand(1,49);

// Sålænge $tal er i et eller begge array kører while-løkken, som bare finder et
// nyt tilfældigt tal. Whileløkken stopper når et tal, som ikke er en del af de
// to arrays er fundet.   
while( in_array($tal, $userno) || in_array($tal,$lockedno) )
{
    echo "Tallet $tal findes i tabellerne";
    $tal = rand(1,49);
}

// Udskriver det fundne tal
echo "Tallet $tal findes ikke i tabellerne";
?>
og fik ud:
Tallet 49 findes i tabellerne
Tallet 46 findes i tabellerne
Tallet 28 findes ikke i tabellerne
Avatar billede searchjob Nybegynder
18. marts 2007 - 14:03 #22
smid svar.. mig som lavede en fejl.. tak!
Avatar billede dkfire Nybegynder
18. marts 2007 - 14:20 #23
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester