Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Jepp, Slenger opp noen eksempler under:

<?php

$a = 1;

if($a == 1){
  // Kode her vil kjøre fordi $a er 1
}

if($a = 2){
  // Kode her vil kjøre fordi $a blir satt til 2. $a er nå 2 istedenfor 1.
}

if($a == 1){
  // Kode her vil ikke kjøre. Dette fordi $a er 2, og ikke 1.
}

Merk også at det er forskjell på == og ===.

if("1" == 1){
  // kjører
}

if("1" === 1){
  // kjører ikke. Første er en string som inneholder 1. Andre er en integer, som er 1. Det er ikke samme type.
}

if(1 === 1){
  // kjører - samme type
}

?>
  • Liker 1
Lenke til kommentar
Videoannonse
Annonse

Ingen, men det viser at man kan (og av og til vil) assigne til variabler i if-tester.

// returnerer ukedagsnummer om det er mandag til fredag, og ellers false

function get_weekday($date = null){
  if($date === null){
    $date = date("U");
  }
    
  $day = date('N', $date);
  
  if($day >= 1 && $day <= 5){
    return (int) $day;
  }else{
    return false;
  }
}

if($day = get_weekday()){
  // $day inneholder nå integer med verdi mellom 1 og 5, alt ettersom det er mandag til fredag.
}else{
  // det er helg
}
  • Liker 1
Lenke til kommentar

(brukte vist litt lang tid på å fullføre innlegget ...)

 

Altså, hvilken rolle spiller det at den logiske if-testen er der?

Ingen, kommer man over slik kode er det trolig en bug som skulle vært if ($a == 2), er lett å glemme ett ekstra = i blant, spesielt hvis man jobber med flere forskjellige språk hvor ett enkel = brukes til å sjekke verdier og ikke tilordne dem, f.eks

a := 1;

if a = 2 then
    // do something
end if;
I php eksemplet til j-- er det ment å vise at verdien av $a blir endret i if setningen.

--

 

En annen måte så skrive if setningen til kilik på som muligens er litt mer lettlest

if (false === ($mysqli->query($querydel))) {
    // something went wrong with the query
}

// alternativt eksempel
$query = "SELECT * FROM tabell";

if (false !== ($result = $mysqli->query($query))){ // hendelsesforløp: kjør query og lagre resultatet i $result, sjekk at $result ikke er false
    echo '<pre>' . print_r($result,true) . '</pre>'; // skriv ut innholdet i $result så lenge query'en ikke feilet
}
Det man må huske på i PHP er at flere ting kan tolkes som true/false (hvis man ikke bruker === eller !==)

the following values are considered FALSE:

the boolean FALSE itself

the integer 0 (zero)

the float 0.0 (zero)

the empty string, and the string "0"

an array with zero elements

an object with zero member variables (PHP 4 only)

the special type NULL (including unset variables)

SimpleXML objects created from empty tags

 

Every other value is considered TRUE (including any resource).

I Kilik sin (originale) if så vil alltid if kode blokken kjøres så lenge ikke $mysqli->query() returnerer en verdi som tolkes som false.

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

http://php.net/manual/en/mysqli.query.php Endret av Crowly
  • Liker 3
Lenke til kommentar

Ingen, men det viser at man kan (og av og til vil) assigne til variabler i if-tester.

if($day = get_weekday()){
  // $day inneholder nå integer med verdi mellom 1 og 5, alt ettersom det er mandag til fredag.
}else{
  // det er helg
}

 

Ok så fordi day er NULL eller 0 så vil else kjøre. Endret av Abigor
Lenke til kommentar

Ja på ett generelt grunnlag for if'er, nei hvis vi skal være pirkete med dette konkrete eksemplet ;)

 

Ja: NULL og 0 tolkes som FALSE og vil dermed kjøre else delen.

Nei: get_weekday() returnerer ikke NULL eller 0, kun FALSE eller ett tall mellom 1 og 5. Tallene 1 til 5 tolkes som TRUE.

  • Liker 1
Lenke til kommentar
  • 4 uker senere...
  • 4 uker senere...

Må si jeg digger PHP. Fortsatt litt noob da men...

 

 

Prøver å outputte diverse felter til en CSV-fil som skal fungere som inndata i et regnskapsprogram, men sliter med formateringen:

 

 

eksempel:

$Name = "Baker Hansen AS";
$Kid = "200006001000120000";
$Address1 = "Hansegata 1";
$Telefax = "";
$CreditLimit = 99999999.990000;

$output = fopen('php://output', 'w');
fputcsv($output, array($Name, $Kid, $Address1, $Telefax, $CreditLimit));

Jeg vil at variable skal komme ut eksakt som det står, altså:

 

"Baker Hansen AS","200006001000120000","Hansegata 1","",99999999.990000

, men det kommer ut som

"Baker Hansen AS",200006001000120000,"Hansegata 1",,99999999.99

Altså 3 forskjellige feil. $Kid vises uten quotes. Det samme med det tomme feltet. Det store tallet mister 4 desimaler. Ser ut til at bare hvis det er mellomrom i variabelen det blir lagt til quotes.

Ja, jeg kan sikkert hardkode hvert felt på en måte, men ettersom det er en del av en fil med 50 ulike felt blir det litt tungvindt. Noen bedre løsning?
Endret av kilik
Lenke til kommentar

Du vet at 99,9 og 99,900000 matematisk sett er det samme takket, men ikke strengmessig. prøv "var_dump('99.90000', 99.90000)" (utestet), så ser du hva forskjellen er.

 

CSV kan formateres på forskjellige måter, og normalen er å ikke ha "" rundt integer/float. Mulig det er en parameter du kan sette på fputcsv() for å tvinge forskjellig oppførsel.

Lenke til kommentar

Jeg er litt usikker på om det er et problem, men ønsker å være på den sikre siden. CSV-eksemplene formateres likt i OpenOffice.

 

Det overfor er et eksempel på inndata i regnskapsprogrammet Visma Global hvor KID-feltet er definert med quotes blant annet. Har dessverre ikke tilgang til nevnte program selv.

Endret av kilik
Lenke til kommentar

Nå har ikke jeg lest gjennom alle 106 sidene, så det er godt mulig at dette har blitt dekket tidligere. I så fall får jeg beklage for duplisering på forhånd...

 

Jeg kom over et skript her om dagen som hadde en del nøstet if/else logikk. Slike skript blir fort uoversiktlige, og mange velger å håndtere hva som er planlagt at skal skje i fra begynnelsen, og så "grave" seg nedover - hvilket gir god mening da man rask og effektivt kan lese seg til hva som skal skje. Men så fort man begynner å få en del innvendinger blir det fort ganske uoversiktelig og vanskelig å henge med hva som hører til hva, og det utgjør at man bør (les må) kommentere en del for at man skal klare å sette seg inn i koden igjen på et senere tidspunkt..

 

Her er et eksempel på hva jeg mener:

if($_PAGE['exists']){
    if($_PAGE['access']==1){
        if($_VIEW['get']){  //  sjekk om en visning blir etterspurt, og last den inn i såfall...
            if($_VIEW['access']==1){
                if(file_exists(dir_views.$_VIEW['file'].'.php')){
                    include dir_views.$_VIEW['file'].'.php';
                } else {
                    notice('error','Kan ikke finne visningen');
                }
            } else {
                notice('error','Visningen er ikke tilgjenglig');
            }
        } else {  //  hvis ingen visning er etterspurt, laster vi kun inn hovedsiden
            if(file_exists(dir_pages.$_PAGE['file'].'.php')){
                require dir_pages.$_PAGE['file'].'.php';
            } else {
                notice('error','Finner ikke siden');
            }
        }
    } else {
        notice('error','Siden er ikke tilgjenlig');
    }
} else {
    notice('error','Siden eksisterer ikke');
}
getNotice();  //  spytt ut eventuelle feilmeldinger

Det tar litt tid å sette seg inn i hva som skjer, og forstå hvordan det hele henger sammen ved første øyekast. Og på slutten er det et par else'r som kan ikke umiddelbart vet hvor hører hjemme.. I dette tilfellet settes et notat ved feil som forklarer, men det er ikke altid det er slik. Noen ganger er det kun annen logikk som kjører..

Nå er kansje dette et litt sånn skrekk-eksempel, men det hender rett som det er at jeg kommer over lignendes koder. Men det er mulig å forbedre koden. Hvertfall dette tilfellet:

do{
    if(!$_PAGE['exists']){ notice('error','Siden eksisterer ikke'); break; }
    if($_PAGE['access']!=1){ notice('error','Siden er ikke tilgjenlig'); break; }
    if(!$_VIEW['get']){  //  ingen visning er etterspurt, så forsøk å last inn side med en gang
        if(!file_exists(dir_pages.$_PAGE['file'].'.php')){ notice('error','Kan ikke finne siden'); break; }
        include dir_pages.$_PAGE['file'].'.php';
    } else {  //  en visning er etterspurt, så forsøk å laste inn denne
        if($_VIEW['access']!=1){ notice('error','Visningen er ikke tilgjenglig'); break; }
        if(!file_exists(dir_views.$_VIEW['file'].'.php')){ notice('error','Kan ikke finne visningen'); break; }
        include dir_views.$_VIEW['file'].'.php';
    }
}while(null);
getNotice();  //  spytt ut eventuelle feilmeldinger

Denne koden gjør nøyaktig det samme for sluttbruker.

 

Personlig mener jeg det hele er mer oversiktlig. Og ikke minst er koden vesentlig kortere - hvilket betyr mindre størrelse på filen. Det er kansje ikke så mye å hente i akkurat dette lille eksempelet, men ettehvert som et nettsted vokser baller det på seg. Og da kan den sammenlagte besparelsen ved å skrive mindre, og mer effektiv, kode bli betydlig.

Endret av Yawa
Lenke til kommentar

Der er jeg uenig Matsemann. Logikk hører ikke hjemme i funksjoner. Funksjoner er ment til å utføre en gitt handlig, for så å returnere tilbake til logikken.

Man kunne opprettet funksjoner for hver av testene, men i dette tilfellet, som er et engangsskript for å hente frem sider og visninger, så ville det vert unødvendig. Det ville bare resultert i flere filer på serveren, og flere steder å forholde seg til om man skal utføre korrigereinger.. Hvilket jeg personlig mener man bør unngå...

Lenke til kommentar

Funksjoner er ment til å utføre en gitt handlig, for så å returnere tilbake til logikken.

Nettopp derfor jeg mener det burde vært en funksjon.

 

Altså

includePage();
getNotice(); 

function includePage() {
	if(!$_PAGE['exists']){ notice('error','Siden eksisterer ikke'); return; }
	if($_PAGE['access']!=1){ notice('error','Siden er ikke tilgjenlig'); return; }
	if(!$_VIEW['get']){ // ingen visning er etterspurt, så forsøk å last inn side med en gang
	if(!file_exists(dir_pages.$_PAGE['file'].'.php')){ notice('error','Kan ikke finne siden'); return; }
		include dir_pages.$_PAGE['file'].'.php';
	} else { // en visning er etterspurt, så forsøk å laste inn denne
		if($_VIEW['access']!=1){ notice('error','Visningen er ikke tilgjenglig'); return; }
		if(!file_exists(dir_views.$_VIEW['file'].'.php')){ notice('error','Kan ikke finne visningen'); return; }
		include dir_views.$_VIEW['file'].'.php';
	}
}

Å bruke do/while for å kunne avslutte noe tidlig er et uvanlig pattern som bare vil forvirre folk. Jeg ville kanskje også forbedret funksjonen her til å kaste exceptions (heller enn hjemmelaget error-handling og returnering uansett), og kanskje splittet den igjen opp i litt mindre funksjoner så man faktisk kan lese rett ut hva som foregår, da denne funksjonen akkurat nå gjør litt for mange ting.

 

Hvorfor ville dette ført til flere filer på serveren og flere steder å forholde seg til? Det beste hadde jo vært å bake dette inn i en klasse som bare tar seg av inkludering av sider, med hjelpemetoder for å sjekke om de eksisterer osv. Da får du alt på én plass.

Endret av Matsemann
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...