Viderudvikling af ens php kunstskaber

This is a discussion on Viderudvikling af ens php kunstskaber within the Produktion af websider ved brug af php (dk.edb.internet.webdesign.serverside.php) forum.

Viderudvikling af ens php kunstskaber

Postby =?iso-8859-1?Q?Stig_S=F8rensen?= on Thu Nov 20, 2008 5:49 am

Hej gruppe.

Min php viden er sådan ganske udemærket på begynder-niveau, hvis jeg
selv må sige det.
Jeg brænder dog efter at lære mere php, og bare det at scripte i php.
Jeg går dog hurtigt i stå hvis ikke der er noget formål med projektet.

Det jeg efterlyser, er måske et åbent php projekt hvor alle kan
bidrage? Findes sådanne noget?
Eller har I gode idéer til mindre php projekter som også kan bruges,
af andre, så det giver lidt mening i at sidde og lave det?


Håber I kan forstå mig ;o)
=?iso-8859-1?Q?Stig_S=F8rensen?=
 
Posts: 88
Joined: Mon Oct 11, 2004 9:26 am

Re: Viderudvikling af ens php kunstskaber

Postby Dan Storm on Thu Nov 20, 2008 6:27 am

Stig Sørensen skrev:
> Det jeg efterlyser, er måske et åbent php projekt hvor alle kan
> bidrage? Findes sådanne noget?

Du kan da lave komponenter eller moduler til mange slags forskellige
open source CMS'er? Joomla f.eks.

> Eller har I gode idéer til mindre php projekter som også kan bruges,
> af andre, så det giver lidt mening i at sidde og lave det?

Well, der er altid noget man kan bruge.
Jeg har eksempelvis just lige omskrevet mit databaselagsobjekt.
Og i øjeblikket er jeg igang med at forbedre min mailklasse, som jeg
bruger til at udsende HTML emails med embedde billeder og vedhæftede
filer med.

Er der ikke noget du mener du kan lave smartere? For hvis der er, så er
det bare med at komme igang med at gøre det smartere.


--
Dan Storm - storm at err0r dot dk / http://err0r.dk/

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!
Dan Storm
 
Posts: 587
Joined: Sun Sep 12, 2004 10:47 am

Re: Viderudvikling af ens php kunstskaber

Postby =?iso-8859-1?Q?Stig_S=F8rensen?= on Thu Nov 20, 2008 6:34 am

On 20 Nov., 14:27, Dan Storm wrote:

> Well, der er altid noget man kan bruge.
> Jeg har eksempelvis just lige omskrevet mit databaselagsobjekt.
> Og i øjeblikket er jeg igang med at forbedre min mailklasse, som jeg
> bruger til at udsende HTML emails med embedde billeder og vedhæftede
> filer med.
>
> Er der ikke noget du mener du kan lave smartere? For hvis der er, så er
> det bare med at komme igang med at gøre det smartere.

Lyder som nogle gode idéer. Mener bestemt ikke jeg kan gøre noget
bedre, men ville blive glad hvis du kunne fortælle mig lidt om
konceptet bag dine databaselagsobjekt.
=?iso-8859-1?Q?Stig_S=F8rensen?=
 
Posts: 88
Joined: Mon Oct 11, 2004 9:26 am

Re: Viderudvikling af ens php kunstskaber

Postby Dan Storm on Thu Nov 20, 2008 6:56 am

Stig Sørensen skrev:
> Lyder som nogle gode idéer. Mener bestemt ikke jeg kan gøre noget
> bedre, men ville blive glad hvis du kunne fortælle mig lidt om
> konceptet bag dine databaselagsobjekt.

Konceptet er at jeg har et overordnet databaselag som egentlig står for
al behandling af mine databasekald.

Derudover har jeg så, eksempelvis, en klasse der hedder cUsers.

class cUsers extends cMysql
{
/**********************************
/* Start __construct() fra cMysql
/* som forbinder til databasen
/**********************************/
public function __construct()
{
parent::__construct();
}

/**********************************
/* Her henter jeg bruger info
/* fra tabellen og returner
/* resultatet i et associeret
/* array (funktion fra cMysql)
**********************************/
public function getUserInfo($user_id)
{
$sql = "SELECT * FROM users WHERE user_id=".$user_id;
$this->query($sql);
return $this->result2array();
}

/**********************************
/* Her henter jeg brugerens
/* email adresse fra tabellen
/* og returner resultatet som en
/* streng hvis linies er fundet
/* og eller returneres bool(false)
**********************************/
public function getUserEmail($user_id)
{
$sql = "SELECT mail FROM users WHERE user_id=".$user_id;
return $this->queryItem($sql);
}

}


Jeg ved så at cMysql::result2array() altid vil returnere et array til
mig med det jeg forventer at hente fra databasen.

cMysql::queryItem() bruger jeg til at hente et enkelt felt fra en given
kolonne. Meget rar at have nogen gange.

Fordelen i laget er så at du i dit databaselag altid ved hvilke
funktioner du har til rådighed og hvordan de skal bruges.
På den måde kan jeg nemt overføre mine funktionaliteter til en anden
type database. (der kan være forskellige i sql'en ,men de er vist så små
at man jo er glad for at man har samlet al sin sql i nyttige klasser og
ikke har noget sql i frontenden ;) )

Ligeledes er det nemt for mig at differenciere på om jeg kan bruge
cMysql objektet eller cMysqli objektet da de begge har de samme
funktioner, men cMysql kun bruges på servere hvor cMysqli ikke tilbydes,
uden at jeg skal rette i alle mine scripts kildekode. Jeg er også igang
med at lave et lag til PostgreSQL, da der jo er nogen der ynder at bruge
det istedet.

Håber det gav lidt klarhed?

--
Dan Storm - storm at err0r dot dk / http://err0r.dk/

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!
Dan Storm
 
Posts: 587
Joined: Sun Sep 12, 2004 10:47 am

Re: Viderudvikling af ens php kunstskaber

Postby =?iso-8859-1?Q?Stig_S=F8rensen?= on Thu Nov 20, 2008 7:24 am

On 20 Nov., 14:56, Dan Storm wrote:

> Håber det gav lidt klarhed?

Jow, jeg siger i hvertfald tak for forklaringen :o)

Men hvis du nu ville lave en gæstebog, som et særskilt nyt projekt,
ville du så bruge dine databaselayer dertil? Altså bare inkludere
filen indeholdende databaselayerne og så fortsætte derfra?

Noget som jeg ikke helt forstår, trods jeg har læst flere engelske
artikler, så forstår jeg ikke helt meningen med class.
Synes jeg ville kunne lave det samme som dit uden class, bare ved at
lave funktionerne som de er, uden i et class.
Kan du henvise til en god artikel omkring class? Eller hvis du selv
har tålmodighed, må du meget gerne prøve at forklare mig formålet med
det ;o)

En sidste ting:
$sql = "SELECT mail FROM users WHERE user_id=".
$user_id;
return $this->queryItem($sql);

$this er en variabel, men hvad gør -> ved queryitem($sql) ? (antager
at queryitem() er en anden hjemmelavet funktion du ikke har vist med).


Mvh
Stig
=?iso-8859-1?Q?Stig_S=F8rensen?=
 
Posts: 88
Joined: Mon Oct 11, 2004 9:26 am

Re: Viderudvikling af ens php kunstskaber

Postby Dan Storm on Thu Nov 20, 2008 8:03 am

Stig Sørensen skrev:
> Men hvis du nu ville lave en gæstebog, som et særskilt nyt projekt,
> ville du så bruge dine databaselayer dertil? Altså bare inkludere
> filen indeholdende databaselayerne og så fortsætte derfra?

Ja, det ville jeg. Det giver mig det samme grundlag at lave løsningen på
som jeg er vant til. Objektet er ikke særlig stort, men for mig er det
et værdifuldt værktøj.

> Noget som jeg ikke helt forstår, trods jeg har læst flere engelske
> artikler, så forstår jeg ikke helt meningen med class.
> Synes jeg ville kunne lave det samme som dit uden class, bare ved at
> lave funktionerne som de er, uden i et class.

Det kan du bestem også, men for mig er det noget værre rod.
Din klasse/class/objekt har sit eget scope.
F.eks.:

function addition($a, $b)
{
$c = $a + $b;
return $c;
}

Variabler $a, $b og $c ligger i funktionens scope og kan derfor ikke
bruges uden for funktion - medmindre du bruger globale variabler eller
henvisninger (som nok er et helt andet emne).

Med dit objekt danner du ramme for et område i din kode der består af
sit eget scope, som kan tilgås fra en instans.

Simpel klasse:

class Simple
{
public $message;

public function setMessage($string)
{
$this->message = $string;
}

public function getMessage()
{
return $this->message;
}

}

Eksempel på brugen:

// instansier klassen
$simple = new Simple;

// brug funktion setMessage() i klassen
$simple->setMessage("Hello, World");

//brug funktion getMessage() i klassen

echo $simple->getMessage(); //returnerer Hello, World

// echo variablen $message fra klassen.
echo $simple->message; //returnerer også Hello, World

Hvorfor er det smart? Jo, ser du:
Din kode er mere overskuelig og giver mening når du skal rode i dem.
Objekterne kan udvide hinanden og give dig mere funktionalitet.
Du kan have flere instanser af samme objekt og behøver ikke tænke på om
adskillige funktioner er afhængige af at du er færdig med det første du
havde gang i.

> Kan du henvise til en god artikel omkring class? Eller hvis du selv
> har tålmodighed, må du meget gerne prøve at forklare mig formålet med
> det ;o)

Ikke andet end http://php.net/oop>

Jeg tror det er noget man skal eksperimentere lidt med for at få
forståelse og idéen for det.

> En sidste ting:
> $sql = "SELECT mail FROM users WHERE user_id=".
> $user_id;
> return $this->queryItem($sql);
>
> $this er en variabel, men hvad gør -> ved queryitem($sql) ? (antager
> at queryitem() er en anden hjemmelavet funktion du ikke har vist med).

Ja, queryItem() er en funktion jeg har fra mit cMysql objekt.
Men idet at jeg extendede min cUsers klasse med cMysql klassen, var alle
funktionerne fra cMysql klassen jo med i cUsers.

$this referer til objektet selv.
Som du kan se i eksemplet ovenfor referer jeg til variablen $message
gennem $this->message.

Havde jeg ikke udvidet cUsers med cMysql ville jeg skulle gøre således
istedet:

$db = new cMysql();
$sql = "SELECT mail FROM users WHERE user_id=".$user_id;
return $db->queryItem($sql);

Du spørger bare løs hvis der er noget...


--
Dan Storm - storm at err0r dot dk / http://err0r.dk/

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!
Dan Storm
 
Posts: 587
Joined: Sun Sep 12, 2004 10:47 am

Re: Viderudvikling af ens php kunstskaber

Postby =?iso-8859-1?Q?Stig_S=F8rensen?= on Thu Nov 20, 2008 8:33 am

On 20 Nov., 16:03, Dan Storm wrote:

(snipper lige alt væk)

Jeg tror jeg forstår lidt bedre nu, Dan. Mange tak skal du have!
Jeg vil bestemt gå igang med at kigge nærmere på classes.

Jeg var gået lidt igang med at lave mine egne funktioner som jeg så
altid kunne bruge i mine projekter, og det vil jeg helt klart også
gøre færdigt.
Feks en simpelt mysql_query, fik jeg lavet dette:


---------------------------------------------------------------------------------
function sql_query($from, $what="*") {

global $row;
$result = mysql_query("SELECT $what from $from");
if (!$result) {
die('Invalid query: ' . mysql_error());
}

while ($row = mysql_fetch_assoc($result)) {
return $row;
}
}
---------------------------------------------------------------------------------

Det virker så fint ved:

sql_query("info");
echo $row['navn'];

Dét som jeg så bare ikke lige tog højde for, var at hvis der er flere
rækker der skal returneres, ja det er bare surt, fordi den returnere
jo kun det allerførste - ergo får kun ét enkelt navn ud af databasen,
selvom der er flere.

Synes ellers lige det var så godt lavet ;o)


Nå, men lige tage læsebrillerne på, og vil forsøge at gøre mig klog på
OOP.

Venlige hilsner
Stig
=?iso-8859-1?Q?Stig_S=F8rensen?=
 
Posts: 88
Joined: Mon Oct 11, 2004 9:26 am

Re: Viderudvikling af ens php kunstskaber

Postby =?iso-8859-1?Q?Stig_S=F8rensen?= on Thu Nov 20, 2008 9:57 am

Kan jeg få dig til at vise hvordan din result2array() funktion virker?
Og evt. få et glims af den? :)


Vil meget gerne lave noget ligende, men det halter lige med det sidste.
=?iso-8859-1?Q?Stig_S=F8rensen?=
 
Posts: 88
Joined: Mon Oct 11, 2004 9:26 am

Re: Viderudvikling af ens php kunstskaber

Postby Martin on Thu Nov 20, 2008 10:07 am

Stig Sørensen wrote:
> On 20 Nov., 16:03, Dan Storm wrote:
>
> (snipper lige alt væk)
>
> Jeg tror jeg forstår lidt bedre nu, Dan. Mange tak skal du have!
> Jeg vil bestemt gå igang med at kigge nærmere på classes.
>
> Jeg var gået lidt igang med at lave mine egne funktioner som jeg så
> altid kunne bruge i mine projekter, og det vil jeg helt klart også
> gøre færdigt.
> Feks en simpelt mysql_query, fik jeg lavet dette:

OOP, det er altid det næste step :-)
Genbrug, genbrug og genbrug

Jeg har rigtig mange ting som jeg genbruger til alle mine projekter.

Dette være sig
Mit database lag, som ligger imellem min kode og PDO_MySQL eller
PEAR::DB2, alt efter hvad jeg vil bruge :)

Bruger login system, samt bruger rettigheder.

også er der en helt masse services - SOAP, XML osv osv.

Dog er jeg ved at migrere alt over til Zend Framework, så ca. fra nu af
og til de næste projekter, vil Zend Framework blive mit hoved framework.

Jeg valgte iøvrigt ZF til fordel fremfor CakePHP og Symfony, da ZF kan
bruges som enkeltstående klasser, og man derfor ikke behøver at bruge
MVC strukturen.


>
>
> ---------------------------------------------------------------------------------
> function sql_query($from, $what="*") {
>
> global $row;
> $result = mysql_query("SELECT $what from $from");
> if (!$result) {
> die('Invalid query: ' . mysql_error());
> }
>
> while ($row = mysql_fetch_assoc($result)) {
> return $row;
> }
> }
> ---------------------------------------------------------------------------------
>
> Det virker så fint ved:
>
> sql_query("info");
> echo $row['navn'];
>
> Dét som jeg så bare ikke lige tog højde for, var at hvis der er flere
> rækker der skal returneres, ja det er bare surt, fordi den returnere
> jo kun det allerførste - ergo får kun ét enkelt navn ud af databasen,
> selvom der er flere.

class SQL {

private $link;
private $query;

function __construct() {
$this->db_link = mysql_connect( ... ) OR die(mysql_error());
mysql_select_db(..., $this->db_link) OR die(mysql_error());
}

function query($query) {
$this->query = mysql_query($query);
}

function fetch_array() {
return mysql_fetch_array($this->query);
}

function fetch_row() {
return mysql_fetch_row($this->query);
}
}

$db = SQL;
while ( $r = $db->fetch_array() ) {
...
}

fx.

Selvfølgelig kan det laves meget bedre, og pas iøvrigt på med at bruge
mysql_ funktionerne, eller rettere bruge dem i din hoved klasse (mysql
skulle gerne være en klasse som extender din hoved sql klasse), for så
er det også lige pludseligt muligt at skifte til andre database typer,
såsom PostgreSQL eller MSSQL - man kan aldrig vide hvad man egentlig
lige for lyst til at arbejde med.

Jeg har selv været glad for at jeg netop inkluderet PostgreSQL i min
klasse, da jeg skulle til at lege med transaktioner, og ja bevares det
virker i MySQL, men i PostgreSQL er det ikke muligt IKKE at vælge
transaktions tabeller.

Anyways, i min klasse har jeg fx. en statisk funktion hvor man så for et
pænt array ud

$output = SQL::fetch('SELECT ....');
foreach ($output AS $o) {
echo $o['id'];
}

Desuden så kan $output sendes direkte til template motoren.

Første version af min DB ting, ligger forresten her
http://www.phpclasses.org/browse/package/3821.html
BEMÆRK at jeg lige nu bruger version 6-7 stykker, da den er omskrevet en
hel del gange hehe

Template engines er også en god ting at lære, hvis man ikke vil benytte
MVC strukturen.

(smarty og templatelite kan anbefales, eller templatelite)

>
> Synes ellers lige det var så godt lavet ;o)
>
>
> Nå, men lige tage læsebrillerne på, og vil forsøge at gøre mig klog på
> OOP.

OOP handler meget om at få struktureret koden på en lidt og læsevenlig
måde, så den næste/med udvikler kan arbejde videre med det uden at kigge
hele sitet igennem for at se hvad det egentlig er der menes.

Desuden så handler det også om imo at få fjernet HTML/PHP/Javascript
osv. kode fra hinanden, så den ene udvikler kan arbejde med det han er
bedst til osv. Altså ligesom man har gjort med CSS og HTML, kan vel sige
på en måde :)

PS
Det kan tage LANG (for nogle år...) at bare kunne se meningen med OOP,
også bagefter tager det også langtid at arbejde med det.

Det er faktisk som at lære PHP fra bunden af...

Jeg vil anbefale dig, hvis du vil bruge det seriøst, at finde enten
nogle webinars, eller nogle decideret kurser til dette. Zend holder
begge dele.
Martin
 
Posts: 1124
Joined: Wed Jul 16, 2003 10:57 pm

Re: Viderudvikling af ens php kunstskaber

Postby Martin on Thu Nov 20, 2008 11:23 am

Martin wrote:
> function fetch_array() {
> return mysql_fetch_array($this->query);

skal være
return mysql_fetch_array($this->query, $this->link);


> }
>
> function fetch_row() {
> return mysql_fetch_row($this->query);

skal være
return mysql_fetch_array($this->query, $this->link);
Martin
 
Posts: 1124
Joined: Wed Jul 16, 2003 10:57 pm

Next

Return to Produktion af websider ved brug af php (dk.edb.internet.webdesign.serverside.php)

Who is online

Users browsing this forum: No registered users and 0 guests