Avatar billede krydset Nybegynder
23. januar 2004 - 15:25 Der er 16 kommentarer og
2 løsninger

random script driller

Hejsa, jeg har det her script som udfra en db med film i returnere en tilfældig film, men scriptet returnere en tom post engang imellem, og jeg har ikke noget tomme poster i databasen, nogen der ved hvad der sker??
Mvh Krydset
-----------------------------------------------------------------

<?PHP
session_start();
/*
*    +-----------------------------------------------------------------------------+
*        Projekt Name:    Dvd arkiv Vers. 3
*    +-----------------------------------------------------------------------------+
*        Copyright Notes: Copyrights 2003 pc-dk.dk
*    +-----------------------------------------------------------------------------+
*      Disclaimer Notice(s)                                                         
*      DONT USE THIS SCRIPT UNLESS YOU HAVE MY PERMISSIONS ON PARER     
*      WITH MY PERSONAL SIGNATURE ANY QUESTIONS FOR THAT
*      SEND ME A MAIL: TLARSEN@PC-DK.DK                                                                   
*      IF YOU WANT TO USE THIS SCRIPT THEN MAIL ME AND PAY FOR IT
*    +-----------------------------------------------------------------------------+
*        Author(s): Thomas Larsen / Dk-Medieburner E-Mail: Tlarsen@pc-dk.dk
*    +-----------------------------------------------------------------------------+
*/

    #error_reporting(E_ALL); //For debuggin only, prints all error!   
                            //remove the # to debug

/**
*    Module comments (Brief shorly what this piece of code do)
    This script is generate a random movie from the database
*/

    //includes the file there is openings a connection to a database
    include_once("dbconnect.php");

/*
    Here starts the code
*/

//find the numbers of movies there is in the database
$res_antal = mysql_query("SELECT * FROM film") or die(mysql_error());
$antal = mysql_num_rows($res_antal);
//selects a random id from the database between 1 - $antal($antal it the numbers there is in the database)
$number = rand("1", "$antal");

//Make query to find at random movie in the databse
$movie_res = mysql_query("SELECT * FROM film WHERE id = '$number'") or die(mysql_error());





/*
    Here stops the code
    if you have any html
    write it belowe here
*/
?>

<html>
    <head>
        <title></title>
        <link rel="stylesheet" type="text/css" href="../style.css">
    </head>
   
    <body background="">
    <table>
        <?php
        while ($row = mysql_fetch_array($movie_res)) {
            ?>
            <tr>
                <td><?php echo $row['titel']; ?></td>
            </tr>
            <tr>
                <td><?php echo $row['beskrivelse']; ?></td>
            </tr>
            <tr>
                <td><?php echo $row['ejer']; ?></td>
            </tr>
            <tr>
                <td><?php echo $row['aar']; ?></td>
            </tr>
            <tr>
                <td><?php echo $row['lengde']; ?></td>
            </tr>
            <tr>
                <td><?php echo "<a href='read_rest_movie.php?id=$row[id]&titel=$row[titel]'>Læs resten</a>"; ?></td>
            </tr>
            <?php
        }
        ?>
   
    </body>
</html>
Avatar billede Slettet bruger
23. januar 2004 - 15:30 #1
Jeg gætter på dette senario:

Vi siger du har fire film i din database, som har id 0, 1, 2 og 3.

Dit script vil tælle 4 film, og
$number = rand("1", "$antal");
vil derfor vælge et tilfældigt nummer mellem 1 og 4.

Desværre er nummer 4 tom, fordi den sidste film har id nummer 3.
Avatar billede krydset Nybegynder
23. januar 2004 - 15:32 #2
jamendet lyder jo meget logisk, ved du osse en løsning :-D
Avatar billede schaefner Juniormester
23. januar 2004 - 15:36 #3
$movie_res = mysql_query("SELECT * FROM film ORDER BY RAND(NOW())") or die(mysql_error());
Avatar billede schaefner Juniormester
23. januar 2004 - 15:38 #4
men hvis du har sat dit id-felt til auto increment, så burde den starte fra 1. Du risikerer så tilgengæld at få problemer hvis du f.eks. sletter nogle poster i databasen, så kommer der jo huller.
Avatar billede Slettet bruger
23. januar 2004 - 15:39 #5
schaefners løsning er nok den bedste.

En anden kunne vel være at lave en variabel der indeholdte "$antal - 1" og bruge den istedet. Men jeg ved ikke om det ville virke efter hensigten..
Avatar billede schaefner Juniormester
23. januar 2004 - 15:40 #6
din måde at tælle antal poster er heller ikke særlig optimal. Du hiver jo samtlige rækker og felter ud bare for at tælle :)
Avatar billede schaefner Juniormester
23. januar 2004 - 15:42 #7
Hvis du skal tælle anteller, så brug:
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM film"),0);
Avatar billede detox Nybegynder
23. januar 2004 - 15:49 #8
Kunne laves sådan her:

$res = mysql_query("select * from film");
$antal = mysql_num_rows($res);
$number =  rand(0, $antal-1);
mysql_data_seek($res, $number);
$row = mysql_fetch_assoc($res);
mysql_free_result($res);

eller:

$antal = mysql_result(mysql_query("select count(*) from film"),0);
$number =  rand(0, $antal-1);
$res = mysql_query("select * from film limit $number,1");
$row = mysql_fetch_assoc($res);
mysql_free_result($res);
Avatar billede detox Nybegynder
23. januar 2004 - 15:53 #9
Eller som schaefner er inde på:

$res = mysql_query("SELECT * FROM film ORDER BY RAND(NOW()) LIMIT 1");
$row = mysql_fetch_assoc($res);
mysql_free_result($res);

men ORDER BY RAND() er vidst ikke lige optimal i alle versioner (om nogen) af MySQL ;o)
Avatar billede schaefner Juniormester
23. januar 2004 - 16:17 #10
nej, men det skulle vidst afhjælpes ved at sætte en tilfældig værdi imellem paranteserne
Avatar billede krydset Nybegynder
23. januar 2004 - 16:43 #11
Okay jeg er total forvirret nu :-O

Hvad skal jeg bruge og hvad skal jeg ikke bruge, og hvprfor kan jeg ikke bruge min metode??
Avatar billede krydset Nybegynder
23. januar 2004 - 16:45 #12
Men kan næsten regne ud det er pga. der er huller i pga. der har været slettet nogen i databasen
Avatar billede krydset Nybegynder
23. januar 2004 - 16:55 #13
Okay hvem ligger tættest på det her svar og er den god nok
$movie_res = mysql_query("SELECT * FROM film ORDER BY RAND() LIMIT 0,1") or die(mysql_error());
Avatar billede danino Nybegynder
23. januar 2004 - 17:12 #14
Ellers så prøv denne kode:
$resultat = mysql_query("SELECT * FROM film") or die(mysql_error());
$antal = mysql_num_rows($resultat);
while($row = mysql_fetch_object($resultat))
{
if($row->titel != "")
{ 
$film[] .= $row->id;
}
}
$number = rand(0, $antal);
$id = $film[$number];
$movie_res = mysql_query("SELECT * FROM film WHERE id = '$id'") or die(mysql_error());
Avatar billede schaefner Juniormester
23. januar 2004 - 17:17 #15
$movie_res = mysql_query("SELECT * FROM film ORDER BY RAND(NOW()) LIMIT 0,1") or die(mysql_error());

Har du prøvet den?
Avatar billede krydset Nybegynder
23. januar 2004 - 17:18 #16
Den jeg skrev virker fint, vil bare høre hvem der skal ha point?
Avatar billede schaefner Juniormester
24. januar 2004 - 11:28 #17
jamen, jeg kan da godt lægge et svar :)
Avatar billede krydset Nybegynder
01. februar 2004 - 13:56 #18
Så kan i dele ka i
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