Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  18 1124
Sliter litt her nå.
Hvordan får jeg PHP til å IKKE fjerne 0 som første tall i en string?

Postnummeret 0528 for eksempel vil returnere som ugyldig fordi php fjerner 0.
Har prøvd med både is_numeric(), is_int() og intval().
Hva gjør jeg feil?

Her er koden min:

Kode

if(empty($postnr)){
	$feil .= "<li>Du må skrive inn et postnummer!</li>";
}elseif(!is_numeric($postnr)){
	$feil .= "<li>Postnummer kan kun være tall!</li>";
}elseif(strlen($postnr) != 4){
	$feil .= "<li>Postnummer er ikke gyldig!</li>";
}
Kan du ikke bare ta og sette in en

Kode

if (strlen($postnr) == 3) {
$postnr = "0$postnr";
}
eller noe lignende?
Nei. Det må da finnes en annen måte. Og hvis noen skriver feil, eller glemmer et tall så blir det feil når det blir sånn.
nso
popålol
nso's Avatar
Administrator
PHP fjerner ikke 0 i begynnelsen av STRING. Den fjerner det derimot i fra begynnelsen av INT.
Bruk varchar. Du skal vel ikke regne med tallene uansett?
Hvorfor må du absolutt ha et postnummer som INT? Du skal vel verken addere eller multiplisere et postnummer?
Sur og sarkastisk
droppboks's Avatar
Sitat av s1gh Vis innlegg
Hvorfor må du absolutt ha et postnummer som INT? Du skal vel verken addere eller multiplisere et postnummer?
Vis hele sitatet...
Nå skal ikke jeg putte ord i munnen på han, men kan hende at han bruker "int" for å skjekke om postnummeret faktisk er tall. Om det er tilfellet så funker vel:

Kode

<?php
preg_match("^[0-9]{4}$", $postnr);
?>
omtrent noe sånn, utestet, sitter på skole atm. (er ikke HELT sikker på regexen heller)

Hvis ikke får OP utdype.
Sitat av CHooBE Vis innlegg
Nå skal ikke jeg putte ord i munnen på han, men kan hende at han bruker "int" for å skjekke om postnummeret faktisk er tall.
Vis hele sitatet...

Kode

<?php

$postnummer = "0123";

if (is_numeric($postnummer)) {
echo $postnummer . " = NUMERIC";
}

?>

<?php

$postnummer = 0123;

if (is_numeric($postnummer)) {
echo $postnummer . " = NUMERIC";
}

?>
Output:

Kode

0123 = NUMERIC
83 = NUMERIC
Sist endret av s1gh; 3. mai 2010 kl. 13:52.
Det du har pastet ser helt rett ut, og det er ingen grunn der til at 0 foran skal fjernes. Feilen ligger antakelig der du legger innhold i $postnr så jeg vil heller se den delen av koden Du bør passe på å håndtere postnummeret som string hele veien.
Eneste jeg har er dette:

$postnr = $_POST['postnummer'];
Jeg presterte faktisk å slette innlegget mitt.

Testet nå koden din og det fungerer fint her, så jeg skjønner egentlig ikke hva som er problemet
Problemet er at den fjerner 0 i postnummeret.
Jeg testet nå, og hvis jeg skriver 0000 så blir kun en 0 lagret i databasen :s
Sitat av fulloggal Vis innlegg
Problemet er at den fjerner 0 i postnummeret.
Jeg testet nå, og hvis jeg skriver 0000 så blir kun en 0 lagret i databasen :s
Vis hele sitatet...
Har du satt kolonnen i databasen til datatype varchar?
Print ut variabelen som inneholder postnummeret og se hva den inneholder FØR du skriver til databasen.
Det MÅ være noe feil som skjer i det du skriver til databasen, eller noe feil med databaseoppsettet.

Jeg kjører kodesnutten din uten problemer her, og variabelen inneholder alle tall (ex: 0123).
Sist endret av s1gh; 4. mai 2010 kl. 00:20.
improbable
Gusto's Avatar
DonorAdministrator
Sitat av fulloggal Vis innlegg
Problemet er at den fjerner 0 i postnummeret.
Jeg testet nå, og hvis jeg skriver 0000 så blir kun en 0 lagret i databasen :s
Vis hele sitatet...
lsrr er nok inne på noe her. Hvis du prøver å hente ut en verdi fra databasen som har blitt lagret som en integer, vil du naturligvis miste nullen. Prøv å endre kolonnen til et tekstlig format, som varchar.
Som jeg sa, håndter den som string hele veien 0 er et tall. 0000 er tallet 0. Ber du databasen lagre det som tall, så lagrer den det på enkleste måte.

Hvis ikke må du formatere den til firesifret hver gang du henter den ut av databasen.
Ok, tror det er databasen som er satt til int. Så jeg skal prøve å endre det når jeg kommer hjem. Får ikke tilgang til databasen fra skolen :S
Kom over liknende problemstilling selv her om dagen, str_pad() to the rescue :)
Denne funksjonen (number_pad()) er hemningsløst stjålet fra matrebatre på http://no2.php.net/str_pad

Kode

$postnummere[] = "2000"; //obs! verdiene må quotes (castes som string), ellers får man uventede resultater av number_pad funksjonen 
$postnummere[] = "100";
$postnummere[] = "30";
$postnummere[] = "4";
$postnummere[] = "0217";
$postnummere[] = "548";


foreach($postnummere as $nummer){
	echo number_pad($nummer,4);
	echo "<br/>\n";
}

// number_pad(input_number, howmany)
function number_pad($number,$n) {
	return str_pad((int) $number,$n,"0",STR_PAD_LEFT);
}
Resultat blir:
2000
0100
0030
0004
0217
0548
Sist endret av nilsel; 4. mai 2010 kl. 19:13.
z0p
uʍop ǝpısdn
z0p's Avatar
Da er det vel enklere å formatere en string med sprintf

Kode

print sprintf("%04d", 123)
// ut: 0123
men uansett er det unødvendig i dette tilfellet, siden man ikke burde operere med en integer her