Select from random flere ganger

AlexanderAhlsen

New Member
Hei!

Jeg sitter her å jobber et nytt profil design til siden min og har et spørsmål:
Alle brukere på siden min har muligheten til å kunne vinne priser for forskjellige ting på siden.
For dette har jeg en tabell kalt "awarded" og en "awards".
"awarded" inneholder IDen til brukeren som har fått prisen og IDen til den prisen de har fått.
"awards" inneholder IDen for denne prisen, navn, bilde og beskrivelse.

Jeg plukker ut brukerens ID tidligere som jeg har puttet i en string kalt $id, så med dette plukker jeg ut priser brukeren har vunnet fra "awarded" tabellen for også ha med meg IDen for den prisen videre i en string kalt $award_id.
Så plukker jeg ut denne prisen fra tabellen "awards" og skriver ut et bilde for denne prisen på profilen. Men jeg vil ha 6 tilfeldige piser denne brukeren har vunnet, hvordan kan jeg få til å ha det i en string?

Dette er hva jeg har i config.php filen min jeg inkluderer på toppen av siden:
PHP:
<?php
	// SQL query
	$strSQL = "SELECT * FROM awarded order by RAND() LIMIT 6";

	// Execute the query (the recordset $rs contains the result)
	$rs = mysql_query($strSQL);
	
	// Loop the recordset $rs
	// Each row will be made into an array ($row) using mysql_fetch_array
	while($row = mysql_fetch_array($rs)) {

	   // Write the value of the column FirstName (which is now in the array $row)
	  $pris_id = $row['awards_id'];

	  }
?>

<?php
	// SQL query
	$strSQL = "SELECT * FROM awards WHERE awards_id='$pris_id' order by RAND() LIMIT 6";

	// Execute the query (the recordset $rs contains the result)
	$rs = mysql_query($strSQL);
	
	// Loop the recordset $rs
	// Each row will be made into an array ($row) using mysql_fetch_array
	while($row = mysql_fetch_array($rs)) {

	   // Write the value of the column FirstName (which is now in the array $row)
	  $pris_bilde = $row['awards_img_url'];

	  }
?>

Dette er det jeg har på siden der jeg skriver ut prisene:
PHP:
<?php
           echo "<img src='$pris_bilde' alt='' />";
	   echo "$pris_id";
?>

Noen som har en løsning på dette?
 

adeneo

Medlem
Jeg prøver meg selv om jeg ikke er helt sikker, men du henter først seks tilfeldige rader fra "awarded" tabellen, som du deretter looper over og skriver alle inn i samme variabel, som i utgangspunktet betyr at den til slutt kun inneholder den siste verdien.

Sikker på at det ikke er :

PHP:
<?php 
    $strSQL = "SELECT * FROM awarded order by RAND() LIMIT 6"; 
    $rs = mysql_query($strSQL); 
    $pris_id = array();
    while($row = mysql_fetch_array($rs)) {
        $pris_id[] = $row['awards_id']; 
    } 
?>

du mener ?

Slik at $pris_id nå er et array med de seks verdiene du har hentet.
Så skal du hente ut awards_id fra tabellen awards, og du ser ut til å forsøke å hente seks av de for hver av de forrige, som skulle tilsi at du får 36 awards_id, noe du ikke får ettersom $pris_id kun inneholder den siste raden fra forrige spørring, og slik går nå dagan ?

Hvis ikke jeg har misforstått så må du nok hente awards_id inne i loopen til $pris_id og skrive begge verdien fra de to spørringene til et array, eller om noen gidder å hoste opp et PDO eksempel med en join eller noe lignende, også bruke en foreach loop for å skrive ut resultatet med echo.
 

AlexanderAhlsen

New Member
Takk for hjelpen så langt!
Jeg har nå fått de 6 inn i en array som du sa, men jeg datt helt ut på det siste du skrev der. Hvordan skal jeg nå få ut de 6 siste skjønte jeg ikke helt.

Håper du kan hjelpe meg med dette :)
 

adeneo

Medlem
Det blir mye gjetting, og koden er skrevet rett inn her uten å teste slik det kan være trykkleif og andre snodigheter, men jeg så kanskje for meg at det var noe slikt :

PHP:
<?php  
    //hent først ID
    $strSQL = "SELECT * FROM awarded order by RAND() LIMIT 6";  
    $rs = mysql_query($strSQL);  
    $pris_id = array(); 
    while($row = mysql_fetch_array($rs)) { 
        $pris_id[] = $row['awards_id'];  
    }
    //nå som vi har seks tilfeldige ID'er, kan vi iterere over de og hente bilder
    $pris_info = array(); //sett opp ett nytt array først for å ha til å lagre i
    foreach ($pris_id as $id) {
        //hent info om hver ID
        $strSQL2 = "SELECT * FROM awards WHERE awards_id='$id'"; 
        $rs2 = mysql_query($strSQL2); 
        //forutsetter at det kun er en pris med denne ID'en
        while($row = mysql_fetch_array($rs2)) {
            $bilde = $row['awards_img_url']; 
            $beskr = $row['awards_img_beskrivelse']; 
        } 
        //vi kan bruke et multidimensjonelt array med ID som key
        $pris_info[$id] = array(
                                "bilde" => $bilde,
                                "beskrivelse" => $beskr
                               );
    }
    //nå har vi forhåpentligvis et array med ID som key, og hver ID inneholder et array med info
    //da kan vi itere litt igjen, selv om vi like gjerne kunne gjort dette i forrige loop, men for demonstrasjon
    foreach ($pris_info as $key => $value) {
        //vi skulle da ha alle verdiene for seks tilfeldige priser
        $pris_id = $key;
        $pris_bilde = $value["bilde"];
        $pris_beskr = $value["beskrivelse"];
        
        echo "<span class='prisId'>$pris_id</span>"; 
        echo "<img src='$pris_bilde' alt='' />"; 
        echo "<span class='prisBeskrivelse'>$pris_beskr</span>"; 
    }
?>

Ikke veldig effektivt, og litt pseudo kode, men noe lignende dette burde vel kanskje virke.
Du bør se på joins i SQL, og PHP's PDO funksjoner da det vil gjøre koden sikrere og sannsynligvis mer effektiv, men det kan være litt vanskeligere å sette seg inn til å begynne med.
 

adeneo

Medlem
"Trygt" er relativt, ingenting er trygt men er dette noe som er sensitivt og trenger å være så veldig trygt, utover at du bør tenke på SQL injections og slikt, og kanskje vurdere å benytte mysqli eller PDO i stedet for den gamle mysql funksjonen?
 

AlexanderAhlsen

New Member
Dette er er profiler for forumet mitt, basert på IP.Board så det burde være ganske trygt ja. Men jeg er ikke noe god på PHP, jeg plukker med meg litt her og der og endrer det jeg skal så jeg må få noe til å se på det :)
 
Topp