08. juni 2003 - 16:44Der er
46 kommentarer og 1 løsning
Find tal mellem 1-72
Hej (php-)eksperter Er der nogen af jer der kan hjælpe mig med at lave et script der finder et felt mellem 1-72 feltet må IKKE kunne findes i tabellen chat_felt under "navnet" feltid
Det må heller IKKE kunne findes i tabellen chat_online under "navnet" felt
1) Find de tal, det ikke må være 2) Sortér dem 3) Tæl dem 4) Find et tilfældigt tal mellem 1 og "72 minus tallet fra punkt 3" 5) Gennemgå listen med "forbudte tal". For hver iteration: -Hvis tallet er under eller lig med det tilfældige tal: Læg én til det tilfældige tal -Hvis tallet er over det tilfældige tal: Afslut løkken Så skulle den være der...
versters > Jo, der er samme risiko. Og selv om den husker hvad den har testet, så kan jeg ikke lige se et sted hvor den information bliver brugt. Det gør heller ikke andet end at aflaste databasen.
dea_pg > Yes-yes, det så jeg godt. :) Det var bare din kommentar om at vesters' forslag kunne lave uendelig løkke, hvorefter du selv viste kode med samme risiko. :)
Men det kommer vel også an på, hvordan felterne bliver fyldt. Det er jo ikke sikkert, at de bliver "optaget" i ASC rækkefølge. Man kunne jo forstille sig, at felter den allerede var gået forbi i sit gennemløb, blev frigjort imens...
Nej mit virker ikke, da jeg kalder en funktion, som ikke er skrevet med. Du burde kunne bruge dea_pg's, da koden er mere komplet (men ellers næsten er det samme:-)). Den skal så vidt jeg kan se, bare sættes ind, for at virke...
vester> Ja, hvis der kan ske væsentlige ændringer i data på de par milli-sekunder, så skal man selvfølgelig tage hensyn til det. (I øvrigt er min algoritme ligeglad med rækkefølgen...)
www.duzer.dk> Du oversætter punkterne ét af gangen til PHP. Hvis du går i stå, så spørger du bare. (Jeg laver ikke færdig kode til dig, for det lærer du nok ikke noget af, og så spilder jeg bare min tid.)
dea_pg > Hvad sker der, hvis tallet 27 er taget, og rand() (tilfældigvis) giver 27 hver gang. Hvad standser så rekursionen? Eller, mere realistisk, hvad nu alle tal er taget? Eller, mere interessant, hvad nu hvis NÆSTEN alle tal er taget? Hvis der kun er ét tal tilbage, så vil der ca. hver 20. skulle 200 rekusioner til, før det sidste tal bliver udtrukket. At have 200 funktioner kørende på samme tid er ikke så smart, især når jobbet gøres bedre med én. ;-)
www.duzer.dk > Ja, det virker nu, mens du tester det. Men hvad så når systemet er taget i brug? Du kan evt. læse et par af mine tidligere kommentarer for at se problemet.
500? Den skulle ikke kunne opstå blot fordi der er mange fejlter... Hvad står der i fejl-loggen? Må jeg lige se de to SQL-queries du bruger til at finde de tal er der "optagede"?
Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, casper@realzign.dk and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Hov... det gør den alligevellet.. kommer i tanke om at jeg selv klikkede derhen... den starter nemlig med at man kommer ind på chatten... på felt 1... hvis man så opdatere siden kommer den med fejl 500
Det er hvad der står i min error log.. jeg slettede alt og gik ind og fik fejlen igen
[Sun Jun 08 18:51:53 2003] [error] [client 127.0.0.1] File does not exist: C:/server/Apache2/htdocs/hemligt/yiir/chat/menu_mellemrum.gif [Sun Jun 08 18:54:08 2003] [error] [client 127.0.0.1] File does not exist: C:/server/Apache2/htdocs/hemligt/yiir/chat/menu_mellemrum.gif [Sun Jun 08 18:54:19 2003] [error] [client 127.0.0.1] Premature end of script headers: php.exe [Sun Jun 08 18:54:30 2003] [error] [client 127.0.0.1] Premature end of script headers: php.exe [Sun Jun 08 18:54:31 2003] [error] [client 127.0.0.1] Premature end of script headers: php.exe [Sun Jun 08 19:02:21 2003] [error] [client 127.0.0.1] Premature end of script headers: php.exe [Sun Jun 08 19:09:54 2003] [notice] Parent: Created child process 248 [Sun Jun 08 19:09:56 2003] [notice] Child 248: Child process is running [Sun Jun 08 19:09:56 2003] [notice] Child 248: Acquired the start mutex. [Sun Jun 08 19:09:56 2003] [notice] Child 248: Starting 250 worker threads.
Har prøvet at lave noget selv men det virker hellerikke :
function findnext($tal){
$query = mysql_query("SELECT * FROM chat_online WHERE rumid = '1' order by felt") or die(mysql_error()); while($felter = mysql_fetch_array($query)){ $optaget[$felter[felt]] = 'o'; }
$query1 = mysql_query("SELECT * FROM chat_felt WHERE rumid = '1' order by feltid") or die(mysql_error()); while($felter1 = mysql_fetch_array($query1)){ $locked[$felter1[feltid]] = 'l'; }
$query = mysql_query("SELECT * FROM chat_online WHERE rumid = '1' order by felt") or die(mysql_error()); while($felter = mysql_fetch_array($query)){ $optaget[$felter[felt]] = 'o'; }
$query1 = mysql_query("SELECT * FROM chat_felt WHERE rumid = '1' order by feltid") or die(mysql_error()); while($felter1 = mysql_fetch_array($query1)){ $locked[$felter1[feltid]] = 'l'; }
Jeg vil anbefale dig at gå helt tilbage til mit oprindelige forslag. Oversæt stille og roligt punkt 1 til 5 til PHP. Koncentrer dig om ét punkt af gangen, og glem alle de andre imens.
Bare sig til hvis det giver problemer, jeg forlanger ikke andet, end at du prøver.
okey jeg har lavet punkt 1... men hvad mener du med 2) Sortér dem ?- og hvad mener du med tæl dem... vil det sige plusse alle tallene, eller tælle hvor mange felter man ik kan stå på?
Nu ved jeg så ikke hvordan du har lavet punkt et, men hvis du fx. har gjort sådan her: $niks[$tal] = true; Altså så du har et array hvor key på hvert element er et tal, der ikke må udtrækkes, så kan du sortere sådan her: ksort($niks); Det er væsentligt fordi vi senere tager dem fra en ende af, hvor vi starter med de laveste.
Og med at "tælle" dem mener jeg ganske korrekt at tælle dem, og ikke at lægge dem sammen. ;-) $antal = count($niks);
$query = mysql_query("SELECT * FROM chat_felt WHERE rumid = '1'") or die(mysql_error()); $i = mysql_num_rows($query); $query1 = mysql_query("SELECT * FROM chat_online WHERE rumid = '1'") or die(mysql_error()); $i1 = mysql_num_rows($query1);
Det felt, der indeholder det tal, der ikke må udvælges, hedder det "feltid"? I så fald, så skriv "feltid" i stedet for "*" i dine sql-queries, og ret "$q[feltid]" til "$q['feltid']". Du behøver ikke tilføje 1-taller til dine variabel-navne. Da du ikke skal bruge de eksisterende variabler længere, kan du blot overskrive dem.
Gennemløb af array:
foreach($niks AS $tal=>$dummy) { echo "<p>Tallet '$tal' må ikke kunne udvælges.</p>"; }
"$tal=>$dummy" ser lidt fjollet ud her, men det er også lidt specielt med et array hvor det er nøglerne der er interessande, og selve indholdet er ligegyldigt. :)
foreach($niks AS $tal=>$dummy) { echo "<p>Tallet '$tal' må ikke kunne udvælges.</p>"; if($Rtal => $tal){ $Rtal = $Rtal + 1; } else { break; // afslut foreach, ingen grund til at fortsætte. } }
Så mangler du vist bare et enkelt tjek:
$tn = 72-$antal; if ($tn<1) { return -1; // Eller hvad du nu synes er bedst. }
$tn vil give 0, hvis alle 72 muligheder er optaget.
I dette array vil "Arne" automatisk få tildelt nøglen "0", Bent får "1" og Christian får "2". Denne nøgle kan måske være interessant at have adgang til:
foreach($navne as $key=>$navn) { echo "<p>Næste navn: $navn (har nummer $key)</p>"; // $navn indeholder det samme som $navne[$key] }
"=>" betyder her ikke "lig med eller større end", betragt det som en pil. :)
foreach har en ret underlig syntax, men den er nu meget praktisk. :)
Okey tak for det.. så forstår jeg det lidt bedre ;)
Synes godt om
Ny brugerNybegynder
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.