Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Jeg har et PHP script som parser en XML fil med bloggposter. Oppsettet er slik:

<posts>
<post>
 <headline>Velkommen til nettsiden min!</headline>
 <content>Hei og velkommen skal du være. Her kan du lese mye rart. Tralallala. Tiitei</content>
</post>
<post>
 <headline>Raghnild er søt</headline>
 <content>KJHkjdhf dgkdhfgkjfdg fkgjhfdkjghdf gfdkgjhfkjgdf gfdjkghfjkhgkd gkjdfhgkjdfhkg fgkjhdfkjghkdfg fdgjkhdfkjghkdfg dfgkjdfhgkjdfhgkdfhg</content>
</post>
<post>
 <headline>Velkommen til nettsiden min!</headline>
 <content>Hei og velkommen skal du være. Her kan du lese mye rart. Tralallala. Tiitei</content>
</post>
</posts>

 

Jeg har fått til å printe ut bloggpostene på nettsiden, men jeg får ikke til å iterere over hver headline slik at jeg kan lage en link til hver bloggpost.

 

Er det noen som har noen forslag?

 

function start($parser, $element_name, $element_attrs, $url)
{

$url = 1;
switch($element_name)
 {
 case "POST":
  echo '<div class="post">';
 break;

 case "HEADLINE":
  echo '<h2 class="postHeadline"><a href="index.php?page=' . $url . '">' ;
 break;

 case 'CONTENT':
  echo '<div class="postText">';
 break;
 }
}

 

Jeg ønsker altså at $url skal stige for hver <headline> i XML koden.

 

Hvordan får jeg det til?

 

 

Bruker denne funksjonen for å printe fra XML:

function parseXML($pathtoFile, $url) {
 // starting the XML parser
 $parser = xml_parser_create();
 xml_set_element_handler($parser,"start","stop");
 xml_set_character_data_handler($parser,"char");
 $fp=fopen($pathtoFile,"r");



while ($data=fread($fp,4096))
{
 xml_parse($parser,$data,feof($fp)) or
 die (sprintf("XML Error: %s at line %d",
 xml_error_string(xml_get_error_code($parser)),
 xml_get_current_line_number($parser)));


}
xml_parser_free($parser);
  }

 

 

Jeg tenkte orginalt å bare ha en for loop inni while loopen med en teller på url variablet, men fikk det ikke til.

Endret av glad
Lenke til kommentar
  • 1 måned senere...
Videoannonse
Annonse
  • 4 måneder senere...

Takk for hjelpen.

 

Dette er sikkert noen kjedelige spørsmål for dere eksperter. Men, nå som jeg har begynt å kode mer så merker jeg at det blir viktig med struktur, spesielt hvis jeg må tilbake for å endre på noe. smile.png

Hei Gigahertz, jeg er nysgjerrig på hvor langt du har kommet med PHP siden det er noen måneder siden du har postet her.

 

Her er et eksempel basert på koden din som tar i bruk array og henter ut data med en foreach.

$personer = [
    "Person_1"=>['Navn'=>'Ola','Alder'=>19],
    "Person_2"=>['Navn'=>'Mons','Alder'=>27]
];
$i = 1;
$tilsammen = '';
$allenavn = '';
foreach ($personer as $person) {
	echo $i.'. '.$person['Navn']." er ".$person['Alder']." år<br/>";
	$tilsammen += $person['Alder'];
	$allenavn .= $person['Navn'].',';
	$i++;
}
$allenavn = rtrim($allenavn, ',');
$j = $i - 1;
echo "Sammenlagt er ".$allenavn.": ".$tilsammen." år.<br>";

Da kan du lett bare tilføye personer så oppdaterer alt seg automatisk

$personer = [
    "Person_1"=>['Navn'=>'Ola','Alder'=>19],
    "Person_2"=>['Navn'=>'Mons','Alder'=>27],
    "Person_3"=>['Navn'=>'Arne','Alder'=>14],
    "Person_4"=>['Navn'=>'Linda','Alder'=>26],
    "Person_5"=>['Navn'=>'Knut','Alder'=>65],
    'Person_6'=>['Navn'=>'Kari','Alder'=>43]
];
$i = 1;
$tilsammen = '';
$allenavn = '';
foreach ($personer as $person) {
	echo $i.'. '.$person['Navn']." er ".$person['Alder']." år<br/>";
	$tilsammen += $person['Alder'];
	$allenavn .= $person['Navn'].',';
	$i++;
}
$allenavn = rtrim($allenavn, ',');
$j = $i - 1;
echo "Sammenlagt er ".$allenavn.": ".$tilsammen." år.<br>";

Output:

1. Ola er 19 år
2. Mons er 27 år
3. Arne er 14 år
4. Linda er 26 år
5. Knut er 65 år
6. Kari er 43 år
Sammenlagt er Ola,Mons,Arne,Linda,Knut,Kari: 194 år.
Endret av Dan-Levi
Lenke til kommentar

Hvorfor initialiserer du en variabel som skal brukes til tall ved å gi en den tom streng?

$tilsammen = '';

burde være:

$tilsammen = 0;

Også ser jeg ingen bruk av $j i kodeeksemplet, men om den verdien skal brukes seinere, så er det vel enklere å initialisere $i med 0 i steden for 1, også inkrementere den i begynnelsen av hver iterasjon i steden for slutten? Da vil nemlig $i holde den verdien du har lagret i $j, og du trenger ikke ha noen -1 for å få det til.

Lenke til kommentar

Hvorfor initialiserer du en variabel som skal brukes til tall ved å gi en den tom streng?

$tilsammen = '';

burde være:

$tilsammen = 0;

Også ser jeg ingen bruk av $j i kodeeksemplet, men om den verdien skal brukes seinere, så er det vel enklere å initialisere $i med 0 i steden for 1, også inkrementere den i begynnelsen av hver iterasjon i steden for slutten? Da vil nemlig $i holde den verdien du har lagret i $j, og du trenger ikke ha noen -1 for å få det til.

Det var et godt spørsmål egentlig, blir det ikke det samme, utgjør det noen forskjell?

 

$j var bare for å få riktig antall personer på en kjapp måte men at $i begynner på 1 så det ser slik ut:

$j = $i - 1;
Lenke til kommentar

I PHP spiller det sikkert liten rolle fordi PHP er dumsnill og har skummel magi som fikser det for deg. Dersom du lærer å programmere avhengig av PHPs særegenskaper og vennlige snarveier vil du få store problemer i det du skal bruke et strengere språk. Det er nok en av årsakene til at PHP-programmerere er sett på som de minst kompetente. (Ikke enkeltvis, men sett som ett, ikke bli triste pga. dette utsagnet)

  • Liker 1
Lenke til kommentar

I mange tilfeller vil det ikke ha noe å si fordi PHP foretar casting mellom forskjellige typer helt automatisk, men det kan oppstå problemer med det for enkelte ting, og det kan være en kilde til bugs. Derfor er det like greit å venne seg til å initialisere variabler med den typen de skal ha, det gjør forøvrig også koden mer lesbar.

 

Når det gjelder utsagnet om at PHP-programmerere er sett på som de minst kompetente (i den grad det er sant) så tror jeg det er et resultat av hvor lite som skal til for å få noe til å fungere i PHP, kombinert med de mengdene som har laget tutorials uten selv å kunne gjøre ting riktig.

Lenke til kommentar
  • 1 måned senere...

Hei, har et kjapt spørsmål jeg lurer på!

 

Litt info:
Jeg driver å setter opp en database, samtidig som jeg setter opp REST api med Laravel. I Laravel har du funksjonaliteten Eager Loading, som jeg gjør superlett å inkludere relevante ressurser i andre ressurser, for eksempel har jeg to ressurser: /images/ og /items/. Når jeg requester alle items, vil jeg kun returnere en liste over alle elementene i ressursen, altså /images/ returnerer alle radene, og alle feltene som er inkludert i tabellen for images. /items/ har derimot et image_id, som er en fremmednøkkel for et image.

 

Her er spørsmålet mitt:

Er det bedre å ha mange, små requests, eller få store - Spesielt med tanke på når ressursene er så relaterte at jeg med 99% sikkerhet får bruk for dem samtidig som jeg henter den orginale ressursen?

 

Når jeg for eksempel går på /images/123, vil jeg returnere rad med if 123, og i tillegg returnere alle items som bruker dette bildet. Eller er det bedre å kjøre (I dette tilfellet) 2 requests: /images/123, /items/?image_id=123 ?

 

Det er kanskje også verdt å vite at ressursene som jeg tenker å gjøre dette med, er ressurser som deles av mange brukere, så det vil relativt ofte forespørres. (Dette med tanke på caching).

 

 

Selv tror jeg en slik ressurs hadde tjent på å sendes sammen med andre ressurser, istedet for å forespørre hver ressurs for seg.

 

Tanker?

Lenke til kommentar

Rules Of Optimization

 

1) Don't.

2) Don't Yet (for experts only).

 

Om en tjeneste gjør et eller to kall mot seg selv har ikke nødvendigvis noe å si og optimalisering av et program med konstant kjøretid kan påstås å ikke være hensiktsmessig før det representerer et problem. Det du derimot kan tenke på er de deler som ikke skalerer. Google f.eks. N+1 query problem.

 

(Når det gjelder spørsmålet--hva med å la APIet støtte et argument som indikerer hvorvidt man ønsker å få tilbake relaterte ressurser?)

  • Liker 1
Lenke til kommentar

Rules Of Optimization

 

1) Don't.

2) Don't Yet (for experts only).

 

Om en tjeneste gjør et eller to kall mot seg selv har ikke nødvendigvis noe å si og optimalisering av et program med konstant kjøretid kan påstås å ikke være hensiktsmessig før det representerer et problem. Det du derimot kan tenke på er de deler som ikke skalerer. Google f.eks. N+1 query problem.

 

(Når det gjelder spørsmålet--hva med å la APIet støtte et argument som indikerer hvorvidt man ønsker å få tilbake relaterte ressurser?)

 

Det er jo faktisk en kjekk idé å la det være et argument som bestemmer det, godt tenkt!

 

Når det gjelder N+1 så er poenget med Laravels "Eager Loading" at de løser N+1 problemet! Men det er absolutt noe man burde tenke på. I et tidligere punkt fikk jeg merke N+1 problemet first hand, og hadde plutselig 38 spørringer på en ganske liten side.

Lenke til kommentar
  • 8 måneder senere...
  • 5 måneder senere...
   if ($mysqli->query($querydel)) {
// do nothing
    }

Dette gjør at noe blir slettet fra en tabell i et program. Men hvorfor fungerer dette?

 

Jeg oppfatter det som helt tom kode. Altså hvis sant, så skal ingenting gjøres og hvis usant så hopper den bare videre i koden.

 

Men sletter jeg de linjene fungerer ikke slettingen i programmet.

 

 

 

 

Lenke til kommentar

Noen som har lekt seg med HHVM her?

 

http://en.wikipedia.org/wiki/HipHop_Virtual_Machine

 

HipHop Virtual Machine (HHVM) is a process virtual machine based on just-in-time (JIT) compilation, serving as an execution engine for PHP and Hack programming languages. By using the principle of JIT compilation, executed PHP or Hack code is first transformed into intermediate HipHop bytecode (HHBC), which is then dynamically translated into the x86-64 machine code, optimized and natively executed.[1][4] This contrasts to the PHP's usual interpreted execution, in which the Zend Engine transforms the PHP source code into opcodes as a form of intermediate code, and executes the opcodes directly on the Zend Engine's virtual CPU.[5]

 

Wikipedia har gått over til HHVM, f.eks, og opplever mye bedre ytelse: http://hhvm.com/blog/7205/wikipedia-on-hhvm

Lenke til kommentar
    if ($mysqli->query($querydel)) {
		// do nothing
    } 

PHP noob, men slik jeg har lært fra andre språk er det som står inne i parantesene bak if bare en kontroll og ikke noe som blir eksekvert.

 

Men da er det vel å forstå at koden er ekvivalent med:

$mysqli->query($querydel);
Endret av kilik
Lenke til kommentar
    if ($mysqli->query($querydel)) {
		// do nothing
    } 

PHP noob, men slik jeg har lært fra andre språk er det som står inne i parantesene bak if bare en kontroll og ikke noe som blir eksekvert.

 

Men da er det vel å forstå at koden er ekvivalent med:

$mysqli->query($querydel);

PHP kjører koden i if(), og om den ikke returner false så kjøres blokken mellom {}.

if($n = 8){
    echo '$n: ' . $n;
}

Vil printe

$n: 8
  • Liker 1
Lenke til kommentar

PHP noob, men slik jeg har lært fra andre språk er det som står inne i parantesene bak if bare en kontroll og ikke noe som blir eksekvert.

Mulig jeg misforstår, men koden i if() må jo kjøres for å finne ut om selve blokken skal kjøres (hvorvidt resultatet blir true eller false)?

Lenke til kommentar

j-- forklarte det bra. Tror jeg skjønner det nå.

 

Forskjellen på = og == er vel noe av det jeg er inne på ja. Med = utfører programmet en operasjon, med == en logisk kontroll.

 

Jeg regner da med at typen if($variabel = noe) returnerer true hvis operasjonen kan utføres?

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...