Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Litt vanskelig å si kva som er feil, men du trenger det $i greiene ;)

 

PHP

<?php

$key="Produksjon: Aktørar CSV"$aktorar get_post_meta($post->ID$keytrue);

$aktorar trim($aktorar);

 

$aktorar explode(" "$aktorar); // Deler opp til enkeltaktører

 

foreach( $aktorar as $aktor ) {

$aktor explode(";"$aktor); // Deler opp infoen om en enkelt aktør ?>

<tr class="aktor <? if(($i++ %2) == 0) {echo "even";}?>">

<th scope="row"><?php echo $aktor[0]; ?></th>

<td><?php if ( $aktor[2] != null ) { ?>

<a href="<?php echo $aktor[2]; // URL ?>" title="<?php echo $aktor[2]; // URL ?>"><?php ?>

<?php echo $aktor[1]; /* Navn */ if ( $aktor[2] != null ) { ?></a><?php ?></td>

</tr>

<?php ?>

Lenke til kommentar
Videoannonse
Annonse

kjapt smp.: hva er beste måten å validere data fra et skjema (form)?

Tenker ikke på reg-exp, men på å sikre seg mot at folk skriver inn data i formen som kan kjøres..:

 

Ser ulike løsninger rundt om kring, som f.eks

PHP
$input = htmlspecialchars ( strip_tags ($_POST["felt"]));
mens andre bare en av de to funksjonene over.

Også blir jeg forvirra av de som drar inn stripslashes() o.l. :p

 

Må også nevne at jeg pleier å teste om data "er satt" før jeg henter ut variablene:

PHP
if(isset($_GET["name"])){ /* ... */ }

 

Hva er enkleste og greieste måte å være sikker på at man har "gyldig" input på?

Lenke til kommentar

Tja, interface har vel egentlig ikke så mye hensikt i PHP siden det er så typesvakt, men uannsett. Et interface beskriver noe abstrakt som f.eks database og en rekke funksjoner og parametere enhver klasse av denne typen må ha. I forhold til database kan dette være åpne, lukke, kjøre en SQL-spørring osv. Poenget med det hele er at man skal kunne implementere dette i andre klasser slik at man f.eks har en klasse for mysql, postgresql, mssql osv. Det store poenget så er at man kan referere til det hele som en database uten å bry seg om det er mysql, postgresql eller noe annet, du har kort og greit en database og den veit du har de og de funksjonene. I typesterke språk gir dette veldig mening da du f.eks kan lage deg en array med database-klasser, noe man ellers ikke kan siden man må vite hva det skal være en array av.

Endret av Ernie
Lenke til kommentar

et inteface garanterer at noen gitte funksjoner skal være til stede.

Om man ikke selv har 100% kontroll på alt som skal kodes, kan det vært lurt å først skrive et interface med alle public funksjoner som trengs. Etter det er gjort kan man sette seg ned og programmere selve klassen, og den vil ikke "validere" før samtlige funksjoner fra interfacet er på plass.

 

Kjekt om man driver med objekt-orientert programmering med andre ord

Lenke til kommentar

Kan jo komme med noen eksempler:

 

Basert på hvilke interfaces objektet implementerer kan man

se hvordan datasettet kan leses.

function outputProducts($data)
{
 if($data instanceof Zend_Db_Statement_Interface {
   while($product = $data->fetch()) {
     echo $product['name'] . "\n";
   }
 } elseif($data instanceof Iterator) {
   foreach($data as $product) {
     echo $product['name'];
   }
 }
}

Mer aktuelt er kanskje å lage en universell måte å loope gjennom mange forskjellige datasett på.

I PHP har vi "Iterator"-interfacen som er innebygd og er enklest i bruk da den er integrert med foreach

function outputData(Iterator $data)
{
 foreach($data as $key => $value) {
   echo "$key => $value\n";
 }
}
$xmlData = new SimpleXMLIterator(new SimpleXMLElement('test.xml'));
$arrayData = new ArrayObject($someArray);
$filesData = new DirectoryIterator(dirname(__FILE__));
$newsData = new ArrayObject($db->fetchPairs('SELECT date, title FROM news'));
/*
* Alle disse data-variablene implementerer "Iterator" og outputData() kan
* forstå og skrive ut innholdet av alle sammen.
*/

Et annet eksempel på hvordan en interface kan skille ut spesifikk funksjonalitet.

// Først oppretter vi en en egen interface med funksjoner
interface Storage
{
 public function __construct($id);
 public function save();
 public function load();
 public funciton getId();
}

// Så lager vi en klasse som implementer interfacen med de påkrevde funksjonene
class Storage_Session implements Storage
{
 protected $_id;
 protected $_data;

 public function __construct($id, &$data)
 {
   $this->_id = $id;
   $this->_data = $data;
 }

 public function save()
 {
   $_SESSION[$this->getId()] = serialize($this->_data);
 }

 public function load()
 {
   if(!isset($_SESSION[$this->getId()])) {
     return null;
   }
   return unserialize($_SESSION[$this->getId()]);
 }
}
// Andre klasser vi kunne ha lagd er f.eks Storage_Db, Storage_File og Storage_Memory

// Så lager vi en klasse som faktisk bruker funksjonaliteten:
class Shoppingcart
{
 protected $_products;
 protected $_storage;

 public function __construct()
 {
   // Oppretter $storage og sjekker om det er lagret data fra tidligere
   $storage = new Storage_Session('shoppingcart', $this->_products);
   $this->setStorage($storage);
   $storedData = $storage->load();
   if($storedData !== null) {
     $this->_products = $storedData;
   }
 }

 public function __destruct()
 {
   $this->_storage->save();
 }

 /**
  * Her kommer vi til et nøkkelpunkt. Det er det samme om $storage er 
  * Storage_Session, Storage_Db, Storage_Memory eller Storage_File 
  * eller noe annet. Det eneste som teller
  * er at den implementerer de funksjonene definert i "Storage", 
  * for så lenge den gjør det vet "Shoppingcart" hvordan
  * lagringen og lastingen skal utføres.
  * Merk at det er unødvendig å foreta noen ekstra sjekk av innholdet 
  * fordi funksjonsdefinisjonen her krever at $storage er et
  * objekt som implementerer "Storage"
  */
 public function setStorage(Storage $storage)
 {
   $this->_storage = $storage;
 }
}

Koden er helt utestet og ikke ment som noe annet enn en skisse.

Objekter som har noe funksjonalitet til felles kan knyttes sammen ved hjelp en interface og når man da skal bruke denne funksjonaliteten trenger man ikke å forholde seg til alle de forskjellige objektene, men kun til interfacen.

Aldri nødvendig å bruke interfaces, men det kan ofte være lurt.

http://no2.php.net/manual/en/ref.spl.php

http://no.php.net/manual/en/language.oop5.php

Endret av PHPdude
Lenke til kommentar

Bare å bruke det da isåfall. "Alle" locales støttes, det er bare å bruke setlocale(...) hvis det tilfeldigvis skulle være "feil" locale som er valgt.

 

Red.: Riktignok verdt å merke seg teksten nederst i manualen ang. setlocale.

The locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server api like IIS or Apache on Windows you may experience sudden changes of locale settings while a script is running although the script itself never called setlocale() itself. This happens due to other scripts running in different threads of the same process at the same time changing the processwide locale using setlocale().
Endret av Ernie
Lenke til kommentar
Klikk for å se/fjerne innholdet nedenfor
Array?

Lag en språkfil for hver side du har, og inkluderer den på siden.

 

$lang = array (
'something' => 'Noe rart',
'something_else' => 'Noe helt annet',
);

include( 'dennesiden.lang.php' );
echo $lang['something'];

9602428[/snapback]

 

Dette er akkurat det samme, men lettere å holde oversikten på

<?php
$lng['something'] = "noe";
 $lng['something']['else'] = "noe annet";

$lng['month'] = "Måned";
 $lng['month']['january'] = "Januar";
?>

<?php
require_once('language/'.$valgt_spraak.'.inc.php');
echo $lng['something']['else'];
?>

Endret av MrNeeon
Lenke til kommentar
Gjest Slettet+142

 

Klikk for å se/fjerne innholdet nedenfor
Array?

Lag en språkfil for hver side du har, og inkluderer den på siden.

 

$lang = array (
'something' => 'Noe rart',
'something_else' => 'Noe helt annet',
);

include( 'dennesiden.lang.php' );
echo $lang['something'];

9602428[/snapback]

 

Dette er akkurat det samme, men lettere å holde oversikten på

<?php
$lng['something'] = "noe";
 $lng['something']['else'] = "noe annet";

$lng['month'] = "Måned";
 $lng['month']['january'] = "Januar";
?>

<?php
require_once('language/'.$valgt_spraak.'.inc.php');
echo $lng['something']['else'];
?>

9611412[/snapback]

 

 

Den koden vil da ikke helt funke.

 

<?php
$lng['something'] = "noe";
$lng['something']['else'] = "noe annet";

$lng['month']['name'] = "Måned";
$lng['month']['january'] = "Januar";
?>

<?php
require_once('language/'.$valgt_spraak.'.inc.php');
echo $lng['something']['else'];
?>

 

En verdi i et array kan ikke være både et nytt array og en string ;)

Endret av Slettet+142
Lenke til kommentar
Dette er akkurat det samme, men lettere å holde oversikten på

<?php
$lng['something'] = "noe";
 $lng['something']['else'] = "noe annet";

$lng['month'] = "Måned";
 $lng['month']['january'] = "Januar";
?>

<?php
require_once('language/'.$valgt_spraak.'.inc.php');
echo $lng['something']['else'];
?>

9611412[/snapback]

 

Den der var vel litt ulogisk, $lng['something'] og $lng['month'] blir jo overskereve rimelig fort.

 

Edit: Litt for sein der ja..

Endret av Runar0
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å
×
×
  • Opprett ny...