Just nu i M3-nätverket
Gå till innehåll

Random nummer i MySQL(phpMyAdmin)


webbaccess.net

Rekommendera Poster

webbaccess.net

Tjenare!

 

Jag skulle vilja kunna köra så att den sätter random nummer som id istället för att den ökar..

det finns i MS access men har inte lyckats hitta det i mysql(phpmyadmin)

 

Någon som vet hur man gör detta?

 

Länk till kommentar
Dela på andra webbplatser

Jag saknade också det efter att ha bytt från Access till MySQL, men nu använder jag stigande ID till allt.

 

Du kan ju slumpa fram ett nummer m.h.a. PHP-funktionen Rand;

$id=rand(0, 123456);

...men då får du inte med några bokstäver, som i Access.

 

Får man fråga varför du vill slumpa ID? :)

 

 

Edit:

 

Googlade lite snabbt, och det verkar som att Rand är en funktion i MySQL också. :)

 

 

[inlägget ändrat 2008-02-14 23:28:06 av pelleabc]

Länk till kommentar
Dela på andra webbplatser

Hur kommer det sig, Jonas_Bo?

1. Finns ingen logisk eller praktisk anledning till att slumpa ett identitesfält

2. En extra kontroll måste införas för varje ny post så att dubblett ej slumpats fram

 

 

Länk till kommentar
Dela på andra webbplatser

Ingen praktisk anledning, men när jag själv började göra medlemssajter så ville jag inte att någon skulle kunna se vilket nummer en medlem hade. Bara en sådär löjlig sak som jag hade för mig.

 

Och det går väl att helt enkelt att bara tillåta unika poster...?

 

Länk till kommentar
Dela på andra webbplatser

men när jag själv började göra medlemssajter så ville jag inte att någon skulle kunna se vilket nummer en medlem hade

Vad har det med slumpning att göra. Antingen ser man id-fältet i url:ar/querystrings eller så gör man det inte. Eller menar du möjligheten att kunna gissa sig till en annan persons id utifrån ens eget? Spelar ju heller ingen roll eftersom du fortfarande måste logga in dig på den personens konto.

 

Och det går väl att helt enkelt att bara tillåta unika poster...?

Självklart, men det tar inte bort behovet av att kontrollera dubbletter eftersom åtgärder måste sättas in när en dubblett slumpas fram, dvs. en ny framslumpning. Overhead helt enkelt.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Vad har det med slumpning att göra. Antingen ser man id-fältet i url:ar/querystrings eller så gör man det inte. Eller menar du möjligheten att kunna gissa sig till en annan persons id utifrån ens eget? Spelar ju heller ingen roll eftersom du fortfarande måste logga in dig på den personens konto.

 

Menade att man kan se ID i URL:ar, och därmed se vilka som varit medlemmar längst, vilket jag inte ville skulle vara möjligt då. Av någon anledning som jag inte kommer ihåg.

 

Självklart, men det tar inte bort behovet av att kontrollera dubbletter eftersom åtgärder måste sättas in när en dubblett slumpas fram, dvs. en ny framslumpning.

 

Jag tänkte att om man använder MySQL-funktionen Rand i queryn så kanske den visste vilka nummer som vore otillåtna. Men nu har jag tagit en titt på funktionen och sett att man inte kan sätta in lägsta och högsta tillåtna värde i funktionen, utan att den bara returnerar ett värde mellan 0 och 1. Fel av mig.

 

$ok=FALSE;
while($ok == FALSE){
$id=rand(1, 999999);
if(!mysql_query("SELECT id FROM tabell WHERE id='$id'"){
 mysql_query("INSERT INTO tabell(id) VALUES('$id')");
 $ok=TRUE;
}
}

 

Kan den proceduren fungera?

 

(Kom ihåg att jag också är här för att lära mig.)

 

Länk till kommentar
Dela på andra webbplatser

Kan den proceduren fungera?

Jag använder inte PHP, men i princip är tanken rätt iallafall (koden stämmer säkert också, men det kan jag inte uttala mig om). Dock utför du lämpligtvis allt det där i en stored procedure.

 

Att Rand i mysql bara returnerar tal mellan 0 och 1 är inget problem, det är bara att multiplicera med toppvärdet, addera 1 och sedan avrunda till heltal så får du samma funktionalitet som i din php-variant.

 

När det gäller ditt önskemål om att inte exponera "äldsta medlemmar" så kan du ju alltid morfa till id:t lite i querysträngen, ex. genom att lägga till ett slumpat värde före och efter id:t, på formen xxxxIDyyyyy

Id:t 1234 skulle då kunna se ut så här i url:en

 

?id=3467212342348

Sedan är det bara att skala bort början och slutet av strängen på mottagarsidan, innan du använder id:t

 

Länk till kommentar
Dela på andra webbplatser

När det gäller ditt önskemål om att inte exponera "äldsta medlemmar" så kan du ju alltid morfa till id:t lite i querysträngen, ex. genom att lägga till ett slumpat värde före och efter id:t

Hehe, ja det hade ju varit ett enkelt trick. Frågan är bara om någon som brydde sig om ID-numret inte hade märkt metoden så småningom. ;) Men nu för tiden använder jag alltid vanligt stigande ID i MySQL, då jag tycker det underlättar kodningen. Men det är väl en smaksak, antar jag.

 

Tänkte inte på i mitt förra inlägg att man kanske borde kontrollera så att INSERT-kommandot verkligen fungerade. Och jag kom på att även om SELECT:en returnerar noll resultat så returnerar nog inte Mysql_query() false. Så detta stämmer nog lite bättre:

 

$ok=FALSE;
while($ok == FALSE){
$id=rand(1, 999999);
$res=mysql_query("SELECT id FROM tabell WHERE id='$id'");
if(mysql_num_rows($res) == 0){
 if(mysql_query("INSERT INTO tabell(id) VALUES('$id')")){
  $ok=TRUE;
 }
 else{
  exit(); // Eller vad man nu vill ska hända om det går snett.
 }
}
}

 

Länk till kommentar
Dela på andra webbplatser

webbaccess.net

Okej, så skapa en extra kolumn som den slumpar i är bättre...

Hur gör man detta?

 

Håller på att koda det i ASP och skulle vilja sätta en supportdel där man kan gå in och svara på sina poster och vill inte att man ska kunna ändra så man kommer in på någon annans support ticket...

[inlägget ändrat 2008-02-15 16:35:01 av webbaccess.net]

Länk till kommentar
Dela på andra webbplatser

Oj då, jag tänkte inte alls på ASP när jag läste PhpMyAdmin. :P

 

ASP är inte min starka sida, men du kan nog klura ut hur PHP:n ska översättas. :)

 

Lycka till!

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...