Gå til innhold

Finne et tall i en streng (php & MySQL)


Anbefalte innlegg

Hei kloke hoder, jeg prøver, men får ikke til, følgende:

 

Fra kolonnen brukerindeks i en tabell har jeg hentet ut f.eks tore11117

Det jeg ønsker er at neste registrering i tabellen skal bli tore11118

Det jeg ender opp med er tore1...

 

Her er fremgangsmåten:

$sql_resultat = mysql_query($sql);

while ($arr=mysql_fetch_array($sql_resultat)){
   $bindeks= $arr['brukerindeks'];
   $teksttall = strstr("1", $bindeks);
   $tall = (int)$teksttall;
   $nytall =$tall+=1;
   $nyteksttall = (string)$nytall;
   $brukerindeks =$brukernavn;
   $brukerindeks.=$nyteksttall;

INSERT INTO osv...

 

Er det noen som ser hva jeg gjør galt?

 

Mvh Primaxx

Lenke til kommentar
Videoannonse
Annonse

Er det en fast lengde på tallene og bokstavene?

 

Hvis ikke kan du bare lage en funksjon som dette:

$var = "????1234";

 

for($i=1; $ok != true; $i++){

if(is_numeric(substr($var,$i))){

$ok = true;

}

}

$i--;

 

$ny_var = substr($var,0,$i);

$ny_var .= substr($var,$i)+1;

 

echo $ny_var;

 

EDIT:

Den er IKKE testet, så det kan hende at du må gjøre noen endringer.

 

Lykke til :thumbup:

Endret av ????????
Lenke til kommentar

Jeg har to eksempler til deg. Det ene inspirert av ????????, det andre laget med REGEXP.

 

1)

 

<?

$var = "????123LLÆÆkk";

for($i = 0; $i <= strlen($var); $i++) {

if(is_numeric(substr($var,$i,1))) {
 $tall = intval(substr($var,$i));
 break;
}

}

echo $tall;

?>

 

 

Denne finner det første sammenhengede tallet i stringen. I dette tilfellet vil den finne 123. Den vil kun printe ut 123 selv om det står bokstaver bak tallet.

 

 

2)

 

<?

 

$var = "????12343434";

 

preg_match("/.*?([0-9]+)$/", $var, $array);

$tall = $array[1];

echo $tall;

 

?>

 

Vil kunne printe ut tallet som er bakerst i stringen.

 

 

 

Tror ikke ??????? sitt eksempel fungerer skikkelig.

 

Edit: La på litt formatering.

Endret av RipZ-
Lenke til kommentar

Den fungerer greit om man fjerner "$ny_var = substr($var,0,$i);". Den gjør jo slik at du legger til starten av stringen. Og det blir vel litt feil i dette tilfellet, enig?

 

Uansett, måten du har gjort det på er ikke en veldig smart måte å skrive en loop på. Du bruker "$ok != true" som statement, noe som fører til en uendelig loop om stringen ikke avsluttes med et tall. Selvfølgelig, det vil ikke by på problemer om alle navnene har et tall på slutten. Men jeg har iallfall alltid lært at dette ikke er en smart måte å gjøre det på. Bruk heller "$i <= strlen($var)" slik at den automatisk blir stoppet når loopen har gått gjennom hele variabelen, og bruk break for å stoppe loopen på ønsket tidspunkt. Eller er du uenig?

Lenke til kommentar

Det første er jeg uenig i siden han vil ha det er nettopp det han vil ha, han vil IKKE sitte igjen med bare tallet:

Det jeg ønsker er at neste registrering i tabellen skal bli tore11118

 

Den andre er jeg enig i! Det var bare noe jeg satt sammen i farten ;)

Lenke til kommentar

Er det en fast lengde på tallene og bokstavene?

Det er (skulle vært) fast lengde på tallene, og de er alltid sist i strengen, men navnet foran hentes fra en variabel, så det kan være hva som helst...

 

 

Det jeg ønsker å få til er at det til slutt ser slik ut i kolonnen brukerindeks:

(eksempel)

 

tore11117

tore11118

sissel11113

sissel11114

tore11119

vera11112

tore11120

sissel11115

osv...

 

 

Grunnen til at jeg ønsker dette er forøvrig at innholdet i tabellen vises forskjellig avhengig av hvem som er logget inn, og jeg vil at (f.eks) Tore, når han ser på oppføringen tore11119 skal kunne klikke neste og da få opp oppføringen tore11120.

Det finnes kanskje en velkjent måte å løse dette på som ikke jeg vet om? :)

 

Det jeg har av identifikatorer i tabellen nå (før jeg la til feltet brukerindeks) er

indeks (autoindeksert) og

brukernavn, som registreres i henhold til brukernavnet i sesjonen.

Lenke til kommentar
Det første er jeg uenig i siden han vil ha det er nettopp det han vil ha, han vil IKKE sitte igjen med bare tallet:
Det jeg ønsker er at neste registrering i tabellen skal bli tore11118

Ai! Min feil. Trodde han bare ville hente ut tallet, jeg :blush:

 

Jeg er ikke helt sikker hvor du vil, primaxx. Men en slik bla-funksjon er nok bedre å kontrollere ved å hente neste bruker ved hjelp av index-raden du har satt opp. Eller der det slik at du vil hente neste brukernavn som er tilnærmet likt det forrige? Hva konkret er det du prøver på, og hvorfor er det så jævlig mange som heter Tore!? :p

 

Prøver du å lage noe slik som Hotmail f.eks har, at om brukernavnet allerede er registrert, så får man et eksempel på et nytt brukernavn beståendes av det foreslåtte brukernavnet pluss et tall? Og er det slik at du vil at alle brukernavnene skal være unike?

 

Uansett, så lenge du bruker MySQL, finnes det alltid noen smarte løsninger. Om du prøver å forklare litt mer om hvilket formål du har med scriptet, skal vi vel alltids klare å skrape sammen noe smart til deg. :yes:

Lenke til kommentar

Jeg er så dårlig til å forklare... :)

 

 

Dette er det jeg forsøker på: La oss si at jeg heter Tore (sic!).

Jeg er innlogget på siden, og sitter og ser på mine personlige ting (f.eks en oversikt over platene i platesamlingen min), som da er lagret i en tabell.

Min venninne Laila har også logget seg inn og sitter og ser på platene sine.

Hennes plater og mine plater er i den samme tabellen.

 

Ønskesituasjon:

Jeg sitter og ser på det jeg har lagt inn om platen "Hepp", med gruppen "Happ". Nederst på nettsiden ser jeg det står neste (eller forrige). Jeg vil at det som skjer er at jeg (Tore) skal kunne klikke på neste, og så få vist min neste oppføring i tabellen, og ikke bli logget ut slik det skjer i dag, da den neste oppføringen i tabellen faktisk er registrert av Laila, og ikke meg, så brukernavnet mitt stemmer ikke overens med det som ligger i tabellen, og jeg blir kastet ut.

 

Tabellen ser f.eks slik ut:

 

indeks brukernavn brukerindeks album artist

 

01 tore tore11112 frt øilck

02 tore tore11113 kvtcv uyroibgtouyr

03 laila laila11112 liyto utrciuyruziuyh

04 tore tore11114 hccc iouytfuv

05 tore tore11115 kut 5ilutuiyfi

06 laila laila11113 tuiriot uyfkurkuriu

 

(Prøvde, men klarte ikke, å få det over til å se ut som det faktisk sto u en tabell)

 

Forstår du nå hva jeg vil? Hvis jeg får feltet brukerindeks opp å gå kan jeg bruke det til neste/forrige omtrent som dette:

echo "<a href=\"" . $PHP_SELF . "?brukerindeks=" . ($brukerindeks ++1) .>Neste</a>

 

Sender jeg alle rett ut i tåka nå? :blush:

Lenke til kommentar
Er det en fast lengde på tallene og bokstavene?

 

Hvis ikke kan du bare lage en funksjon som dette:

$var = "????1234";

 

for($i=1; $ok != true; $i++){

if(is_numeric(substr($var,$i))){

  $ok = true;

}

}

$i--;

 

$ny_var = substr($var,0,$i);

$ny_var .= substr($var,$i)+1;

 

echo $ny_var;

 

EDIT:

Den er IKKE testet, så det kan hende at du må gjøre noen endringer.

 

Lykke til  :thumbup:

:thumbs: Fantastisk! Det virker! Måtte bare endre fra $i-- til $i++, da den telte nedover og ikke oppover...

 

Det eneste som er dumt er at jeg ikke skjønner hva det gjør...

Hvis du, ????????, en eller annen gang har lite å gjøre ville jeg blitt veldig takknemlig hvis du hadde giddet å forklare (m teskje) linje for linje... :blink:

Lenke til kommentar

Det første du burde gjøre er å endre litt på scriptet:

for($i=1; $i <= strlen($var); $i++){
 if(is_numeric(substr($var,$i))){
   $ok = true;
 }
}
$i--;

$ny_var = substr($var,0,$i);
$ny_var .= substr($var,$i)+1;

echo $ny_var;

 

Det scriptet gjør er at den tar teng for teng å sjekker når den kommer til et tall. Der tallet er deler den opp stringen i to og legger til 1 på tall delen. Så setter den sammen stringen igjen.

 

Siden det er en string bruker man is_numeric - da den sjekker om stringen er numerisk og ikke int. Substr deler opp stringen på det gitte antall tegn $i.

for() kjører en loop der $i øker for hver gang.

Lenke til kommentar
Det første du burde gjøre er å endre litt på scriptet:

for($i=1; $i <= strlen($var); $i++){
 if(is_numeric(substr($var,$i))){
   $ok = true;
 }
}
$i--;

$ny_var = substr($var,0,$i);
$ny_var .= substr($var,$i)+1;

echo $ny_var;

 

Det scriptet gjør er at den tar teng for teng å sjekker når den kommer til et tall. Der tallet er deler den opp stringen i to og legger til 1 på tall delen. Så setter den sammen stringen igjen.

 

Siden det er en string bruker man is_numeric - da den sjekker om stringen er numerisk og ikke int. Substr deler opp stringen på det gitte antall tegn $i.

for() kjører en loop der $i øker for hver gang.

Hmm...

 

Det nye scriptet genererte (med utgangspunkt i tore11126)

tore111261

 

i stedet for

tore11127

 

...

 

Hva er grunnen til at jeg ikke burde gå for den første varianten du skisserte?

 

Mvh Primaxx (Som er her i stedet for i barnetoget...) :eek:

Lenke til kommentar

Man burde ikke bruke den for den kan resultere i en infinitive loop. Dvs at hvis navnet ikke inneholder noen tall, vil loopen fortsette i det uendelige og resultere i at scriptet enten fortsetter i evighet, eller automatisk stopper etter et gitt antall sekunder avhengig av hva som står i konfigurasjonen.

 

<?

$var = "torebernard123456";

for($i = 0; $i <= strlen($var); $i++) { # Begynnelsen på loopen. Vil fortsette helt til hele strengen er gått gjennom, bokstav for bokstav

if(is_numeric(substr($var,$i))) { # Sjekker om resten av strengen er et tall fra en gitt posisjon. 

$tall = substr($var,$i); # Henter ut tallet ut i fra posisjonen styrt av loopen
$tall++; # Øker tallverdien med èn

$string = substr($var,0,$i) . $tall; # Legger sammen den delen av stringen som ikke er tall, og tallet som er økt med èn
break; # Bryter loopen

}

}

echo $string;

?>

 

Denne tror jeg funker til formålet. Har lagt til kommentarer også.

Lenke til kommentar
  • 2 uker senere...

Ville det ikke vært greiere om du hadde delt oppførings id'en i to i databasen.

Nå virker det som om det føres opp med en slags unik id konstruert av brukernavn+tall.

Vil tro det hadde vært mye greiere om du hadde lagt de to i hver sin post, så brukernavn og tall kunne hentes ut separat.

Da vil du enkelt kunne hente ut oppføringer av en bestemt bruker ved å bruke WHERE brukernavn = $brukernavn. Og så ordne oppføringene numerisk etter id'en for å lage "neste" "forrige" knapper.

Lenke til kommentar
Ville det ikke vært greiere om du hadde delt oppførings id'en i to i databasen.

Nå virker det som om det føres opp med en slags unik id konstruert av brukernavn+tall.

Vil tro det hadde vært mye greiere om du hadde lagt de to i hver sin post, så brukernavn og tall kunne hentes ut separat.

Da vil du enkelt kunne hente ut oppføringer av en bestemt bruker ved å bruke WHERE brukernavn = $brukernavn. Og så ordne oppføringene numerisk etter id'en for å lage "neste" "forrige" knapper.

Da vil ikke den numeriske biten telle én opp for hver ny registrering, noe jeg ønsker.

 

 

Det jeg prøver å unngå er dette:

Navn    ID
Ola       1
Ine       2
Ola       3
Ola       4
Ine       5

Det jeg har fått er dette:

Brukerindeks
Ola1
Ine1
Ola2
Ola3
Ine2

 

Det gjør det mye enklere for meg å lage neste/forrige-knapper, da jeg nå kun trenger å øke/minske den numeriske verdien på brukerindeks med 1, uten å bekymre meg over at det er andre brukere som har registrert oppføringer i tabellen i mellomtiden... :)

 

Men, som sagt, akkurat dette funker. Mitt store problem i denne sammenheng nå er dette:

Oppf. til tidl. problemstilling (tilbake/neste)

Endret av primaxx
Lenke til kommentar

Og fremdeles vil mitt forslag fikse det veldig enkelt og greit.

Den ID'en du snakker om nå er typisk standard auto increment id.

Jeg snakker om en id i tabellen som bare økes når den gjeldende bruker legger til noe.

 

Det vil være snakk om en marginal justering i database og litt forandringer på hente ut skript, skrive til skript og kanskje noen andre.

 

Jeg bare prøver å hjelpe deg til en bedre måte. Akkurat nå har du satt to infoer i samme tekst streng, det er klart det blir vanskelig da.

Men det er jo selvsagt opp til deg, om siden allerede har en del brukere og mye info ligger i databasen kan det være litt jobb å forandre det.

Lenke til kommentar
Og fremdeles vil mitt forslag fikse det veldig enkelt og greit.

Den ID'en du snakker om nå er typisk standard auto increment id.

Jeg snakker om en id i tabellen som bare økes når den gjeldende bruker legger til noe.

 

Det vil være snakk om en marginal justering i database og litt forandringer på hente ut skript, skrive til skript og kanskje noen andre.

 

Jeg bare prøver å hjelpe deg til en bedre måte. Akkurat nå har du satt to infoer i samme tekst streng, det er klart det blir vanskelig da.

Men det er jo selvsagt opp til deg, om siden allerede har en del brukere og mye info ligger i databasen kan det være litt jobb å forandre det.

Hmm, du sier noe. Vi tenker jo egentlig det samme, bare at jeg muligens har forvansket det hele litt...

 

Noe alá dette?

Hent tabell
Sjekk om Ola har registrert noe i tabellen tidligere

Hvis nei {
  Sett brukerindeks til 1
  Legg $data,  $brukernavn og brukerindeks inn i tabellen}

Hvis ja {
  Velg (fra tabellen)  brukerindeks med høyest verdi, og som er knyttet til Ola
  Øk verdien av brukerindeks med 1
  Legg $data,  $brukernavn og brukerindeks  inn i tabellen}

Send Ola tilbake til forsiden

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...