j-- Skrevet 7. januar 2015 Del Skrevet 7. januar 2015 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 } ?> 1 Lenke til kommentar
Abigor Skrevet 7. januar 2015 Del Skrevet 7. januar 2015 I hvilket tilfelle vil: if($a = 2){ //kode } gi annen oppførsel enn: $a = 2; //kode Altså, hvilken rolle spiller det at den logiske if-testen er der? Lenke til kommentar
j-- Skrevet 7. januar 2015 Del Skrevet 7. januar 2015 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 } 1 Lenke til kommentar
Crowly Skrevet 7. januar 2015 Del Skrevet 7. januar 2015 (endret) (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 7. januar 2015 av Crowly 3 Lenke til kommentar
Abigor Skrevet 7. januar 2015 Del Skrevet 7. januar 2015 (endret) 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 7. januar 2015 av Abigor Lenke til kommentar
Crowly Skrevet 7. januar 2015 Del Skrevet 7. januar 2015 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. 1 Lenke til kommentar
kilik Skrevet 5. februar 2015 Del Skrevet 5. februar 2015 Hva er det beste rammeverket? Og IDE? Andre nyttige verktøy? Nå skriver jeg bare koden i Eclipse. Lenke til kommentar
Crowly Skrevet 5. februar 2015 Del Skrevet 5. februar 2015 (endret) Laravel skal være ett godt rammeverk. Tror Phalcon skal være bra. Netbeans (gratis, krever java) er ett bra IDE, men PHPStorm (99 euro for en individuell lisens) skal være bedre etter hva jeg har skjønt. Composer (Dependency Manager for PHP) er ett kjekt verktøy. Endret 5. februar 2015 av Crowly 1 Lenke til kommentar
etse Skrevet 5. februar 2015 Del Skrevet 5. februar 2015 Vil legge til at PHPStorm er gratis om du faller under en av kategoriene de har listet opp. Bakdelen er at du faktisk må søke om en gratislisens, som betyr det kan være litt behandlingstid. Lenke til kommentar
Matsemann Skrevet 6. februar 2015 Del Skrevet 6. februar 2015 Netbeans (gratis, krever java) er ett bra IDE, men PHPStorm (99 euro for en individuell lisens) skal være bedre etter hva jeg har skjønt. PHPStorm kjører også Java, men kommer på flere platformer bundlet med sin egen java så man ikke trenger forhåndsinstallere. Kan anbefale PHPStorm, og alle andre produkter fra JetBrains. IntelliJ er fantastisk. 2 Lenke til kommentar
kilik Skrevet 5. mars 2015 Del Skrevet 5. mars 2015 (endret) 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 5. mars 2015 av kilik Lenke til kommentar
j-- Skrevet 5. mars 2015 Del Skrevet 5. mars 2015 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
Crowly Skrevet 5. mars 2015 Del Skrevet 5. mars 2015 $Kid vises uten quotes Er dette ett problem? Ledende nuller blir uansett med i fila, men blir fjernet av f.eks. Excel da det blir tolket som ett tall, om man ikke spesifiserer at den kolonnen skal behandles som tekst. Lenke til kommentar
kilik Skrevet 5. mars 2015 Del Skrevet 5. mars 2015 (endret) 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 5. mars 2015 av kilik Lenke til kommentar
Yawa Skrevet 13. mars 2015 Del Skrevet 13. mars 2015 (endret) 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 13. mars 2015 av Yawa Lenke til kommentar
Matsemann Skrevet 13. mars 2015 Del Skrevet 13. mars 2015 Vel, enda bedre ville vært å putte koden i en funksjon, og så droppet do/while og heller brukt return i stedet for break. 1 Lenke til kommentar
Yawa Skrevet 13. mars 2015 Del Skrevet 13. mars 2015 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
Matsemann Skrevet 13. mars 2015 Del Skrevet 13. mars 2015 (endret) 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 13. mars 2015 av Matsemann Lenke til kommentar
Crowly Skrevet 13. mars 2015 Del Skrevet 13. mars 2015 Vil ikke si at noen av alternativene er spesielt lett lest. Ville heller ha puttet dette inn i en MVC model/struktur, det beste er nok å ta i bruk ett godt rammeverk (men litt avhengig av størrelsen på hva man skal lage). Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå