PHP & MySQL
 

 

PHP

Intermezzo: Ter referentie even wat html-code alvorens we beginnen

HTML crash cursus:

<div class= ></div> stelt hierbij een divisie in html voor. Een afgebakend deel van je html page die als één blok geformatteerd kan worden (class wordt aangegeven). Het kan dan verder verdeeld worden in pages <p format></p>

<pre></pre> houdt een vaste breedte aan en de spaces en breaks blijven behouden (veel gebruikt bij tabellen).

<td></td> geeft aan een cel in een tabel

<tr></tr> geeft aan een rij in een tabel

<br/> springt naar de volgende regel. Het is een begin en end tag in een. Het PHP equivalent is /n >>> newline

<hr> wordt gebruikt om een verandering aan te geven in hetzelfde blok. Je blijft in een afgebakende deel

<hr > komt zonder closing tag.

<ul></ul> creeert een unordered list, die dan weer uit list items <li ></li> bestaan.

<select></select> creeert een dropdownlist, die dan weer uit option items <option></option> bestaan.

a href= http://iemsabi.com>IEMSABI</a>  geeft een link aan naar een website. IEMSABI is wat de gebruiker ziet.

<a href=”#id”>Ga naar id</a> geeft een link aan naar een plaats in de locale website. Gebruiker ziet ‘Ga naar id’

Html elements kunnen een attribute hebben. De attribute geeft meer informatie over of bepaald de eigenschap van het element. Ze worden in de start tag gespecificeerd en komen als: naam = “waarde”

Onderstaand enkele voorbeelden

<!DOCTYPE html>            >>>document type is html
<html lang="en-US">     >>>taal is US engels
<body><h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>

</html>

<p title="About W3Schools">dit is een lang verhaal</p>

<a href="http://www.w3schools.com">This is a link</a>

<img src="w3schools.jpg" width="104" height="142">

 

PHP

 

Waarom zou je PHP willen configureren

·         Om performance te verbeteren of speciale noden te adresseren

·         Default settings zijn in meeste gevallen OK

Hoe configureer je PHP

·         Edit de xampp/php/php.ini file en restart de web server om PHP te reloaden

·         XAMPP heeft een “config” optie onder Apache die je brengt naar php.ini

Welke zijn de belangrijkste PHP parameters die geconfigureerd moeten worden

·         Date.timezone, output_buffering, memory_limit, max_execution_time,

              display_errors, error_reporting, include_path, upload_time_dir

 

Waarom zou je MySQL willen configureren

·         Om performance te verbeteren of speciale noden te adresseren

·         Default settings zijn in meeste gevallen OK

Hoe configureer je MySQL

·         Gebruik liever phpmyadmin > status > “advisor” om eerst een analyse uit te voeren en aanbevelingen te doen

·         Edit xampp/mysql/bin/my.ini

Welke zijn de belangrijkste MySQL parameters die geconfigureerd moeten worden

·         Long_query_time, log_slow_queries, query_cache_size, query_cache_type, max heap_table_size, open_files_limit, thread_cache_size

Waarom zou je Apache willen configureren

Om het aan te passen aan andere software die op je system loopt of om virtual hosts definitions te configureren

Hoe configureer je de Apache (webserver)

xampp\apache\conf\Apache (httpd.conf) (maak eerst een copy van de file als backup) ook in xampp>config > httpd.conf

xampp\apache\conf\extra\httpd-virtualhosts.conf

De file toont de

ServerRoot “c:/xampp/apache” >>>de locatie van apache

Listen 0.0.0.0:80 >>>de poort                                                   

ServerName localhost: 80 >>> Je kan de servernaam veranderen, heb je de poort in Listen veranderd, dan moet je het ook hier veranderen.

LoadModule toont de verschillende modules >>> om een module te activeren moet je het # teken verwijderen

Je kan apache restarten door het in xampp te stoppen en opnieuw te starten

DocumentRoot “c:/xampp/htdocs” >>> toont de locatie voor alle configuratie files

Welke zijn de belanrijkste parameters die geconfigureerd moeten worden

·         Listen, loadmodule*, DocumentRoot, <Directory”/path/to/xampp/htdocs”>, Include*,

Wat is een “virtual host” en waarvoor wordt het gebruikt

·         Toont de weg naar een document die een website simuleert (web project)

·         Hoe configureer je een virtual host

In hosts file: creer een pointer van de website naar 127.0.0.N (N staat voor elk willekeurig getal (hier geldt N<256))

In xampp/apache/conf/extra/httpd-vhosts.conf voeg je een definitie toe (zoals boven)

Stop> start > apache

 

Opzetten van een nieuwe virtual website iemsabi.com

Zet de projectfolder iemsabi.com in  htdocs. Hierin zitten files met de configuratiegegevens voor het project. 

In de hosts file kan je de dns settings aanpassen >>> 127.0.0.2    iemsabi.com

In httpd-virtualhosts.conf ga je naar beneden en copieert vanaf ##</VirtualHost > naar beneden, paste het eronder en verwijder de ## van de tweede regel.

Maak de aanpassing

<virtualhost iemsabi.com:80>

ServerAdmin postmaster@iemsabi.com

Documentroot “c:/xampp/htdocs/iemsabi.com/public”

ServerName iemsabi.com

ServerAlias www.iemsabi.com

ErrorLog “logs/iemsabi.com.local_error.log”

customLog “Logs/training.unlikelysource.local-access.log” combined

</VirtualHost>

Save the file> xampp > stop apache > start apache

Open http://iemsabi.com en het zal opengaan

 

Editors en IDE’s

 

IDE is een integrated development environment

Wat is het verschil tussen een editor en een IDE

Een editor is een wordprocessor waarin je PHP en HTML code als blote tekst kunt saven.

Een IDE biedt een editor, maar ook development features zoals debugging, profiling en pop-up suggestion lists

Je gebruikt een editor als het om een simpele PHP en of html pagina gaat. Een IDE gebruik je bij grote PHP programmeringsprojecten met meer dan 10 samenhangende files.

Cross-platform editors: geany, bleufish, gedit

Windows editors: notepad, notepad plus, editPlus (shareware)

Cross-platform IDE’s: PHP eclipse, Zend Studio (niet gratis), NetBeans

 

Saving Your Code

Hoe set je een nieuwe website op

Ga naar htdocs folder en create new folder bv projectx

In notepadplus open je een nieuwe document  en type

<?php

Echo ‘Hello World!’;

Save het in projectx als hello.php

Open http://localhost/projectx/hello.php

Waar zit de PHP en MySQL documentatie

Php documentatie vind je op http://www.php.net

Je kan in de search bar zoeken naar commands, functions en andere informatie

Een functie wordt zo weergegeven:

string substr ( string $string , int $start [, int $length ] )

de functie begint bij de functie naam in boldletters subst

() hiertussen zitten de parameters

[] hiertussen zitten de optionele parameter die ook mogen worden weggelaten

string geeft het datatype van de in te vullen parameter van de functie aan

string $string geeft aan dat je een string of de naam van een string moet invullen

Int $start geeft aan dat je een integer als start waarde moet invullen

Onderin worden alle parameters beschreven en worden voorbeelden gegeven

Er zijn soms ook user comments met belangrijke code block te vinden

MySQL documentatie vind je op

https://dev.mysql.com/

Het heeft een tutorial om je te helpen om de language te leren

Je kan de code vinden door het te zoeken in de search bar

In http://localhost/xampp kan je hulp krijgen betreffende xampp

Status verteld je welke modules geactiveerd zijn. De modules zijn MySQL, PHP, HTTPS, CGI (common gateway interface), SMTP, FTP, en Tomcat

Documentation geeft documentatie van alle software packages in XAMPP

Components geeft informatie over de verschillende software packages

Onder PHP heb je:

       Phpinfo() geeft informatie over php installatie

       Onder phpinfo() zie je enkele voorbeeldprogramma-tjes

Phpmyadmin laat je administratieve taken uitvoeren.

·         http://apachefriends.org is een blog voor xampp gebruikers

·         http://forums.mysql.com is een blog voor mysql gebruikers

·         forums.zend.com heeft onder PHP programming een forum voor php gebruikers

·         zend.com/en/resources/webinars toont videosessies van webinars  van Zend

Security analyseert je systeem en doet aanbevelingen omtrent het beveiligen van je systeem

 

In XAMPP zijn er verschillende servers beschikbaar

Apache >>> web server

MySQL >>> database server

Mercury >>> mailserver

Filezilla >>> ftp server

Tomcat >>> Java server

 

Hoe gaan we tewerk

De course files kan je copieren naar de htdocs folder (xampp\htdocs)

In XAMPP control panel apache en MySQL starten

In http://localhost/phpmyadmin click phpmyadmin > priveleges > edit priveleges en geef een password aan root

In http://index.php click security > hier moet je ook een password geven aan de root

Nu kan je in http://localhost/phpmyadmin met root en password

 

Opzetten van een nieuwe database:

Click User en dan add user

Geef de volgende informatie

Username: class >Host: localhost > Password > Retype password


 

Bij Database for user selecteer je: Create database with same name and grant all privileges  > add user

Click “Import” > Click “Choose File” en selecteer Xampp/WorkingFiles/ class setup.sql

Accepteer de defaults > klik Go

 

 

Opzetten van een nieuwe website

Maak een folder xamp/htdocs/sweets complete

Open getting-started_project.zip in workingfiles folder en extract naar xampp/htdocs/sweetscomplete

Je kan het openen in http://localhost/sweetscomplete/index.html

Nu open je de file index.html met notepad plus en zet helemaal aan het begin de php opening tag

<?php //do something ?> om hierna de file te saven as index.php

http://localhost/sweetscomplete/index.php

Het laatste kan je doen om alle html files in php om te zetten.

 

BASICS

comments >>> kan je in script gebruiken als commentaar voor de developer

#single line comment

// voor een single line inline comment kan ook komen op dezelfde regel als code. Dus achter de code.

/* voor een multi-

line comment */

 

Variabelen >>> Worden gebruikt om waarden op te slaan

Begint met een $ en een string beginnend met een letter of onderscore > = > waarde.  Variabelen zijn case sensitive.

‘String waarden’ staan tussen accolades, getallen niet. Gebruik liefst descriptive names met camelCase (ElkWoordBegintMetEenHoofdletter)

$FirstName = ‘value01’;

$TableLength = 1;

 

 

Link to an element with a specified id within a page (the name attribute is not supported in HTML5):

<a href="#top">Go to top</a>

 

We kunnen, in de html-code opgeroepen stringwaarden als ‘string’ met een variabele substitueren.

Definieer eerst de variabelen.

$company = ‘ABC Consulting’; $link1 =’About Us’; $link2=’Products’; $link3=’Services’;

De ‘stringwaarden’ in een html page worden dan verwisseld met een php-tag <?php echo ‘variabele’?>

Onderin doen we dit voor de header met $company, en voor col1 met $link1, $link2, $link3

<div class=”header”><?php echo $company?> >>>wat er in de header moet staan

</div>

<div class=”col1”>

<p>&nbsp;</p>

<a class=”MsoNormal” href=”#”><?php echo $link1; ?></a>

<p>&nbsp;</p>

<a class=”MsoNormal” href=”#”><?php echo $link2; ?></a>

<p>&nbsp;</p>

<a class=”MsoNormal” href=”#”><?php echo $link3; ?></a>

</div>

<!—verander de waarden met <> “Link1, Link2 en Link3” via de PHP tags

 

Als je nu de waarden van company, link1, link2 en link3 verandert, verandert daarmee ook de headers en de titels in de column col1

Variabelen stellen je in staat om veranderingen in je webpage aan te brengen, zonder code rewrite.

 

DATA TYPES

 

<?php

Integer (int) is een heel getal zonder decimalen

$intValue = 9982; de variabele $intValue heeft een waarde 9982

echo $intValue;          >>> toont de waarde als een integer

Float is een getal met een decimale waarde. De float is de positie van de punt .

$floatValue = 3227.95; is een variabele met waarde 3227.95

echo $floatValue;      >>>toont de waarde als een float

var_dump functie verzamelt het type en de waarde van een variabele

echo var_dump ($floatValue); toont de waarde van de variabele $floatvalue

echo ‘<br />’;               >>>slaat een regel over

 

Tekst wordt in php string genoemd

Strings kunnen met ‘ ’ en met “ ” gepubliceerd worden

‘ ’ hiertussen staat de string en het publiceert de string

“ ” hiertussen staat de string, maar het publiceert de waarden van de string

Bv

$stringValue1 = ‘this is a string value’

Echo $stringValue1;                       //toont this is a string value

Echo ‘Why $stringValue1’             //toont Why $stringValue1

Echo “Why $stringValue1”           //toont Why this is a string value

Om een apostrof te plaatsen is een escape karakter nodig

$stringValue2 =’isn\’t‘ it a wonderful day’

Echo $stringValue2

 

Boolean kent slechts twee waarden TRUE en FALSE

De if statement werkt als volgt.

Als de vergelijking na if waar is wordt de opdracht tussen { } uitgevoerd, als het niet waar is de opdracht na else tussen { }

$validUser = TRUE;

if ($validUser) {echo 'User is Valid';}

else {echo 'User is NOT Valid';}

echo '<br />';

uitkomst >>> User is Valid

Als we de variabele veranderen $validUser = FALSE;

 Is de uitkomst >>> User is NOT Valid

 

Je zal verschillende data types gebruiken om verschillende typen informatie op je website te tonen. Strings worden gebruikt voor customer names, titles, descriptions, codes etc. Integers voor dagen, maanden, jaren en hoeveelheden. Float voor prijzen en grote waarden. Boolean voor het opslaan als iets waar is of niet.

Behalve de waarde kan ook het datatype van een variabele veranderen terwijl de script loopt.

Var-dump ($variable)>>> PHP bepaalt automatisch in welke datatype de variabele getoond wordt.

type casting is het handmatig specificeren van een datatype, of het omzetten van een datatype in een andere

$floatValue = 10/3;

$intValue2 = (int) $floatValue;  >>> bepaald dat het resultaat een integer moet zijn

Echo var_dump($intValue2)

 

MATHEMATISCHE FUNCTIES

Je kan mathematische functies gebruiken in PHP.

 

Je kan variabelen opslaan als een mathematische functie die een of meer variabelen en/of integers bevatten

$addValue1 = 2 + 2;

$addValue2 = $addValue1 + 22.8;

$addValue3 = $addValue1 + $addValue2;

$subValue1 = $addValue3 - 10;

$mulValue1 = 2 * 2;

$divValue1 = 22/7;

$comboValue1 = (($addValue1 + $addValue2) * 22) / 18;

 

// display results

echo "<br />Addition:";

echo "<br />Value 1: $addValue1";

echo "<br />Value 2: $addValue2";

echo "<br />Value 3: $addValue3";

echo "<br />Subtraction:";

echo "<br />Value 1: $subValue1";

echo "<br />Division:";

echo "<br />Value 1: $divValue1";

echo "<br />Combo:";

echo "<br />Value 1: $comboValue1";

 

<?php

// Understanding the Basics: Performing Arithmetic Operations

// combination operators:

// advantage: represents a shorter way of representing a simple arithmetic operation

Combinatie operators "+"  "-"  "*"  or  "/"  plus  "=" bieden een kortere manier om een functie uit te typen.

// using addition to add a value to an existing variable

$intValue = 39;

$intValue = $intValue + 3; // add original value + 3

echo $intValue;   // returns 42

echo '<br />';

 

// same thing using combination operator +=

$intValue = 39;

$intValue += 3;                                 // adds original value + 3

echo $intValue;                                // returns 42

echo '<br />';

 

// other examples

$intValue *= 2;                                 // multiplies original value times 2

echo $intValue;                                // returns 84

echo '<br />';

$intValue -= 20;           // subtracts 20 from original value

echo $intValue;                                // returns 64

echo '<br />';

$intValue /= 10;           // original value divided by 10

echo $intValue;                                // returns 6.4

 

Als je wilt tellen hoe vaak iets voorkomt, kan je de value++ gebruiken.

Het telt bij elke nieuwe invoer automatisch 1 op of af van de originele waarde.

// increment

$value = 1;

$value++;                                           // adds 1 to $value

echo $value;                                     // returns 2

echo '<br />';

De tegengestelde functie is value--

// decrement

$value = 1;

$value--;                                             // subtracts 1 from $value

echo $value;                                     // returns 0

echo '<br />';

 

Constants zijn als variabelen met een constante gefixeerde waarde.

CONSTANTS worden in hoofdletters gedefinieerd, en kunnen 4 basis data types worden toegewezen

Ze worden alsvolgt gedefinieerd

define (‘LEVEL_1’,1); >>> constant LEVEL_1 is een integer met waarde is 1

define(‘FILE_ERROR’,’ERROR: unable to open a file!’); >>>FILE_ERROR is een string met waarde ERROR: unable to open a file

define(‘VALID’, TRUE); >>> constant VALID is een Boolean met waarde TRUE

define(‘PI’, 22/7) >>>constant PI is een float met waarde 22/7

Je kan ook een constant toewijzen aan een variabele.

$pi = PI

Per default zijn bij de installatie van PHP een aantal constants gedefinieerd, bv.

de versie van PHP >>> PHP_VERSION;

error messages >>>PHP_EOL

maximum size of an integer >>>PHP_INT_MAX

Magic Constants worden gedefinieerd elke keer als een PHP program begint te runnen

Ze starten en eindigen met “__ “

Vb

echo__FILE__;

echo__DIR__;

$reference = ‘ http://php.net/manual/en/language.constants.predefined.php ’;

Je kan ze vinden in htdocs\Chapter2\basics_values_3.php

 

PRINTF

printf() functie wordt gebruikt om een string accuraat te formatteren

In het onderstaande voorbeeld wordt een tabel met inhoud geformuleerd

De variabelen worden in PHP gedefinieerd.

De html script formuleert een tabel met headers en een rij.

En de variabelen worden in de html script in de eerste rij via PHP echo geïntroduceerd

 

<?php

$name = 'Alexandria';                  

$accountNumber = 1234;           

$balance = 1443.22;

?>

<table border="1" cellpadding="5">

                    <tr>            <th>Name</th>

                                         <th>Account Number</th>

                                         <th>Balance</th>                           </tr>

                    <tr>            <td><pre> <?php echo $name ?> </pre></td>

                                         <td><pre> <?php echo $accountNumber ?> </pre></td>

                                         <td><pre> <?php echo $balance ?> </pre></td>         </tr>

</table>

 

In het onderstaande voorbeeld worden de variabelen gedefinieerd

De tabel wordt in php geformuleerd en de waarden worden via de Printf code (formatstring) geïntroduceerd

<?php

$name = 'Alexandria';

$accountNumber = 1234;

$balance = 1443.22;

echo '<table border="1" cellpadding="5">';

echo '<tr><th>Name</th><th>Account Number</th><th>Balance</th></tr>';

echo '<tr>';

printf('<td><pre>%20s</pre></td><td><pre>%08d</pre></td><td><pre>%.2f</pre></td>', $name, $accountNumber, $balance); /* >>> de formattering geeft aan dat er drie columns zijn </pre><td>…</td></pre> daarnaast geldt dat

20s staat voor 20 spaces width, 08d staat voor 8 digits, %.2f staat voor float met 2 cijfers achter de . */

echo '</tr>';

echo '</table>';

<?php

 

WORKING WITH STRINGS

SUBSTR COMMAND toont een deel van een string

syntax substr($string, $start, $length)

$string is de string of de naam van de string

$start geeft de beginpositie aan; 0 is voorin

$lenght geeft de lengte van de output-string aan. Als je niets specificeert wordt alles na de positie getoond

We hebben twee namen en willen er een van maken

 

<?php

$firstName = 'Doug';

$lastName = 'Bierer';

 

printf('<br />Full Name: %s %s', $firstName, $lastName); >>> toont de volledige naam Doug Bierer %s staat voor string

printf('<br />Initials: %s %s', substr($firstName, 0, 1), substr($lastName, 0, 1)); >>> pakt 1 positie vanaf het eerste character

 

Nu hebben we een volledige naam en we willen de namen extracten

<?php

$name = 'Mr. George Clooney';

printf('<br />Formal Name: %s', $name);

printf('<br />First Name: %s', substr($name, 4, 6)); >>> 4 characters die de voornaam uitmaken worden verwijderd

printf('<br />Name without Title: %s', substr($name, 4)); >>> als je de lengte niet specificeert wordt het overige getoond

Als je de lengte van de voornaam niet weet kan je de functie strpos gebruiken.

 

Willen we nu het laatste deel van een naam hebben dan gebruiken we een negatief getal

Onderin gebruiken we een magic constant om het laatste 3 karakters van de naam van een file te extracten

De filenaam is basics_substr_3.php

<?php

$filename = __FILE__;                                                                                                    

$extension = substr($filename, -3);

printf('<br />File Name: %s', $filename);

printf('<br />Extension: %s', $extension);

<?php

 

De . Punt wordt gebruikt als concatenate operator om de strings samen te voegen

Eerst de variabelen

$street      = 'Main Street';

$number   = 248;

$city                                = 'Toronto';

$province = 'Ontario';

Dan de operator

$address = $number . ' ' . $street . ', ' . $city . ', ' . $province;  >>> 248 Main Street, Toronto, Ontario (spatie achter $number)

echo "<br />Full Address Using '.'  :<br /> $address";

 

Je kan ook sprintf() gebruiken om ze samen te voegen ongeveer als printf (maar sprintf >>> string en printf >>> waarde)

%d is voor de integer, %s voor de verschillende strings

$address = sprintf('%d %s, %s, %s', $number, $street, $city, $province);

echo "<br />Full Address Using sprintf  :<br /> $address";

 

<?php

trim() verwijdert spaties van het begin en het eind van een string

$untrimmedString = '  This is a string with spaces at the ends.    ';

 

strlen() bepaald de lengte van een string als het aantal characters

$lengthUntrimmed = strlen($untrimmedString);

 

$trimmedString = trim($untrimmedString);

$lengthTrimmed = strlen($trimmedString);

 

printf('<br />String Before -->|%s|<--', $untrimmedString);

printf('<br />String After ---->|%s|<--', $trimmedString);

printf('<br />Length Before --> %d', $lengthUntrimmed);

printf('<br />Length After ---> %d', $lengthTrimmed);

 

 

<?php

strtolower(), strtoupper(), or ucwords() worden gebruikt om een string in alleen kleinletters, alleen hoofdletters te veranderen of  alle woorden te laten beginnen met een hoofdletter.

$text = 'The quick brown fox jumped over the fence.  Quick as a wink he was gone.';

$textLower = strtolower($text);

$textUpper = strtoupper($text);

$textFirstWords = ucwords($text);

echo '<table border="1">';

ð  de functie kan ge-incorporeerd worden in de printf functie voor het formuleren van een tabel.

printf('<tr><th>lowercase  </th><td>%s</td></tr>', $textLower);

printf('<tr><th>UPPERCASE  </th><td>%s</td></tr>', $textUpper);

printf('<tr><th>1st Letter </th><td>%s</td></tr>', $textFirstWords);

echo '</table>';

 

<?php

str_replace() or str_ireplace() om delen van een string te vervangen met iets anders

$text1 = 'The quick brown fox jumped over the fence.  Quick as a wink he was gone.';

$text2 = str_replace('wink', 'turtle', $text1); >>>vervangt 'wink' met 'turtle'

</th><td>de tweede 'Quick' verandert niet aangezien het case sensitive is

$textSlow1 = str_replace('quick', 'slow', $text2); >>> Vervangt 'quick' met 'slow' case sensitive. De 2e Quick verandert niet

$textSlow2 = str_ireplace('quick', 'slow', $text2); >>> vervang 'quick' met 'slow' case insensitive, quick verandert beide keren

 

strpos() vindt de locatie van het eerste letter van een substring in een string. Strpos() is case sensitive

stripos() is case insensitive

 

Als je substr met strpos combineert kan je accuraat een substring uit de string halen.

$pos = strpos($text2, 'Quick'); >>> vindt Quick in de hele zin en toont je de positie van de eerste karakter Q

$string1 = trim(substr($text2, 0, $pos)); >>>neemt weg alles beginnend vanaf de positie van Q van Quick

$string2 = trim(substr($text2, $pos)); >>> neemt weg alles tot de Q van Quick

Plak de strings weer met concatenate. Gebruik "ucfirst()" i.p.v. "ucwords()" om alleen het eerste character te vervangen

$newText = str_ireplace('quick', 'slow', $string1) . '  ' . ucfirst(str_ireplace('quick', 'slow', $string2));

 

Het resultaat

use 'single quotes' for text and "double quotes" if you need variables to be expanded

echo '<table border=1>';

echo "<tr><th>Original</th><td>$text1</td></tr>";

echo "<tr><th>Turtle</th><td>$text2</td></tr>";

echo "<tr><th>1st Replace</th><td>$textSlow1</td></tr>";

echo "<tr><th>2nd Replace</th><td>$textSlow2</td></tr>";

echo "<tr><th>Position Quick</th><td>$pos</td></tr>";

echo "<tr><th>String 1</th><td>$string1</td></tr>";

echo "<tr><th>String 2</th><td>$string2</td></tr>";

echo "<tr><th>New Text</th><td>$newText</td></tr>";

echo '</table>';

 

DEBUGGING AN APPLICATION

ERROR MESSAGES

 

Een "notice" voor onderstaand (notitie)

echo $undefinedVariable; >>> Je moet dus een variabele die gebruikt wordt nog definiëren

Een "warning" voor onderstaand (waarschuwing)

$text = 'Test'; 

echo strpos($text, 'Test', 5); >>> De derde parameter hoort er niet thuis

Een "warning" voor onderstaand

echo 22/0;  >>> mathematische fout delen door 0 is niet mogelijk                                                                                                     

Een "parse" error voor onderstaand

$error = 'This is a string which doesn't have the ' escaped properly!'; >>> de ‘ van doesn’t moest met doesn/’t gebruikt zijn

Een warning en fatal error voor onderstaand (bij een fatal error kan het programma niet lopen)

require 'some_file.txt'; >>> de genoemde file kan niet gevonden worden op de aangegeven lokatie

 

<?php

Gebruik van ini_set(), error_reporting(), var_dump(), exit,  

 

Je moet debugging zichtbaar maken door

ini_set('display_errors', 0); >>> fouten zichtbaar te maken en

error_reporting(E_ERROR); >>> debugging aan te zetten

Bij het opleveren van het project mag je debugging weer uitzetten.

error_reporting(E_ALL | E_STRICT); >>> zet debugging op de meest sensitive niveau

De apache error log toont ons alle fouten in de code

PHP error log toont meer PHP specifieke fouten

 

Combineren van PHP met HTML

Open de file htdocs/sweetscomplete/cart.php

Gebruik PHP variables om quantity en price te vertegenwoordigen

Bovenin worden de variabelen $qtyN en $priceN gedefinieerd en

En een variabele toegevoegd die het totaal voor quantity x price voor alle drie items berekent

En variabelen voor de persoonsgegevens

<?php

//define quantity and price

$qty1=1;

$price1=1.1;

$qty2=2;

$price2=2.2;

$qty3=3;

$price3=3.3;

$total = ($qty1 * $price1) + ($qty2 * $price2) + ($qty3 * $price3);

$name = ‘Doug’;

$phone = ‘0206333110’;

$fax = ‘0206333110’;

$email =’john@iemsabi.com’;

?>

We gaan ze invoegen in de value attribute. Search <td>Qty:

Gebruik PHP in de 3 <?php echo ?> tags om de quantity te tonen met de "value" attribute

<input type="text" value="<?php echo $qty1; ?>" name="qty[]" class="s0" size="2" />

<td><?php printf("$ %8.2f', $price1); ?></td>  >>> gebruik printf om de formattering constant te houden

                <td><?php printf("$ %8.2f', $price1*qty1); ?></td> >>> berekent de prijs

Doe dit voor alle drie blokken Ambrosia Salad, Boston Cream Pie en Chocolate Fondue  met de $qtyN en $priceN

Search Welcome guest en vul php tag met $name in voor guest

Vul hieronder overeenkomstig de variabelen voor $phone, $fax en $email in.

Search Products Total om daar de variabele $total in te vullen. Gebruik hier printf met 10 digits

<?php printf’($%10.2f’, $total);?>

Save het document en test

We moeten nu de links over en weer veranderen in shopping cart en in index.html

Search en vervang home.html in index.php

In index.php moet ook verwezen worden naar cart.php i.p.v. cart.html

Save de files en test

 

Gebruik printf() om het totaal te etaleren

<td><?php printf("$ %8.2f", $qtyN * $priceN); ?></td>

total <?php printf("$ %10.2f', $total); ?>

Verander de quantities en waarden en test het in je browser met http://localhost/sweetscomplete/cart.php

Gebruik PHP variabelen om de naam, phone, fax en email te vertegenwoordigen

$name = 'Doug'; $phone = '212-555-1212'; $fax = '212-555-2121';

$email = 'sales@sweetscomplete.com';

Welcome <?php echo $name; ?> Tel: +44-<?php echo $phone; ?> etc.

Verander de waarden en test het in je browser

http://localhost/sweetscomplete/cart.php

In de file moet je index.php linken aan cart.php i.p.v. cart.html

basics_lab.php

copy the "images" folder to /path/to/xampp/htdocs/project

copy the "css" folder to /path/to/xampp/htdocs/project

copy the file "basics.html" to /path/to/xampp/htdocs/project/home_page.html and make changes as indicated in comments

copy this file to /path/to/xampp/htdocs/project/index.php and make the changes indicated below

assign variable $company = your company name

assign variable $linkHomePage = 'Home Page'

assign variable $linkProducts = 'Products'

assign variable $linkAboutUs = 'About Us'

this command will include the file you copied and modified

the "include" command will be covered in another lesson

include 'home_page.html';

 

ARRAYS

 

<?php

Een array is een datatype in PHP die een rij etaleert. De rij kan zelf uit alle datatypen bestaan en ook uit een mix van verschillende datatypen. Een variable kan ook een array als waarde hebben.

Een ‘Numeric’ key is een verwijzing naar een array (rij) in PHP. Een key is altijd een positieve integer.

Een array met een numeric key wordt een numeric array genoemd in PHP.

 

Arrays kunnen integers bezitten. Zie onderstaande variable

$arrayNumeric1 = array(1, 2, 3, 4, 5);

var_dump($arrayNumeric1);

echo '<br />';

Arrays kunnen alle datatypen bezitten:

$arrayNumeric2 = array('apple', 'banana', 'cucumber', 'date', 'egg');

var_dump($arrayNumeric2);

echo '<br />';

Zo ook gemengde waarden:

$arrayNumeric3 = array('apple', 22, 'cucumber', 192.47, FALSE);

var_dump($arrayNumeric3);

echo '<br />';

Je kan de values uit een array via de key [ ] etaleren.

Als je arrays tussen "double quotes" gaat gebruiken, moet je de {$array[N]} formulering gebruiken.

echo "<br />Element 0: {$arrayNumeric3[0]}";                     // apple >>> [0] verwijst naar het eerste element van de array

echo "<br />Element 3: {$arrayNumeric1[3]}";                     // 4 >>> [3] verwijst naar het vierde element van array

 

<?php

 

Associative arrays gebruiken een string als key

$name['first'] = 'Julia'; >>> de key staat tussen [ ] en de waarde tussen ‘ ’

$name['last'] = 'Roberts';

$name['age'] = 37;

$name['occupation'] = 'Actress';

 

var_dump($name);

 

Je kan dan de elements per key accessen.

printf('<br />Full Name: %s %s', $name['first'], $name['last']);

Hierbij worden de keys [‘first’] en [‘last’] gebruikt om de waarde Julia Roberts te accessen

 

<?php

Het toekennen van waarden in arrays gebeurt met de range() functie:

$arrayN= range (start, end, step)

$array1 = range(0, 99, 10);

var_dump($array1);

echo '<br />'; >>>array(10) {  [0] =>int(0) [1] =>int(10) [2] =>int(20) [3] =>int(30) [4] =>int(40) [5] =>int(50) [6] =>int(60) [7] =>int(70) [8] =>int(80) [9] =>int(90)  }

Het toekennen van string keys en waarden gebeurt met de array() functie

$array=array(key=>value, key=> value)

$arrayAssoc =array(4){ array('first' => 'Julia', 'last' => 'Roberts', 'age' => 37, 'occupation' => 'Actress')}

var_dump($arrayAssoc);

echo '<br />';>>> array(4){  [“first”]=> string(5) ’Julia’ [“last”]=>string(7) ’Roberts’[“age”]=>int(37), [“occupation”] =>string(7) ’Actress’                   }

om keys en waarden toe te voegen aan het  einde van een bestaande array

$array[] = value;

In onderstaande populatie wordt steeds een waarde toegevoegd aan het einde van de array

$arrayNumeric = array(); >>> hiermee wordt de array geïnitialiseerd               

$arrayNumeric[1] = 22; >>> hier wordt de eerste waarde bepaald

$arrayNumeric[] = 18; >>> voegt een waarde toe voor key [2]

$arrayNumeric[] = 197; >>> voegt een waarde toe voor key [3]

var_dump($arrayNumeric);

echo '<br />';>>> array(3) {[1]=>int(22)=> [2] =>int(18) [3]=>int(197) }

 

Keys hoeven niet perse in volgorde toegekend te worden.

$arrayOutOfOrder = array();

$arrayOutOfOrder[33] = 'apples';

$arrayOutOfOrder[22] = 'bananas';

$arrayOutOfOrder[99] = 'cantalope';

$arrayOutOfOrder[] = 'dates';

var_dump($arrayOutOfOrder);

echo '<br />'; >>>array(4) {[33]=>string(6) ’apples’[22]=>string(7) ‘bananas’ [99]=> string(9)=>’cantilopes’ [100]=>string(5) ‘dates’ }

Om achteraf te sorteren gebruik je ksort()

 

MULTIDIMENSIONAL ARRAY

<?php

// Working with Arrays: Creating a Multidimensional Array

array(array(), array(), etc.) kan initieel gebruikt worden.

 

10 X 10 Matrix met 10 rijen en 10 kolommen voor Numerics gebruikt range in array.

$matrix = array(range(0, 9), range(0, 9), range(0, 9), range(0, 9), range(0, 9),

                             range(0, 9), range(0, 9), range(0, 9), range(0, 9), range(0, 9),);

Elke range vertegenwoordigd een array met 10 waarden.

De laatste comma is niet nodig

 

associative multidimensional array gebruikt array (‘key’ =>array())

$multiAssoc = array('a' => array('aa' => 1, 'ab' => 2, 'ac' => 3),

                                     'b' => array('ba' => 1, 'bb' => 2, 'bc' => 3, 'bd' => 4),

                                     'c' => array('ca' => 1, 'cb' => 2),

                                     'd' => array('da' => 1, 'db' => 2, 'dc' => 3));

Elke key a, b, c, d vertegenwoordigt zelf een array.

 

Een 3D array gaat als volgt:

$array3D = array(array(array(1, 2, 3), array(1, 2, 3), array(1, 2, 3)),

                     array(array(1, 2, 3), array(1, 2, 3), array(1, 2, 3)),

                     array(array(1, 2, 3), array(1, 2, 3), array(1, 2, 3)));

Hier zien we een array(1, 2, 3)

Onderin worden de resultaten getoond

echo '<table>',

'<tr>',

'<th>Numeric 10 x 10 Matrix</th>',

'<td style="width: 100px;">&nbsp;</td>',

'<th>Associative Multidimensional</th>',

'<td style="width: 100px;">&nbsp;</td>',

'<th>3D Array 3 x 3 x 3</th>',

‘</tr>',

Het tonen van de resultaten kan met de printr_() functie. Print_r() doet hetzelfde als var_dump.

'<tr>','<td>','<pre>';

print_r($matrix); >>>

echo '</pre></td>',

 '<td style="width: 100px;">&nbsp;</td>',

 '<td valign="top"><pre>';

print_r($multiAssoc);

echo '</pre>', '</td>',

 '<td style="width: 100px;">&nbsp;</td>',

 '<td valign="top"><pre>';

 

print_r($array3D);

echo '</pre>','</td>',

'</tr>',

'</table>';

 

<?php

Toekennen van een enkele waarde

$array[][] = waarde >>> wordt gebruikt om een waarde toe te voegen aan een multidimensionele array.

echo '<pre>';

Creer eerst een 3 X 3 matrix (numeric array)

$matrix = array(range(0, 2), range(0, 2), range(0, 2));

Voeg een waarde MIDDLE toe in het midden

$matrix[1][1] = 'MIDDLE'; >>>in de tweede positie van de tweede rij wordt 'Middle' ingevoegd

Voeg nu een waarde END ROW toe aan het einde van row 0

$matrix[0][] = 'END ROW 0';

var_dump($matrix);

 

Maak een 2X2 associate array

$array2x2 = array('above' => array('left' => 'a', 'right' => 'b'),

                                    'below' => array('left' => 'c', 'right' => 'd'));

Voeg een waarde ‘TOP RIGHT’  toe aan de key above right

$array2x2['above']['right'] = 'TOP RIGHT';

var_dump($array2x2);

Voeg een nieuwe layer toe aan de bovenstaande 2X2 array zoals beneden

$array2x2['sub'] = array('left' => 'e', 'right' => 'f');

var_dump($array2x2);

echo '</pre>';

 

<?php

De $array[][] wordt ook met echo gebruikt alsvolgt

echo $array[key][key]

echo '<pre>';

 

<?php

Working with Arrays: Searching Arrays

Voor het zoeken naar waarden in een array gebruiken we de functie:

 in_array(needle, haystack, strict) >>>voor een TRUE of FALSE antwoord

array_search(needle, haystack, strict) >>> geeft als antwoord is de KEY, het element of FALSE

strict bepaald het datatype

We bouwen een array

$names = array('Doug', 'Julia', 'George', 'Francois');

Zoek de naam

$foundYesOrNo = in_array('George', $names); >>> antwoord TRUE

$foundKey = array_search('George', $names); >>> antwoord is 2 (voor de key)

var_dump($names);

echo '<br />Found George: ', var_dump($foundYesOrNo); >>> toont TRUE

echo "<br />Found Key: $foundKey"; >>> toont de key dus 2

echo "<br />Retrieved Name: {$names[$foundKey]}"; >>> toont string

 

Maak een 3 x 3 matrix

$matrix = array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9));

var_dump($matrix); >>> toont de gehele matrix

echo '</pre>';

echo "<br />Middle Element: {$matrix[1][1]}"; toont het tweede element op de tweede rij

 

<?php

// Working with Arrays: Searching Arrays

array_key_exists() >>> kijkt als de key aanwezig is

isset($arrayNaam["key"]) >>> bepaald als een key geplaatst is of niet. werkt alleen voor associative arrays. Is heel snel

Het antwoord van beide functies is TRUE of FALSE

Maak een associative array met keys, first, last, age, occupation

$arrayAssoc = array('first' => 'Julia', 'last' => 'Roberts', 'age' => 37, 'occupation' => 'Actress');

Zoek op key

$foundKey = array_key_exists('last', $arrayAssoc);

Zoek met isset()

$foundIsset = isset($arrayAssoc['last']);

Resultaten worden getoond met

var_dump($arrayAssoc);

echo '<br />Found by Key: ', var_dump($foundKey); >>> toont het antwoord TRUE

echo '<br />Found by isset: ', var_dump($foundIsset); >>>toont het antwoord TRUE

 

<?php

Working with Arrays: Length

count($array) toont de lengte van een array

Voeg waarden toe aan een array

$array1 = array(1, 2, 3, 4, 5);

$array2 = array('first' => 'Julia', 'last' => 'Roberts', 'age' => 37, 'occupation' => 'Actress');

Bereken de lengte

$length = array();

$length[] = count($array1);

$length[] = count($array2);

Resultaat wordt als volgt bepaald.

echo '<pre>';

echo '<br />1:';

var_dump($array1);

echo '<br />2:';

var_dump($array2);

echo '<br />Lengths:';

var_dump($length);

echo '</pre>';

 

Voor het sorteren van arrays a.d.h.v. de waarde gebruiken we de functies

sort()  of  asort()

Bij associative arrays zal sort()string de keys vervangen met cijfers,  asort() behoudt de keys.

$arrayNumeric = array(22, 44, 11, 99, 88);

$arrayAssoc = array('a' => 'Apples', 'b' => 'Oranges', 'c' => 'Bananas', 'd' => 'Grapes');

$arrayFiles = array('file1.php', 'file2.php', 'file10.php', 'file20.php');

sort($arrayNumeric);

sort($arrayAssoc);

sort($arrayFiles);

 

onderstaand kunnen we het resultaat oproepen

echo '<br />Numeric: ', var_dump($arrayNumeric);

echo '<br /><br />Associative (NOTE: keys destroyed!): ', var_dump($arrayAssoc);

echo '<br /><br />Files: ', var_dump($arrayFiles);

We kennen opnieuw waarden toe

$arrayAssoc = array('a' => 'Apples', 'b' => 'Oranges', 'c' => 'Bananas', 'd' => 'Grapes');

$arrayFiles = array('file1.php', 'file2.php', 'file10.php', 'file20.php');

 

asort($arrayAssoc);

asort($arrayFiles, SORT_NATURAL); >>> SORT_NATURAL  zorgt ervoor dat op natuurlijke waarden gesorteerd wordt, anders wordt er op cijfers gesorteerd vergelijk SORT_NATURAL  1, 5, 10, 15, 20 met de default sortering  1,10,15,20,5

echo '<br /><br />Using asort(): ', var_dump($arrayAssoc);

echo '<br /><br />Natural Sort: ', var_dump($arrayFiles);

 

<?php

ksort() wordt gebruikt voor het sorteren op keys

Voeg waarden toe aan een array en sorteer het a.d.h.v. de keys

$arrayAssoc = array('meat' => 'Beef', 'dairy' => 'Milk', 'grain' => 'Whole Wheat Bread', 'fruit' => 'Grapes');

ksort($arrayAssoc);

toon het resultaat:

echo '<pre>';

var_dump($arrayAssoc);

echo '</pre>';

 

<?php

rsort() or arsort() worden gebruikt voor het sorteren op waarden  

Het kan worden gebruikt met een flag SORT_DATATYPE als je de datatype kent. arsort behoudt de keys.

ken waarden toe aan een array

$arrayNumeric = array(22, 44, 11, 99, 88);

$arrayAssoc = array('a' => 'Apples', 'b' => 'Oranges', 'c' => 'Bananas', 'd' => 'Grapes');

$arrayFiles = array('file1.php', 'file2.php', 'file10.php', 'file20.php');

rsort($arrayNumeric, SORT_NUMERIC);                                     flag kan je gebruiken als je het datatype kent

arsort($arrayAssoc, SORT_STRING);                                            arsort() behoudt de keys in de associate array

rsort($arrayFiles, SORT_NATURAL);

Onderstaand roepen we de resultaten op

echo '<br />Numeric: ', var_dump($arrayNumeric);

echo '<br /><br />Associative: ', var_dump($arrayAssoc);

echo '<br /><br />Files: ', var_dump($arrayFiles);

 

<?php

Multidimensional Array Sort

array_multisort() wordt gebruikt voor het sorteren van multi-dimensionele arrays. Het kan ook met flags gebruikt worden. Ook zijn er de SORT_DESC en SORT_ASC flag die de volgorde aangeven

Maak een 3 X 3 matrix

$matrix = array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9));

array_multisort($matrix, SORT_DESC);                                  Sorteert de hele matrix

array_multisort($matrix[0], SORT_DESC, $matrix[1], SORT_DESC, $matrix[2], SORT_DESC); Sorteert de drie arrays in de matrix apart. Hierna zijn de waarden gesorteerd en blijft de matrix in gesorteerde staat.

Toon het resultaat

echo '<pre>';

var_dump($matrix);

echo '</pre>';

 

<?php

Removing Single Array Element

Je kan een enkele arrayelement verwijderen door de key op te geven in de functie:

unset($array[key])

Vb

$arrayAssoc = array('meat' => 'Beef', 'dairy' => 'Milk', 'grain' => 'Whole Wheat Bread', 'fruit' => 'Grapes');

Toon het resultaat

echo '<pre>';

var_dump($arrayAssoc);

verwijder het element

unset($arrayAssoc['grain']);

toon het resultaat

var_dump($arrayAssoc);

echo '</pre>';

 

<?php

array_pop($array)  verwijderd het arrayelement aan het einde

bv

$arrayNumeric = array(22, 44, 11, 99, 88);

sort($arrayNumeric, SORT_NUMERIC);

toont het resultaat

echo '<pre>';

var_dump($arrayNumeric);

verwijder het element

$lastElement = array_pop($arrayNumeric); Hierna heeft $arrayNumeric het laatste element 88 niet meer.

echo "<br />Removed Element: $lastElement<br />";

var_dump($arrayNumeric); >>>toont het resultaat

echo '</pre>';

 

<?php

array_shift($array) verwijderd het eerste arrayelement aan het begin

bv

$arrayAssoc = array('meat' => 'Beef', 'dairy' => 'Milk', 'grain' => 'Whole Wheat Bread', 'fruit' => 'Grapes');

 

Toon het resultaat

echo '<pre>';

var_dump($arrayAssoc);

Verwijder het element

$firstElement = array_shift($arrayAssoc);

echo "<br />Removed Element: $firstElement<br />";

toon het resultaat

var_dump($arrayAssoc);

echo '</pre>';

 

vb

$arrayNumeric = array(1 => 11, 5 => 55, 2 => 22, 6 => 66);

echo '<pre>';

var_dump($arrayNumeric);

verwijder het element

$firstElement = array_shift($arrayNumeric);

echo "<br />Removed Element: $firstElement<br />";

toon het resultaat

echo "<br />WARNING: keys get reset using shift()<br />";

var_dump($arrayNumeric);

echo '</pre>';

array_shift reset de keys.

 

<?php

Verschil tussen arrays wordt bepaald met de onderstaande functie.

 array_diff($array1, $array2) Het resultaat is al de elementen in de eerste array die niet voorkomen in de tweede

vb met strings

$array1 = array('meat' => 'Beef', 'dairy' => 'Milk', 'grain' => 'Whole Wheat Bread', 'fruit' => 'Grapes');

$array2 = array('meat' => 'Pork', 'dairy' => 'Milk', 'grain' => 'Whole Wheat Bread', 'fruit' => 'Apples');

//Toon het resultaat

echo '<br /><br />1: ', var_dump($array1);

echo '<br /><br />2: ', var_dump($array2);

echo '<br /><br />Difference:', var_dump(array_diff($array1, $array2));

 

vb met integers

$array3 = array(1, 2, 3, 4, 5, 6, 7);

$array4 = array(2, 4, 6, 8);

Toon het resultaat

echo '<br /><br />3: ', var_dump($array3);

echo '<br /><br />4: ', var_dump($array4);

echo '<br /><br />Difference:', var_dump(array_diff($array3, $array4));

 

Het copieren van een deel van een array.

Array_slice($array, offset, length) Copieert een deel van een array

lenght >>>lengte van de gewenste subset van $array vanaf de beginlocatie offset

 

<?php

array_merge($array1, $array2, etc.) smelt twee arrays tot een

Als keys uit meerdere arrays hetzelfde zijn, zal de laatste key de andere waarde overschrijven.

Voorbeeld

$array1 = array('a' => 'Apples', 'b' => 'Oranges', 'c' => 'Bananas', 'd' => 'Grapes');

$array2 = array('d' => 'Kiwi', 'e' => 'Plums', 'f' => 'Pears', 'g' => 'Cherries');

$array3 = array_merge($array1, $array2); >>> produceert de waarden van a, b, c, d, e, f, g, met d=> Kiwi

echo '<br /><br />1: ', var_dump($array1);

echo '<br /><br />2: ', var_dump($array2);

echo '<br />Merged: ', var_dump($array3);

 

 <?php

$titles = array(

                                'Fudge',

                                'Sugar Cookies',

                                'Chocolate Angelfood Cupcakes',

                                'Peanut Brittle',

                                'Toasted Marshmallows',

                                'Fruit Salad',

                                'Cheesecake',

                                'Glazed Doughnut',

                                'Fortune Cookies',

                                'Devils Food Cake',

                                'Peanut Butter Cups',

                                'Crispy Rice Treats',

                                'Cherry Pie',

                                'Apple Turnover',

                                'Napoleon',

                                'Chocolate Chip Cookies',

                                'Chocolate Soufflé',

                                'Walnut Brownies',

                                'Ambrosia Salad',

                                'Peach Cobbler',

                                'Chocolate Eclair',

                                'Chocolate Toaster Tarts',

                                'Candied Ginger',

                                'Spice Cake',

                                'Tapioca Pudding',

                                'Banana Pudding',

                                'Vanilla Cream Pie   ',

                                'Peanut Butter Cookies',

                                'Oatmeal Raisin Cookies',

                                'Chocolate Mousse',

                                'Baklava',

                                'Chocolate Fondue',

                                'Strawberry Shortcake',

                                'Apple Pie a la Mode',

                                'Neapolitan Ice Cream',

                                'Cinnamon Roll',

                                'Gingerbread Cookies',

                                'Gingerbread Dude',

                                'Bread Pudding   ',

                                'Coconut Custard Pie',

                                'Coconut Macaroon',

                                'Ice Cream Cone',

                                'Mint Chocolate Milk Shake',

                                'Pecan Pie',

                                'Smores',

                                'Black Forest Cake',

                                'Fruit Cake',

                                'Pumpkin Nut Bread',

                                'Pumpkin Pie',

                                'Pumpkin Ice Cream',

                                'Rhubarb Crumble',

                                'Carrot Cake',

                                'Ice Cream Cake',

                                'Baked Alaska',

                                'Ice Cream Sandwich',

                                'Hot Fudge Sundae',

                                'Pecan Praline Ice Cream',

                                'Banana Split',

                                'Boston Cream Pie',

                                'Banana Bread',

                                'Chocolate Layer Cake',

                                'Shortbread Cookies',

                                'Oreo Cookies',

                                'Pop Tarts',

);

We copieren de lijst van project.php naar sweetscomplete\products.php

We definieren de lijst in de php statement helemaal boven.

<?php

$titles =  array ( Lijst);

?>

We gaan dan naar de search form zoek naar form name=”search”

En tussen <select name=”title” class=”s2” > en </select> verwijderen we alle option values en vullen in

<?php

foreach ($titles as $value){printf (‘<option>%s</option>, $value);}?>

 

LOOPING AND BRANCHING

Looping is het herhalen van een opdracht, branching is het springen uit een loop naar een andere opdracht

4.1 COMPARING VALUES

Vergelijken van waarden

Operators zijn: == === > >=  < =< != !==

== equivalent >>> zelfde waarde

!= niet equivalent

>= groter dan of gelijk aan

<= kleiner dan of gelijk aan

=== equivalent zowel waarde als datatype

!== niet equivalent of datatype

&& = AND >>> moet aan alle voorwaarden voldoen

|| = OR >>> moet aan een van de voorwaarden voldoen

 

Het vergelijken van numerische waarden

$cost1 = 12.99;

$cost2 = 10;

echo "<br />Cost 1: $cost1";

echo "<br />Cost 2: $cost2";

echo '<br />$cost1 < $cost2: ', var_dump($cost1 < $cost2);

echo '<br />$cost1 == $cost2: ', var_dump($cost1 == $cost2); >>> toont Boolean dus FALSE

echo '<br />$cost1 > $cost2: ', var_dump($cost1 > $cost2);

echo '<br />';

Het vergelijken van string waarden

$title1 = 'The Great Escape';

$title2 = 'The Great Gatsby';

echo "<br />Title 1: $title1";

echo "<br />Title 2: $title2";

echo '<br />$title1 < $title2: ', var_dump($title1 < $title2);  >>> de E van $title1 < G van $title2 dus TRUE

echo '<br />$title1 == $title2: ', var_dump($title1 == $title2);

echo '<br />$title1 > $title2: ', var_dump($title1 > $title2);

echo '<br />';

 

$value1 = 123.0;

$value2 = 123;

echo '<br />Value 1:', var_dump($value1);

echo '<br />Value 2:', var_dump($value2);

echo '<br />$value1 == $value2: ', var_dump($value1 == $value2); >>> waarde is gelijk dus TRUE

echo '<br />$value1 === $value2: ', var_dump($value1 === $value2); >>>datatypen float en integer dus FALSE

echo '<br />';

anything that evaluates to TRUE or FALSE

&& = AND || = OR

Vergelijking numerische waarden

$cost = 12.99;

$quantityOH = 10;

$status = 'ORDER';

echo "<br />Cost: $cost";

echo "<br />Quantity On Hand: $quantityOH";

echo "<br />Status: $status";

echo '<br />$cost < 100 && $quantityOH > 1: ', var_dump(($cost < 100) && ($quantityOH > 1)); >>> beide waar dus TRUE

echo '<br />$quantityOH <= 0 || $status == "ORDER":

                ', var_dump(($quantityOH <= 0) || ($status == "ORDER")); >>> laatste waar dus TRUE

echo '<br />';

 

4.2 IF ELSE STATEMENT

bsp;</p>'; $x++;

 

IF STATEMENT

 

IF ($variabele voldoet aan de voorwaarde) THEN {voer dit uit} ELSE {voer dit uit}

Voorbeeld

$user = 'Admin';

$status = 'Normal';

if ($user == 'Admin') { $status = 'SUPER'; } >>> als user == Admin voer uit $status = ‘SUPER’

echo "<br />User: $user";

echo "<br />Status: $status";

echo '<br />';

 

if ($user != 'Admin') { $status = 'Normal'; $message = "Welcome $user!";}

else { $status = 'SUPER'; $message = 'Please check error log';}

>>> als user == Admin voer uit $status = ‘Normal’ en $message = “Welcome $user!” Anders voer uit $status=’Super’ en $message=’Please check error log’

echo "<br />User: $user";

echo "<br />Status: $status";

echo "<br />Message: $message";

echo '<br />';

 

Nested if statement verstrengeld een if else statement in een andere if else statement

Hier gebruiken we een nested if else om een website user zijn status te bepalen

$user = 'Admin';

if (isset($user)) {echo "<br />User: $user";

                if ($user == 'Admin') {$status = 'SUPER';      }

                else {      $status = 'Normal'; }}

                else {      echo "<br />User: Guest"; $status = 'Guest';}

echo "<br />Status: $status";

echo '<br />';

ð  check als de user isset (bestaat) als user bestaat >>> if user == ‘Admin’ dan voer uit $status = ‘SUPER’; ander $status=$status = ‘Normal’ Else Anders>>> als user niet bestaat voer uit …

 

Hier gebruiken we een elseif om de prijs te bepalen a.d.h.v. de valuta

Hierbij wordt een if verwerkt in de else m.a.w. als de voorwaarde niet voldoet geldt er een volgende voorwaarde etc

Het wordt in een website gebruikt als een serie beslissingen genomen moet worden, betreffende simuliere criteria.

$price = 100;

$currency = 'GBP';

if ($currency == 'EUR') {    $rate = 1.251;}

elseif ($currency == 'USD') { $rate = 1.599;}

elseif ($currency == 'CAD') { $rate = 1.562;}

else {$rate = 1.00;}

printf('<br />Price: %4.2f %s', $price * $rate, $currency);

 

<?php

Switch doet hetzelfde als elseif en het is eenvoudiger.

4.3 CASE STATEMENT

Case en stelt de voorwaarde, : hierachter komt de opdracht, break beëindigt de code.

$price = 100;

$currency = 'GBP';

switch ($currency) {

  case 'EUR' : $rate = 1.251; break;

  case 'USD' : $rate = 1.599; break;

  case 'CAD' : $rate = 1.562; break;

  default :    $rate = 1.00;}

printf('<br />Price: %4.2f %s', $price * $rate, $currency);

Onderstaand hetzelfde maar in een ifelse format.

if ($currency == 'EUR') {$rate = 1.251;}

elseif ($currency == 'USD') {$rate = 1.599;}

elseif ($currency == 'CAD') {$rate = 1.562;}

else {$rate = 1.00;}

printf('<br />Price: %4.2f %s', $price * $rate, $currency);

 

 

4.4 FOR LOOP, IF ELSE LOOP, WHILE LOOP

 

For loop voert een opdracht een voorbepaald aantal keren uit.

For loop >>> for ($variabele=beginwaarde, $variabele <eindwaarde, increment) {voer opdracht uit} betekent dat bij

Het wordt gebruikt voor drop down menu’s, radiobuttons etc

<?php

Maak een array

$days = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');

$styleInner = 'style="float: left; width: 100px; border: 1px solid black; text-align: center;"'; >>> bepaald weergave binnenvak

$styleOuter = 'style="float: left; width: 700px;"'; >>> bepaald weergave buitenvak (van het geheel)

echo "<div $styleOuter>";

for ($x = 0; $x < 7; $x++) {

                                echo "<div $styleInner>";  >>> bepaald het format

                                echo $days[$x];                  >>>toont de dagen

                                echo '</div>';

                                echo PHP_EOL; }

echo '</div>';

 

<?php

We zetten in een array alle U.S. states

Hier gebruiken we geen CSS styling maar de printf statement om een dropdown menu te creeren

$states = array('Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut',

                                                                'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa',

                                                                'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan',

                                                                'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',

                                                                'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma',

                                                                'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee',

                                                                'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming');

 

echo '<form>'; >>> output de form (dropdown menu)

echo '<select name="state">'; >>> output de for loop

for ($x = 0; $x < 50; $x++) {printf('<option value="%s">%s</option>', $states[$x], $states[$x]); }

echo '</select>';                                                                           

echo '</form>';                                                                              

 

DO WHILE LOOP

 

do while loop voor het genereren van survey questions vanuit een formatted string

do while gebruik je als je niet zeker bent over het aantal items

while (als voldaan wordt aan voorwaarde) {voer opdracht uit}

do while {voer de opdracht uit} (zolang voldaan wordt aan voorwaarde)

vb

$options = array('How Will You Arrive?|Car|Bus|Train|Plane &',

                                  'Your Gender|Male|Female &',

                                  'Preferred Housing|House|Condo|Flat|Apartment|Shared Room &',

                                  'How Many in Family|1 - 2|3 - 4|5+&');

$styleInner = 'style="float: left; width: 150px; border: 1px solid black; text-align: center;"';

$styleOuter = 'style="float: left; width: 900px;"';

$x = 0;

while ($x < 4) {                     $pos = 0; echo "<div $styleOuter><div $styleInner>";

                do { $character = substr($options[$x], $pos++, 1);  $flag = TRUE; >>> een flag is TRUE zolang er items zijn

                          if ($character == '|') { echo "</div><div $styleInner>";} >>> sluit styleInnerdiv-tag en opent een nieuwe.

                          elseif ($character == '&') { $flag = FALSE;}

                          else { echo $character;           }

                } while ($flag);                    

                                                echo '</div></div> <p>&nbsp</p>;

$x++;

Kijk naar de do while loop. We evalueren de characters een voor een. Zodra we een | tegenkomen wordt de styleInner tag gesloten en opnieuw geopend. Als we een & tegenkomen wordt de $flag= FALSE, waardoor we uit de loop kunnen breken, Anders wordt de karakter geschreven naar het scherm. We eindigen met het sluiten van de twee div tags en een nieuwe page wordt geopend?

 

FOR EACH LOOP wordt gebruikt als je alle waarden in een array wilt evalueren. Er is dus geen conditie gesteld.

Foreach ($array_expression as $value) {voer opdracht uit}

Foreach ($array_expression as key => $value) {voer opdracht uit}

In het voorbeeld worden survey questions uit een array gegenereerd

De array waarbij elke key is gekoppeld aan een array van items.

$options = array('How Will You Arrive?' => array('Car', 'Bus', 'Train', 'Plane'),

                                 'Your Gender'                     => array('Male', 'Female'),

                                 'Preferred Housing'           => array('House', 'Condo', 'Flat', 'Apartment', 'Shared Room'),

                                 'How Many in Family'       => array('1 - 2', '3 - 4', '5+'));

$styleInner = 'style="float: left; width: 150px; border: 1px solid black; text-align: center;"';

$styleOuter = 'style="float: left; width: 900px;"';

foreach ($options as $key => $value)            {echo '<div $styleOuter>' . PHP_EOL;

                                                                                echo '<b>', $key, '</b>', '<br />', PHP_EOL;

                                                                                $tag = strtolower(str_replace(' ', '_', $key));

foreach ($value as $item)                {echo "<div $styleInner>\n";

                                                                echo $item, '<input type="radio" name="', $tag, '[]">', PHP_EOL;

                                                                echo "</div>\n";}

                                                                echo '</div><p>&nbsp;</p>' . PHP_EOL;

De buiten array maakt gebruik van keys, terwijl de binnenste array alleen waarden gebruikt.

Foreach ($options as key => value) >>> looped door de keys

Foreach ($value as $item) >>> looped door de items

De input type is een radiobutton die kan worden aangeklikt

 

// Looping and Branching: Branching with "continue," "break" and "goto"

continue springt uit een codeblok maar gaat door in de loop

break springt uit de loop

goto springt uit een loop naar een specifieke locatie in een programma

 

$array = array(11, 23, 34, 56, 78, 90, 101, 114);

echo 'Even Numbers Using "continue":', '<br />';

foreach ($array as $value) { if ($value % 2) {continue;} echo '<br />', $value;}$number = 0; >>> checkt oneven nummers

foreach ($array as $value) {if (($value % 3) == 0) {$number = $value; break; }} checkt als cijfers deelbaar zijn door 3

echo '<br /><br />', $number, ' is divisible by 3';

 

$number = 0;

foreach ($array as $value) {if (($value % 4) == 0) {$number = $value; goto jump;}} jump:echo '<br /><br />', $number, ' is divisible by 4'; >>> checkt deelbaarheid door 4

Kan ook op deze manier

$array = array(11, 23, 34, 56, 78, 90, 101, 114);

echo 'Even Numbers Using "continue":', '<br />'; foreach ($array as $value) {if ($value % 2) {continue;}echo '<br />', $value;}

echo '<br /><br />', 'Even Numbers Using WITHOUT "continue":', '<br />';

foreach ($array as $value) { if (!($value % 2)) {echo '<br />', $value; }}

 

Project

Copieer de array van looping project naar de sweetscomplete products.php

Plaats eronder een count van de $products

$maxProducts = count($products);

In products.php zoek naar de <li> tag verwijder alles tussen de </li> tags laat slechts een <li> codeblok </li>staan

Vervang het linknummer bij src door een php loop <?php for ($x =0; $x< $maxProducts; $x++){ $products[$x][‘link’]; } ?>

Vervang het product Ambrosia Salad achter alt= en <a href=”detail.html”> met <?php for ($x =0; $x< $maxProducts; $x++){ $products[$x][‘product’]; } ?>  

 

FUNCTIONS

Builtin Functions

Get_defined_functions >>> toont alle functions op de server (ook wel core language genoemd)

Function_exist >>> kijkt als een function bestaat (antwoord boolean)

$function = 'str_replace';

if (function_exists($function)) {       echo 'str_replace exists!';}

else {      echo 'str_replace exists!';}

echo '<br />', var_dump(get_defined_functions());

echo '<br />';

phpinfo();  >>> toont informatie over de server zoals versie, extensions, parameters etc.

http://www.php.net/maual  toont ons de functions onder Language Reference. Je kan daar het function type klikken

Je kan ook in de search bar zoeken naar de function bv str_replace

mixed str_replace (mixed $search, mixed $repace, mixed $subject [, int $count])

This function returns a string or an array with all occurrences of search in subject replaced with the given replace value.

Voor de function wordt het datatype van de return value aangegeven. Mixed betekent dat het elke datatype kan zijn.

 

Creating your own functions

<?php

Code die een unordered list <ul><ul> met list items <li></li> produceert uit een array

$fruits = array('Apples', 'Bananas', 'Pears', 'Oranges', 'Peaches', 'Strawberries');

$vegetables = array('Peas', 'Carrots', 'Lettuce', 'Artichokes', 'Beans');

$meats = array('Beef', 'Pork', 'Veal', 'Chicken', 'Turkey');

Code produceert <ul><li> lists van fruits, vegatables en meats

echo '<br />FRUITS:<hr />';

echo '<ul>' . PHP_EOL; >>> EOL maakt de source page leesbaarder. Heeft geen effect op de webpage

foreach ($fruits as $li) {   echo "<li>$li</li>";} >>> plaatst alle items in de $fruits array tussen <li> en </li>

echo '</ul>' . PHP_EOL;

echo '<br />VEGETABLES:<hr />';

echo '<ul>' . PHP_EOL;

foreach ($vegetables as $li) {echo "<li>$li</li>";}>>> plaatst alle items in de $vegetables array tussen <li> en </li>

echo '</ul>' . PHP_EOL;

echo '<br />MEATS:<hr />';

echo '<ul>' . PHP_EOL;

foreach ($meats as $li) {   echo "<li>$li</li>";}>>> plaatst alle items in de $meats array tussen <li> en </li>

echo '</ul>' . PHP_EOL;

<?php

We merken dat de code voor de drie blokken bijna identiek is. Slechts de naam van de label en de array verschillen.

We kunnen verder automatiseren door een functie te creeren.

In de functie substitueren we variabelen voor de labels en de arrays.

 

De syntax van een function

function functionName (parameters){code blok}

In onderstaand vb gebruiken we $output = en $output .= als output + wat achter de = komt. Het eindresultaat wordt als return $output; gepresenteerd.

function ulLiHtml($label, $array) // >>> we zien dat de label en array hier worden ingebracht als variabelen

{ $output =  "<br />$label:<hr />"; //>>> $output = en $output. = die alles samenvoegt in return $output

$output .= '<ul>' . PHP_EOL;

  foreach ($array as $li) { $output .= "<li>$li</li>"; }

  $output .= '</ul>' . PHP_EOL;

  return $output;} >>> het resultaat van de hele code blok

Nu definiëren we de variabelen en items en gebruiken we de functie met de variabelen

$fruits = array('Apples', 'Bananas', 'Pears', 'Oranges', 'Peaches', 'Strawberries');

$vegetables = array('Peas', 'Carrots', 'Lettuce', 'Artichokes', 'Beans');

$meats = array('Beef', 'Pork', 'Veal', 'Chicken', 'Turkey');

Onderstaand zijn achter elkaar $fruits, $vegatables en $meats toegewezen als variabelen van de functie

echo ulLiHtml('FRUITS', $fruits);

echo ulLiHtml('VEGETABLES', $vegetables);

echo ulLiHtml('MEATS', $meats);

 

<?php

// Managing the Code -- Functions: Returning Values

return zorgt voor het resultaat van een functie. return 1 + 1 is het zelfde als  1+1 =

echo functienaam wordt gebruikt om resultaat te tonen

Onderstaande functie produceert geen waarde. Het echo-ed alleen een string.

function returnsNoValue()

{ echo '<br />Returns No Value';}

returnsNoValue();

Onderstaande functie produceert een string waarde. De return command produceert de waarde. Echo toont de waarde

function returnsStringValue()

{ return '<br />Returns String Value';}

echo returnsStringValue();

function returnsVariableValue()

{ $value = 123456;

  return $value;}

echo returnsVariableValue();

Als je een aantal waarden wilt produceren, moet dat met een compound zoals een array of dropdownlist.

Onderstaand een array als return

function monthNames()

{ return array('January', 'February', 'March', 'April', 'May', 'June',

                                                 'July', 'August', 'September', 'October', 'November', 'December');}

// one function can call another

Onderstaand de html code om een dropdownlist te produceren

function dropDownMonths()

{ $menu = '<select name="months">' . PHP_EOL;

  $names = monthNames();

  foreach ($names as $month) {      $menu .= "<option>$month</option>\n"; }

  $menu .= '</select>' . PHP_EOL;

  return $menu;}

echo dropDownMonths(); >>>geeft een dropdownlist van de maanden in html

 

<?php

MANDATORY en OPTIONAL PARAMETERS

Parameter is alles dat je kan voeden aan een functie of een methode. Het kan een waarde zijn of een waarde van een variabele. De parameters staan tussen haakjes na de naam van een functie.

function addressTable($name, $addressLine1, $addressLine2, $addressLine3)

{ $table = '<table border=1>' . PHP_EOL;

  $table .= sprintf('<tr><th>Name</th><td>%s</td></tr>', $name);

  $table .= sprintf('<tr><th rowspan=3>Address</th><td>%s</td></tr>', $addressLine1);

  $table .= sprintf('<tr><td>%s</td></tr>', $addressLine2);

  $table .= sprintf('<tr><td>%s</td></tr>', $addressLine3);

  $table .= '</table>' . PHP_EOL;

  return $table;}

echo addressTable('Doug Bierer', '123 Main Street', 'Flat A', 'New York, NY 10001 USA'); geeft een output

echo addressTable('Shopsy\'s Deli', '96 Richmond West', 'Toronto, M5H 2A3, Canada'); geeft een output en errormessage

 

<?php

Parameters zijn per default verplicht ingevuld te worden. Als je het niet invult krijg je een error. Om parameters optioneel te maken voeg je een default waarde toe bv  =&nbsp  (non break space).

function addressTable($name, $addressLine1, $addressLine2, $addressLine3 = '&nbsp;') &$addressline3 is optional

{ $table = '<table border=1>' . PHP_EOL;

  $table .= sprintf('<tr><th>Name</th><td>%s</td></tr>', $name);

  $table .= sprintf('<tr><th rowspan=3>Address</th><td>%s</td></tr>', $addressLine1);

  $table .= sprintf('<tr><td>%s</td></tr>', $addressLine2);

  $table .= sprintf('<tr><td>%s</td></tr>', $addressLine3);

  $table .= '</table>' . PHP_EOL;

  return $table;}

echo addressTable('Doug Bierer', '123 Main Street', 'Flat A', 'New York, NY 10001 USA'); geeft output

echo addressTable('Shopsy\'s Deli', '96 Richmond West', 'Toronto, M5H 2A3, Canada'); geeft output zonder error message

 

<?php

PARAMETERS ALS REFERENCY GEBRUIKEN

Een reference is als een alias.  Het maakt gebruik van de &

$name1 = 'Tarzan';

$name2 = $name1;

echo '<br />', 'Simple Assignment:'; >>> creert een memorylocation voor $name1 en een voor $name2

echo '<br />', $name1;

echo '<br />', $name2;

Als je $name2 een waarde toekent, verandert het niets aan $name1

$name2 = 'Jane';

echo '<br />', 'After Re-assignment:';

echo '<br />', $name1;

echo '<br />', $name2;

Onderstaand wordt & gebruikt om aan te geven dat beide parameters dezelfde memorylocation delen

Met andere woorden als we nu $name2 veranderen zal $name1 ook mee veranderen.

$name1 = 'Tarzan';

$name2 = &$name1;

echo '<br />', 'Assignment by Reference:';

echo '<br />', $name1;

echo '<br />', $name2;

// notice the effect on $name1

$name2 = 'Jane';

echo '<br />', 'After Re-assignment:';

echo '<br />', $name1;

echo '<br />', $name2;

 

<?php

Door & te gebruiken voor de variabelen, zal in de onderstaande functie de variabele $fname permanent mee veranderen

function ucNames(&$fname, &$mname = '', &$lname = '')

{ $fname = ucfirst($fname);

  $mname = ucfirst($mname);

  $lname = ucfirst($lname);

  return TRUE;} >>> altijd goed om iets te returnen

$first = 'alfred';

$middle = 'e';

$last = 'neuman';

printf('<br />NAME BEFORE: %s %s %s', $first, $middle, $last); >>> print de drie stringvariables voor de toepassing vd functie

ucNames($first, $middle, $last);

printf('<br />NAME AFTER: %s %s %s', $first, $middle, $last); >>> print de drie stringvariables na de toepassing van de functie

 

<?php

WERKEN MET EEN VARIABEL AANTAL PARAMETERS

Definieer eerst de functie zonder parameters m.a.w. function functionName () {codeblok}

Populeer daarna de functie met parameters via de functie func_get_args()

Een rij met 10 <td> colomns met een variable aantal items

function preferencesRow()

{ $output = ''; >>> definieert output welke uiteindelijk voor de return zal zorgen

  $params = func_get_args(); >>> collecteert alle waarden in een array

  $maxCols = 10; >>> bepaald een maximale waarde voor de colomns

  foreach ($params as $item) { $output .= "<td width='80px' align='center'>$item</td>\n"; $maxCols--; }

  for (      $x = 0; $x < $maxCols; $x++) {

                $output .= "<td width='80px'>&nbsp;</td>\n";        } >>>Als er < 10 parameters zijn blijven de overige columns leeg

                return $output;}

 

// NOTE: you can use "." or "," with echo

echo '<h1>Preferences</h1><hr />' . PHP_EOL;       

echo '<table border=1>' . PHP_EOL;

echo '<tr><th>Tarzan</th>';

echo preferencesRow('Africa', 'jungles', 'tantor', 'mangani', 'cabin in the woods',  'hunting', 'swinging in trees', 'Jane');

echo '</tr>';

echo '<tr><th>Jane</th>';

echo preferencesRow('London', 'parties', 'dancing', 'social events', 'lavish estates');

echo '</tr>';

echo '</table>' . PHP_EOL;

Met de echo wordt een tabel met twee rijen data geproduceerd een voor Tarzan en een voor Jane.

Is het resultaat

 

GLOBAL VARIABLES

<?php

Local variable is een variabele die binnen de codeblock van een functie of een class gedefinieerd is. Een local variable kan alleen in die functie of class worden gebruikt.

Global variable is een variabele die gedefinieerd is buiten de code block van een function of class.  Deze kan overal gebruikt worden. Om te werken moet het eerst worden aangeroepen in een functie of class. Het wordt als volgt aangeroepen

Global $globalvariable.

$thisIsGlobal = 'GLOBAL'; >>> werkt buiten de functie function test. Het kan ge-echood worden. In de function test zal het echter niet werken als het niet vooraf is opgeroepen.

function test()

{ echo '<br />', 'Output from Function test()';

  $thisIsLocal = 'LOCAL';

  echo '<br />', $thisIsGlobal; >>> zal niet werken

  echo '<br />', $thisIsLocal; >>> zal werken

  return TRUE;}

 

test();

echo '<br />', 'Output from Calling Program';

echo '<br />', $thisIsGlobal; >>> zal werken

echo '<br />', $thisIsLocal; >>> zal niet werken

<?php

 

Je kan een global variable in een functie aanroepen met het woord Global

$thisIsGlobal = 'GLOBAL';

function test()

{ echo '<br />', 'Output from Function test()';

  $thisIsLocal = 'LOCAL';

  global $thisIsGlobal; >>> definieerd de global variable binnen de functie

  echo '<br />', $thisIsGlobal; >>> zal nu wel de variabele tonen

  echo '<br />', $thisIsLocal;

  return TRUE;}

test();

echo '<br />', 'Output from Calling Program';

echo '<br />', $thisIsGlobal;

echo '<br />', $thisIsLocal; >>> werkt niet buiten de functie

 

In plaats van een global variable kan je een parameter gebruiken die je in de functie formuleert.

<?php

$thisIsGlobal = 'GLOBAL';

function test($global) >>> gebruikt een parameter

{ echo '<br />', 'Output from Function test()';

  echo '<br />', $global;

  return TRUE;} >>> goed om return in de functie te gebruiken

test($thisIsGlobal);

echo '<br />', 'Output from Calling Program';

echo '<br />', $thisIsGlobal; >>> werkt met de global parameter

 

<?php

$GLOBALS is een superglobal die alle globals toont die geformuleerd zijn op jouw server

$thisIsGlobal1 = 'GLOBAL';

$someValue = 22.47;

$someBoolean = TRUE;

 

test();

$GLOBALS is een array van alle global variables op een server.

echo '<br />', '$GLOBALS', '<br />';

var_dump($GLOBALS);

 

define een function displayProducts()

en copieer de loop van het vorig project erin

verwijder de php tags

definieer een output variabele voor de return variabele $output = ’ ’; >>> variabele $output = een lege string

$output .= ‘<li>’; >>> gebruik het om <li > als string toe te voegen aan de output variabele

Dit doen we ook voor overige lines van de code block 

Return $output

En handle de inbedded variable. Dit doe je door <php echo weg te halen en “.” concatenate te gebruiken

En aan de andere zijde ?>; weg te halen en .’ te gebruiken. Doe dit ook achter alt

Doe hetzelfde met de line die de … display

Voor het pagineren creeren we twee variabelen $page en $linesPerPage die we aan de functie bieden als parameters

 

Object-Oriented Programming OOP

Object Oriented Programming OOP is het packagen van functions en variables.

Je definieerd een class als combinatie van code blocks.

Class className { properties  Methods }         >>> properties hier zijn variables, en methods zijn functions

De class wordt dan als volgt geïnstantieerd waardoor het gebruikt kan worden als een object.

$object = new objectNaam ($class)

Dit object kan dan gebruikt worden in OOP

Onderstaand een voorbeeld

class UserProfile {

  public $name;                    >>>public geeft aan dat de variable binnen en buiten de class gebruikt kan worden

  public $address;

  public function showPreferences($id){// some code;}

  public function generateAddressTable($name, $address){// some code;        }}

$profile = new UserProfile(); >>> instantiëert de class

var_dump($profile); >>> print de definitie

 

<?php

 The Standard php library (SPL) biedt "low level" classes die verschillende taken uitvoeren. Ze zijn op het internet te vinden:

SPL: http://php.net/manual/en/book.spl.php  

 The Imagick extension biedt classes met geavanceerde image processing mogelijkheden

 The PHP Data Object PDO.extension biedt classes voor database processing

 Onderin zien we een vb. van een SPL die een path bouwt naar de parent directory (zgn directory iterator)

 

$path = realpath(__DIR__ . '/../'); >>> gebruikt de realpath command met een magic constant _DIR_ die het pad naar de directory van een website produceert.

Hieronder bouwen we een RecursiveDirectoryIterator object. Die dus de handeling kan uitvoeren (repeteren).

Met het woord new instantiëren we de class in een object

$rdi = new RecursiveDirectoryIterator($path);

Onderin gebruiken we een loop om de recursiveiterator vaker te kunnen toepassen. Het toont alle files en directories vanaf de originele locatie. getSize toont ook nog de size van een object

foreach (new RecursiveIteratorIterator($rdi) as $filename => $item) {

$filesize = $item->getSize();                            >>>-> biedt toegang tot properties of methods van een object

echo "<br />$filename ($filesize)\n";}          >>> toont de filename en filesize op scherm

 

Onderstaand wordt de class website.php gebruikt om een website te bouwen.

<?php

include './classes/Website.php';

$website = new Website();

$website->setTitle('Hello World');

$website->setMeta(array('http-equiv' => 'content-type', 'content' => 'text/html;charset=utf-8'));

$website->setBody('<h1>Hello World!</h1>');

echo $website->render();

?>

 

OBJECT PROPERTIES

ADDING PROPERTIES

<?php

Properties zijn variables. Ze kunnen een initiële waarde hebben en elke datatype bezitten.

Beneden zien we een class geformuleerd met properties

class User

{

  public $firstName = '';

  public $lastName = '';

  public $accountNumber = 0;

  public $balance = 0;

  public $isMember = FALSE;

  public $preferences = array();

}

//Public properties zijn properties die buiten een class zijn gedefinieerd. Ze kunnen in het object gebruikt worden als volgt.

//Initieer de class en voeg de public properties toe aan het object en voeg directe waarden toe aan de public properties

$user = new User();

$user->firstName = 'Winston'; >>> -> propertynaam = ’directe waarde’

$user->lastName = 'Churchill';

$user->accountNumber = 998877;

$user->balance = 1230467.88;

$user->isMember = TRUE;

$user->preferences = array('Cigars', 'Conservative Party', 'Polo');

echo '<pre>', var_dump($user), '</pre>';

 

<?php

// Managing the Code -- OOP: Adding Properties

class User

{ public $firstName = '';

  public $lastName = '';

  public $accountNumber = 0;

  public $balance = 0;

  public $isMember = FALSE;

  public $preferences = array();

 

Je kan properties ook gebruiken in methods. Ongeveer als keys in een array. Je kan de property in de method oproepen met

$this->propertyNaam = waarde;

En kan dan de class initiëren en directe waarden toekennen aan de method 

Hieronder worden de properties opgeroepen in de method

public function setupUser($fname, $lname, $acctNo, $balance, $isMemb, $prefs)

  {             $this->firstName = $fname;

                $this->lastName = $lname;

                $this->accountNumber = $acctNo;

                $this->balance = $balance;

                $this->isMember = $isMemb;

                $this->preferences = $prefs;           }}

Hierna kan je de class initiëren en directe waarden toekennen aan de methode via $user->method(waarde)

$user = new User();

$user->setupUser('Amelia', 'Earhart', 887766, 234567.89, TRUE, array('Airplanes', 'GP', 'Flying'));

Toon het resultaat met printf

printf('<br />Name: %s %s', $user->firstName, $user->lastName); >>> toont de Name: Amelia Earhart

printf('<br />Account Number: %d', $user->accountNumber); >>> toont Account Number:  887766

printf('<br />Balance: $%8.2f', $user->balance); >>> toont balance: 234567.89

 

OOP METHODS

 

Een method is een function gedefinieerd in een class. Als functions produceren ze een waarde.

Het enige verschil is de visibility method. De visibility method bepaald waar de function beschikbaar is.

private (binnen de class ), public ( buiten de class) en er is ook nog protected.

class MakeHtml

{               public function makeH1($content)

{ return "<h1>$content</h1>\n";                  }}

Een public method kan gebruikt worden door een object te creeren en -> te gebruiken

$html = new MakeHtml();

echo $html->makeH1('TEST');

bouw een class met een aantal functions die logisch verbonden zijn

functions to generate HTML

Plaatst de header <h1>$headerinfo</h1>, en een un-ordered list met een array aan list items

class MakeHtml

{ public function makeH1($content)             

{  return "<h1>$content</h1><hr />\n";      }

  public function makeUL($items)

  {             $output = '<ul>' . PHP_EOL;

                foreach ($items as $li) {    $output .= "<li>$li</li>\n";}

                $output .= '</ul>' . PHP_EOL;

  return $output; } }

 

Je kan de public method nu gebruiken door een object te creëren en -> te gebruiken.

$html = new MakeHtml();

echo $html->makeH1('FRUITS'); >>> toont de header

echo $html->makeUL(array('Apples', 'Oranges', 'Bananas', 'Cherries', 'Peaches')); >>> toont de unordered list

 

<?php

"magic" methods vindt je op: http://php.net/manual/en/language.oop5.magic.php

Vb. Van de magic method _construct

class User

{ public $firstName = '';

  public $lastName = '';

  public $accountNumber = 0;

  public $balance = 0;

  public $isMember = FALSE;

  public $preferences = array();

  public function __construct($fname, $lname, $acctNo, $balance, $isMemb, $prefs)

  {             $this->firstName = $fname;

                $this->lastName = $lname;

                $this->accountNumber = $acctNo;

                $this->balance = $balance;

                $this->isMember = $isMemb;

                $this->preferences = $prefs; } }

$user = new User('Amelia', 'Earhart', 887766, 234567.89, TRUE, array('Airplanes', 'GP', 'Flying'));

printf('<br />Name: %s %s', $user->firstName, $user->lastName);

printf('<br />Account Number: %d', $user->accountNumber);

printf('<br />Balance: $%8.2f', $user->balance);

 

<?php

CREEREN VAN METHODES

 

include './classes/Website.php';

// build the website

$website = new Website();

$website->setTitle('TEST');

$website->setMeta(array('http-equiv' => 'content-type', 'content' => 'text/html;charset=utf-8'));

$website->setBody('<h1>Hello World!</h1>');

echo $website->render();

 

VISIBILITY LEVELS

 

Properties en methods hebben een visibility level die bepaald waar ze gebruikt kunnen worden in een class. Er zijn drie visibility levels public, private en protected

voor protected zie: http://www.php.net/manual/en/language.oop5.visibility.php

<?php

class Test

{ public $publicVar = 'PUBLIC';

  private $privateVar = 'PRIVATE';

  public function publicMethod()

  {             return 'PUBLIC'; }

  private function privateMethod()

  {             return 'PRIVATE';               } }

$test = new Test();

Public properties en methods kunnen we buiten de method tonen

echo '<br />', $test->publicVar;

echo '<br />', $test->publicMethod();

Als we de private properties en methods properties willen echo-en buiten de functie zoals beneden, krijgen we een fatal error

echo '<br />', $test->privateMethod(); >>> levert een fatal error

 

<?php

Onderin is een class gedefinieerd. We zien dat de public method binnen de class toegang heeft tot de private properties en methods die binnen de class zijn gedefinieerd. Het gebruikt hierbij de public function getValue(){ }

class Test

{ private $privateVar = 'PRIVATE PROPERTY';

  private function privateMethod() {              return 'PRIVATE METHOD';             }

  Public method laat controlled access tot private properties en methods toe

  public function getValue()  {return $this->privateVar . '<br />' . $this->privateMethod(); } }

$test = new Test();

echo '<br />', $test->getValue();

<?php

Public en private properties en methods hebben geen impact op security. Het heeft alleen te maken met waar je ze wilt gebruiken alleen binnen een class of binnen en buiten de class.

 

private $value;

class Test             {               public function setValue($newValue)

                                {               $this->value = $newValue;              }              

public function getValue(){ return $this->value;        }}

$test = new Test();

 

store value to private property using public method "setValue()"

access to private property and method allowed via public "getValue()"

a private property or method has no impact on website security!!!

 

$test->setValue ('<script>alert("UNSAFE!");</script>');

echo '<br />', $test->getValue();

 

<?php

De functie strip_tags() kan gebruikt worden om inkomende data te strippen van hun tags als security method.

class Test

{ private $value;

  public function setValue($newValue)

  {             $this->value = strip_tags($newValue);        }              

  public function getValue()

  {             return $this->value;           } }

$test = new Test();

$test->setValue('<script>alert("UNSAFE!");</script>');

 

// access to private property and method allowed via public "getValue()"

Voor output wordt de functie htmlspecialchars() gebruikt als security methode

echo '<br />', htmlspecialchars($test->getValue());                

echo '<br />', htmlspecialchars('<script>alert("UNSAFE!");</script>');                             

 

 

INHERRITANCE

PARENT EN CHILD CLASSES

<?php

 ParentClass is een "base" class met algemene properties en methods

De ChildClass erft alle public properties en methods (niet de private -) van de ParentClass

ChildClass definieer je met: class ChildClass extends ParentClass {code}

Via italics voeg je functionality toe

Je kan in de ChildClass properties en methods van de Parent gebruiken, maar je kan ook properties en methods toevoegen

 

Onderstaand hebben we een ParentClass die drie public methods, en een ChildClass die deze methods erft en zelf een vierde method public function wrapBtag() toevoegt. Ook kan je de properties en methods van de ParentClass overschrijven door het dezelfde naam te geven in de ChildClass en een nieuwe functionaliteit aan toe te voegen.

Het inherritance principe laat toe dat je bepaalde functionaliteit slechts een keer definieert in een ParentClass en dan steeds opnieuw gebruikt in ChildClasses.

 

class ParentClass

{ public $br = '<br />';

  public $space = '&nbsp;';

  public function wrapBtag($content)

{ return sprintf('<b>%s</b>', $content);     } }

class ChildClass extends ParentClass

{ public function wrapItag($content)          

{ return sprintf('<i>%s</i>', $content); } }

$wrapper = new ChildClass(); >>> maakt een object van de ChildClass en onderstaand worden de methods getoond.

echo $wrapper->br, $wrapper->wrapBtag('BOLD'), $wrapper->space, $wrapper->wrapItag('ITALICS');

                de method htmlentities() onderin wordt gebruikt om html te tonen zonder het te renderen

                de method var_export($value, TRUE) onderin produceert een waarde als var_dump()

echo $wrapper->br, htmlentities(var_export($wrapper, TRUE));

 

<?php

In de ChildClass kan je de functionality van de ParentClass overschrijven.

Onderstaand definieert de ParentClass een HTML 4 doctype en de ChildClass een HTML 5 doctype

class ParentClass

{               public function wrapBody($content)            

{               return sprintf("<body>\n$content</body>\n", $content);}

  public function docType()

{               return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'

                   . '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' . PHP_EOL; } }

class ChildClass extends ParentClass

{               public function docType()

{               return '<!DOCTYPE html>' . PHP_EOL;         }}

 

$parentClass = new ParentClass();

$childClass = new ChildClass();

echo $childClass->docType();

echo $childClass->wrapBody('<h1>TEST CHILD</h1>');

echo '</html>';

 

EXCEPTIONS

 

Exception is een oop equivalent van een error.

Exception is een built in php class die dealt met fouten die gegenereerd worden in object classes.

Je gebruikt het om user friendly messages te genereren bij het ontstaan van een fout.

Het wordt als volgt geïnitieerd. { throw new Exception($output . '<br />Boodschap');}

De codeblock van de object class wordt dan in een try/catch block gewikkeld als volgt:

try {codeblock } catch (Exception $e) {      echo $e->getMessage();}

 

<?php

class Test

{ public function divide($operand1, $operand2)         {

                $output = "<br />1st Operand: $operand1\n";

                $output .= "<br />2nd Operand: $operand2\n";

                $output .= '<br />Division Result: ' . $operand1 / $operand2;

                return $output;   }}

$test = new Test();

echo $test->divide(22, 11);

echo $test->divide(22, 0); >>> geeft een warning

 

<?php

class Test

{               public function divide($operand1, $operand2)          

{               $output = "<br />1st Operand: $operand1\n";

                $output .= "<br />2nd Operand: $operand2\n";

                if ($operand2 == 0) {

                                // hier kan je opzettelijk een exception gooien

                                throw new Exception($output . '<br />Cannot Divide by Zero!');          }

else {      $output .= '<br />Division Result: ' . $operand1 / $operand2;                              

return $output;   } } }

$test = new Test();

In de try block doen we code die een exeption kan (throw) genereren

In de catch block doen we de recovery code die runned als de exception is (caught) ontdekt

try {        echo $test->divide(22, 11);

                echo $test->divide(22, 0);}

catch (Exception $e) {echo $e->getMessage();}

 

<?php

Exceptions kunnen ook gegenereerd worden door built-in classes

Datetime bijvoorbeeld

Meer over datetime op: http://www.php.net/manual/en/book.datetime.php

Voor meer format codes zie: http://www.php.net/manual/en/function.date.php

l = full day name, d = 2 digit day of the month, F = full month name, Y = 4 digit year

$dateString = '2021-01-01';

$futureDate = new DateTime($dateString);

echo '<br />DATE:', $dateString;

echo '<br />FULL:', $futureDate->format('l, d F Y');

Een onmogelijke datum zal een exception genereren

$dateString = '2021-33-33';

$futureDate = new DateTime($dateString);

echo '<br />DATE:', $dateString;

echo '<br />FULL:', $futureDate->format('l, d F Y');

 

<?php

try {        $dateString = '2021-01-01';

                echo '<br />DATE:', $dateString;

  // l = full day name, d = 2 digit day of the month, F = full month name, Y = 4 digit year

                $futureDate = new DateTime($dateString);

                echo '<br />FULL:', $futureDate->format('l, d F Y');

                $dateString = '2021-33-33';

                echo '<br />DATE:', $dateString;

                $futureDate = new DateTime($dateString);

                echo '<br />FULL:', $futureDate->format('l, d F Y'); }

catch (Exception $e)

{ echo '<br />';

  echo 'Unable to process date/time information!';

  echo '<br />';

  echo $e->getMessage();

  echo $e->getTraceAsString();       }

 

MVC MODEL VIEW CONTROLLER DESIGN PATTERNS

 

<?php

Zie Design Patterns: http://en.wikipedia.org/wiki/Software_design_pattern

MVC is een architectural concept for OOP. Het is een manier om je code op te breken in 3 basis class categorieën.

·         Het model werkt typisch met de database

·         De view die werkt met output

·         De controller die beide bij elkaar brengt

include './classes/Controller.php';

$controller = new Controller();

echo $controller->showUserInfo(2);

 

Een design pattern is een algemene bruikbare oplossing voor een vaak voorkomende probleem binnen een gegeven context in software design. Ongeveer als een blauwdruk in object oriented programming voor het ontwerpen van een applicatie.

<?php

class Model

{ public $firstName = '';

  public $lastName = '';

  public $accountNumber = 0;

  public $balance = 0;

  public $isMember = FALSE;

  public $preferences = array();

  public function setUserInfo($data)

  {             $this->firstName = $data[0];

                $this->lastName = $data[1];

                $this->accountNumber = $data[2];

                $this->balance = $data[3];

                $this->isMember = $data[4];

                $this->preferences = $data[5];       }

  public function showFullName()

  {             return $this->firstName . ' ' . $this->lastName;         }

  public function showAccountInfo()

  {             $info = '';

                $info .= sprintf('<br />Name: %s %s', $this->firstName, $this->lastName);

                $info .= sprintf('<br />Account Number: %d', $this->accountNumber);

                $info .= sprintf('<br />Balance: $%8.2f', $this->balance);

                $info .= sprintf('<br />Is Member: %s', var_export($this->isMember, TRUE));

                // NOTE: implode(glue_string, array) takes an array and produces a string

                $info .= sprintf('<br />Preferences: %s', implode(', ', $this->preferences));

                return $info;        }

  // onderstaand simuleren we het invoeren van user information van een database

  public function getUserById($id)

  {             if ($id == 1)

 { $userInfo = array('Amelia', 'Earhart', 887766, 234567.89, TRUE, array('Airplanes', 'GP', 'Flying'));}

                Else

 {$userInfo = array('Winston', 'Churchill', 998877, 1230467.88, TRUE, array('Cigars', 'Conservative Party', 'Polo'));            }

                return $userInfo; }}

 

<?php

class View

{ public $title        = '';        

  public $body       = array();

  public function setTitle($newTitle)

  {$this->title = sprintf("<title>%s</title>\n", $newTitle);       }

  public function render()

  {             $output = "<!DOCTYPE html>\n";

                $output .= "<html>\n";

                $output .= "<head>\n";

                $output .= $this->title;

                $output .= '<meta http-equiv="content-type" content="text/html;charset=utf-8" />' . PHP_EOL;

                $output .= "</head>\n";

                $output .= "<body>\n";

                foreach ($this->body as $line) {      $output .= $line . PHP_EOL;  }

                $output .= "</body>\n";

                $output .= "</html>\n";

                return $output;   } }

 

<?php

need to include these files to make classes available

include 'Model.php';

include 'View.php';

class Controller

{               public function showUserInfo($userID)

{               $model = new Model($userInfo);

                $userInfo = $model->getUserById($userID); >>> pakt de userinfo

                $model->setUserInfo($userInfo); >>> zet userinfo in de model

                $view = new View();

                $view->body[] = '<h1>' . $model->showFullName() . '</h1>';

                $view->body[] .= '<hr />';

                $view->body[] .= $model->showAccountInfo();

                return $view->render();    } }

 

include ‘./classes/controller.php’; >>> include class controller

$controller = new Controller();

Echo $controller->showUserInfc(1);

 

EXTERNAL LIBRARIES

INCLUDE

 

Include command gebruik je als je een file een of meerdere keren wilt loaden. Het stelt je in staat om code blocks die in een file zitten te laden in je code.

Hieronder wordt de syntax gebruikt,. Hierbij wordt een file constants.php eerst geladen, waarna de file ad_block tweemaal wordt geladen. Hierbij moet het pad naar de file worden aangeven. Als je dat niet doet zal php in php.ini kijken als de file te vinden is.

De syntax om de file constants.php te loaden:

<?php include './includes/constants.php'; ?>

<div style="width: 635px; height: 650px;">

  <h1><?php echo SITE_HEADER; ?></h1>

  <hr />

  <div style="width: 110px; height: 600px; float: left;">

                <?php include './includes/ad_block.html'; ?>

                <?php include './includes/ad_block.html'; ?>

  </div>

  </div>

Je kan include gebruiken voor het loaden van libraries of functions, class definitions, voor het definiëren van constants of het initialiseren van variables. Zodoende kan je je code opbreken in kleinere files die gebruikt en hergebruikt kunnen worden.

 

REQUIRE

Require is heeft dezelfde werking als include. Echter als de file niet te vinden is zal de code een fatal error geven. Dit gebeurt niet bij include. Include geeft een warning, maar laat de code toch doorgaan.

Onder in de syntax:

require './includes/Library.php';

$title = titleTag('Hello World');

$meta = metaTag(array('http-equiv' => 'content-type', 'content' => 'text/html;charset=utf-8'));

$content =

$body[] = '<h1>Test Website</h1>';

$body[] = '<hr />';

$body[] = 'Constructed using a library of functions';

echo render(docType(5), headTag($title, $meta), bodyTag($body));

 

INCLUDE ONCE en REQUIRE ONCE

 

Als je een file slechts een keer wilt laden gebruik je de syntax:

Include_once ‘./includes/file.ext’;

of

Require_once ‘./includes/file.ext’;

Dit doe je als de file function - of class definitions heeft. Html laat niet toe dat (files met) function definitions of class definitions tweemaal geladen worden. In feite kan je include_once of require_once altijd gebruiken i.p.v. include of require.

 

PHP EXTENSIONS EN PECL

 

Een php extension is een externe code block die toevoegt aan een code van de php programmeertaal. Ongeveer als woorden toegevoegd aan Nederlands of Sranangtongo. Met php extensions voeg je functies en classes toe, waardoor je meer kan doen met php. PECL is php extension community language. De website http://pecl.php.net toont al deze extensions. Ze zijn geschreven in C-language en kunnen worden gedownload en installed en enabled. Code geschreven in C-language is superieur in performance.

Op de http://php.net vind je de enchant extension voor spelling in verschillende talen.

Deze file zit ook per default in php maar is niet enabled.

Om te zien welke extensions enabled zijn run je <?php phpinfo(); of <?php phpinfc();

Deze toont je alle extensies die enabled zijn.

Als je een extensie wilt enablen moet je je php.ini file aanpassen.

Open php.ini > search dynamic extensions > kijk als je enchant vindt in de lijst van extensions en verwijder de “ ; “ waardoor het enabled wordt.

Je kan zelf extensions van buiten toevoegen alsvolgt:

Extension=/path/to/extension/modulename.dll      

Je kan met PECL allerlei functionaliteit zoals payment support, encryption support, werken met pdf-files etc

 

PEAR

http://pear.php.net biedt meer php extensions en applications. Deze zijn geschreven in php. Ze kunnen gedownload en unzipped worden en geplaatst in de gewenste directory. Je kan ze daarna normaal includen.

In Xampp\php\pear\* vindt je de folders met pear extensions

Je gebruikt ze alsvolgt:

<?php

Include ‘c:\xampp\php\pear\Crypt\Blowfish.php’;

function encrypt ($contents, $key){$bf = new Crypt_Blowfish ($key); return $bf->encrypt($contents);}

function decrypt ($contents, $key){$bf = new Crypt_Blowfish ($key); return $bf->decrypt($contents);}

$contents = file_get_contents(‘gettysburg.txt’); >>> leest inhoud van de testfile

$key=”Some Secret Key”;

$encrypted = encrypt ($contenst, $key); >>> produceert encrypted file

$decrypted = decrypt ($contenst, $key); >>> produceert decrypted file

?>

<hr>Encrypted output</hr>

<hr/>

<pre><?php echo $encrypted; ?></pre>

<p>&nbsp;</p>

<hr/>

<pre><?php echo $decrypted?></pre>

 

F* FILES FAMILY

 

<?php

“f*” family kan gebruikt worden om een files op je local system te lezen

Met deze commands kan je precies het aantal bytes bepalen die je uit de file wilt lezen

Enkele commands zijn

$fh = fopen($filename, ‘r’); >>> open file $filename voor  r = read, w = write, a = append (toevoegen). $fh >>> file handle

Write overschrijft de file, append plaatst text bij aan het eind van de file. Als de file niet bestaat wordt hij gecreëerd.

fread ($fh, n); >>> read n bytes from file $file handle

fwrite() >>> schrijft naar een file

fgetcsv() >>>leest van een csv (comma separated file)

feof() >>>end of file

fclose($fh); >>> close file

 

$filename = 'gettysburg.txt';

$filename = 'file_does_not_exist.txt';

$fh = fopen($filename, 'r');

if ($fh) { $contents = '';

while (!feof($fh)) {$contents .= fread($fh, 1024);} >>> leest 1024 bytes per keer tot end of file !feof($fh)

fclose($fh);}

else {      $contents = 'ERROR: unable to open file ' . $filename; } >>> gooit een fatal error als de file niet bestaat

echo htmlspecialchars($contents);  >>>toont de inhoud op veilige wijze

 

<?php

$filename = 'city_rates.csv'; >>> leest een csv file

$fh = fopen($filename, 'r');

if ($fh) { $rates = array();

while (!feof($fh)) {$rates[] = fgetcsv($fh);} >>> leest steeds een regel van de file csv (comma seperated value)

fclose($fh);}

else {$contents = 'ERROR: unable to open file ' . $filename;}

echo "<h1>California USA Tax Rates</h1><hr />\n";

echo "<table border=1 width='75%'>\n";

foreach ($rates as $city){echo "<tr><td width='40%'>\n"; echo implode('</td><td>', $city); echo "</td></tr>\n";}

echo "</table>\n"; // >>> implode vormt een string uit karakters. In dit geval wordt elke string woord voor woord ingelezen.

 

<?php

Bij het schrijven naar een file.

$filename = 'website_access.log';

$fh = fopen($filename, 'a+'); >>> a om toe te voegen, + om later te kunnen lezen van de file. r + laat je later schrijven.

if ($fh) { $ip = $_SERVER['REMOTE_ADDR'];

$browser = $_SERVER['HTTP_USER_AGENT']; >>> pakt de browser van de user

$today = date('Y-m-d H:i:s');

fprintf($fh, "%20s | %20s | %60s\n", $ip, $today, $browser);

rewind($fh); // >>> brengt the file pointer/cursor naar het begin

echo '<pre>';        fpassthru($fh);    echo '</pre>'; >>> produceert alles tot het eind van de file

fclose($fh);}

else { echo 'ERROR: unable to open file ' . $filename;}

phpinfo(INFO_VARIABLES); >>> toont informatie in $_SERVER[]

 

*FILE* FAMILY OF COMMANDS

<?php

File family of commands worden gebruikt om inhoud van een file op een remote website te lezen

Je kan hier niet bepalen hoeveel je wilt lezen. Alles wordt ingelezen

file_get_contents(url): toont de inhoud van een file als een string

file_put_contents(url): schrijft naar de inhoud van een file

file($filename): produceert een array met de inhoud van een file

Zie onderin:

$contents = file_get_contents('http://google.com');

echo '<pre>';

echo htmlspecialchars($contents);

echo '</pre>';

 

<?php

Managen van files met de file family commands

$filename = 'website_access.log';

$ip = $_SERVER['REMOTE_ADDR']; >>> produceert de users ip-address

$browser = $_SERVER['HTTP_USER_AGENT']; >>> toont de users browser

$today = date('Y-m-d H:i:s'); >>> toont de datum in YYYY-mm-dd 24hour:minutes:seconds format

// if the 3rd param is not specified, assumes "w" mode

file_put_contents($filename, sprintf("%20s | %20s | %60s\n", $ip, $today, $browser), FILE_APPEND);

>>> schrijft naar de file $filename, sprintf() geeft aan wat geschreven wordt, FILE_APPEND is de mode (default mode = write)

echo '<pre>';

echo file_get_contents($filename); >>> toont het resultaat

echo '</pre>';

phpinfo(INFO_VARIABLES); >>> toont informatie van $_SERVER[]

 

 

<?php

using "f*" family commands to write to a file

$filename = 'website_access.log';

$entries = file($filename); >>> is als file_get() command, alleen produceert het een array

echo '<pre>', var_dump($entries), '</pre>';

 

FILE STREAMS

 

<?php

// wrappers: http://php.net/manual/en/wrappers.php

Een stream is een php subsystem die als basis dient voor alle file operations.  Het laat file-commands verschillende data sources bewerken alsof ze files zijn.  Je kan zowel local files als files op een remote server openen en bewerken.De sources worden aangegeven door verschillende componenten genoemd wrappers.  Enkele wrappers zijn (file://, http://, ftp://, php:// , rar:// etc) http://uk.php.net/wrappers.php toont de wrappers.

Context zijn parameters die wrapper specific zijn.

Transport zijn de verschillende methoden om data over te zetten zoals tcp en udp

Filter voert een bewerking uit op de inhoud (data) van je file zoals convert.*, zlib.*,  string.strip_tags etc

phpinfo() toont welke streams wrappers, filters en transports beschikbaar zijn op de locale server

Een stream op een ftp server open je als volgt:

$server = 'ftp.unlikelysource.com';

$user = 'u47957963-test';

$password = 'password';

$ftp = fopen("ftp://$user:$password@$server/gettysburg.txt", 'r'); >>> r voor read mode

Als SSH2 extension geinstalleerd is kan je (secure ftp) sftp gebruiken.

$sftp = fopen('ssh2.sftp://user:pass@example.com:22/path/to/filename', 'w'); >>> w voor write

if ($ftp) {$contents = '';

                while (!feof($ftp)) { $contents .= fread($ftp, 1024);} >>> leest elke keer 1024 bytes tot het einde( alsof het een file is)

                fclose($ftp);}

else        {$contents = 'ERROR: unable to open FTP server'; }

echo htmlspecialchars($contents);

phpinfo();

<?php

NOTE: __DIR__ magic constant werkt alleen op PHP 5.3 en daar boven. “dirname(_FILE_)” is zijn voorganger.

$sourceFile = __DIR__ . '/gettysburg.txt';

$destFile = __DIR__ . '/gettysburg.bz2';

if (file_exists($sourceFile))

{$contents = file_get_contents($sourceFile);

     file_put_contents('compress.bzip2://' . $destFile, $contents); >>> comprimeerd data uit file in gzip en laadt het in $destFile

     $contents = file_get_contents($destFile); >>> leest de zip file

     echo $contents;

     $contents = file_get_contents('compress.bzip2://' . $destFile); >>> leest file met zipstream

     echo '<br /><hr />';

     echo $contents;}

else {   echo "SORRY: unable to open source file $sourceFile!"; }

 

<?php

// applying filters

stream_filter_register() laat PHP weten dat er een filter is als het niet per default enabled is

use stream_filter_append() voegt een filter toe aan je stream

filename

$filename = 'gettysburg.txt';

$fh = fopen($filename, 'r');

if ($fh) {

  stream_filter_append($fh, 'string.tolower'); >>> filter

  fpassthru($fh); >>> toont de inhoud allemaal tegelijk

  rewind($fh); >>> gaat terug naar het begin

  echo '<br /><hr />';

  stream_filter_append($fh, 'string.toupper');>>> tweede filter

  fpassthru($fh);

  fclose($fh);}

else {      echo 'ERROR: unable to open file ' . $filename;}

echo '<br /><hr />';

use phpinfo() to find out what filters are available on your server

phpinfo();

 

ERROR LOG

 

De error message kan je op verschillende manieren loggen

Je kan direct displayen, of sturen naar een email optie 2 of naar een file optie 3

De syntax is

Error_log($message); display direct in de operatie

Error_log($message, 2, $filename); >>> email als de server een MTA mail transport server heeft

Error_log($message, 3, $filename); >>> naar een file bv een log file die gespecificeerd is in de php.ini file onder error_log.

Php.ini heeft ook default settings display_startup_errors on,

maar wordt meestal uitgezet in een production environment (als de website in productie wordt gebracht)

 

PARSING DIRECTORY STRUCTURES

Parsing is het process van analyseren van een string aan symbolen.

Bij het parsen begin je met het vaststellen van de locatie

//$path = __DIR__;

$path = realpath(__DIR__ . '/..'); >>> toont het pad naar een root directory

$listGlob = glob($path . '/*'); >>> voor het listen van directories

$listScan = scandir($path); >>> voor het listen van files en folders

$listRecursive = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),                                                               RecursiveIteratorIterator::SELF_FIRST); >>> SELF_FIRST is optioneel

echo '<br />Path: ', $path;

echo '<br /><br />glob()<hr />';

echo implode('<br />', $listGlob);  

echo '<br /><br />scandir()<hr />';

echo implode('<br />', $listScan);   >>> neemt een array aan karakters en maakt er een string van

echo '<br /><br />RecursiveDirectoryIterator<hr />';

echo implode('<br />', iterator_to_array($listRecursive));    

 

MANAGING MYSQL FILES

Je kan MySQL vanaf de commandline benaderen.

In XAMPP open de Shell

Type: mysql

Voor een user en password –u usernaam –p password databasenaam

Voor hulp type: help of ?

Voor databases type: show databases;

Voor een database type: use databasenaam;

Voor tables: show tables;

Voor columns: show columns from tabelnaam;

Om eruit te gaan: exit

 

Phpmyadmin kan je accessen via xampp > klik in mysql op admin of ga naar http://localhost/phpmyadmin

Je komt in de general settings waar je meer info ziet over de server

Je kan links de databases expanden en zo de tables, columns etc zien

Met import importeer je een nieuwe database of table

Om een excel file te kunnen importeren als table, moet hij als *.csv zijn opgeslagen.

Ga dan in phpmyadmin naar de database waarin je het wil opslaan

Import > geef de locatie aan > rows to skip 1 om de headers te skippen > format CSV with load data > replace tabledata with file om een eventuele database met dezelfde naam te verwijderen > column names kies hier alle headers geen spaties tussen de kommas bv city,tax,rates. (als excel extra columns heeft bijgeplaatst zal de import niet lukken, zo ook zullen bepaalde tekens verkeerd vertaald worden. Al die informatie moet verwijderd worden uit de file alvorens de import kan geschieden. Het kan ook anders lopen waar je 0 columns skipped en aangeeft dat de file headers heeft.

 

Phpmyadmin kan je in de xampp\phpmyadmin\config.inc.php file of

Open config.inc.php op line 15 tot 24 staan de server configuratie gegevens

User, password, extension (dit is de DSN) en AllowNoPassword kan je aanpassen

Daarna moet je de user en password ook nog op de server aanpassen via de command prompt

Mysql

Use information_schema;

UPDATE mysql.user SET Password=PASSWORD(‘wachtwoord’) where User=’usernaam’; FLUSH PRIVILEGES;

Nu kan je in http://localhost/phpmyadmin met de nieuwe username en password

 

Je kan ook een folder maken in xampp\phpmyadmin en het config noemen en de config.inc.php erin copieren

Nu kan je in http://localhost/phpmyadmin/setup de authentication informatie en andere gebruikers informatie invullen en saven. Je kan nu de config.inc.php file uit de config folder terugkopieren naar de phpmyadmin folder

 

http://localhost/phpmyadmin Je kan onder status tab allerlei informatie over de status van de server vinden.  In status onder de advisor tab vind je een lijst van recommendations die je kan helpen om je server te optimaliseren. De aanpassingen kan je doen in de mysql.ini file.

 

MANAGING A DATABASE

De databases vindt in in xampp\mysql\data\test

Collation vertegenwoordigd characters ci betekent case insensitive cs >>> case sensitive

Je kan in phpmyadmin > databases een database creeren > je kan collation utf8_general_ci kiezen die compatible is met de meeste andere database types. In privileges > kan je een user creeren voor deze database. Username (liefst naam van database gebruiken; niet verplicht), password en verschillende global privileges kunnen aangevinkt worden om hiermee te bepalen welke rechten de gebruiker zal hebben.

Als je eenmaal een database hebt kan je in phpmyadmin de database openen en een of meer tabels creeren.

Bepaal de databasenaam, de columns: hierbij moet je de naam, de datatype, lengte, evt default, collation (als hierboven), attributes (binary of on update CURRENT_TIMESTAMP voor huidige datum als het een date field is),null (als het open kan blijven), index (als het een index betreft), AI (autoincrement), comments,

Storage engine (InnoDB is meest gebruikt, archive slaat het compressed op, memory is heel snel maar gebruikt memory en cache, csv slaat op als CSV goed voor gebruik met excel, blackhole voor testen en myISAM voor backward compatibility), partition definition als je het wilt opbreken in partitions.

 

In phpmyadmin > klik op de database en dan de tabel > in structure kan je een column aanpassen, of droppen, je kan individuele properties van de tabel aanpassen, je kan columns toevoegen aan het begin, eind of na een bestaande column.

Je kan dan de properties van de columns bepalen. In de properties zie je ook MIME types (tekst/plain etc), browser transformation (tekst/plain: link) en transformation options (http://www.iemsabi.com/link). Komt later terug. Behalve in structure kan je ook in browse aanpassingen maken. Klik op de header om de volgorde te veranderen. Klik op een row en click edit om aanpassingen per row te maken.

Export laat ons de data naar een andere filetype schrijven bv sql of csv.

 

In phpmyadmin> klik Insert om  je tabel te populeren

 

Primary key zorgt voor unique identificatie van de table.

Relationship is een link tussen tabellen door gebruik van dezelfde set keys

Mogelijk zijn one to one, one to many en many to many

In een one to many relationship is de Parent de one, en de Child het many gedeelte van de relatie

Een index is een aparte lookup file die MySQL helpt om snel data te accessen of de tabel in volgorde te scannen.

De meest voorkomende index typen zijn Primary, Unique en Index

Indexen creeren een relatie tussen columns te bewerkstelligen en om informatie te zoeken in grote hoeveelheden data.

 

Klik de childtable en kies structure > dan in het midden relation view > en daar kan je de kiezen voor internal relationship en\of foreign key, en hoe de database moet reageren ON DELETE of ON UPDATE.

No action betekent dat de database de opdracht uitvoert zonder vervolgactie

Restrict betekent dat de database niet toelaat dat uit de child table records verwijderd worden die een relatie hebben met de parent table.

Cascade betekent dat bij het updaten van de child table de parent table ook wordt aangepast.

Set null betekent dat bij het deleten van de parent table de overeenkomstige waarden in de child table NULL worden.

Klik de database en kies more > Designer

In de designer zie je een grafische voorstelling van de relaties

De parent table index gaat via een groene link over naar de child table. De link kan je aanklikken en deleten. Je kan ook in de menu de link icon klikken en dan eerst in de parent table de column aanklikken en dan die in de child

 

Constraints zijn een ingebouwde tool voor het behouden van database integrity. Om een constraint op te leggen moet je een relationship opbouwen.

Orphaned rows zijn rows in de childtable, waarvan de relaterende key in de parent table verwijderd  zijn.

Relationships worden alleen in een InnoDB storage engine toegestaan.

Daarnaast moet er een primary of unique index op de columns van de parent table zijn.

De key in zowel de parent als de child moeten hetzelfde data type en lengte hebben.

 

MYSQL

In http://php.myadmin klik op de mysql tab en er opent zich een querybox. Hierin kan je mysql queryen.

SELECT * FROM ‘users’ >>> ‘…’ geeft aan dat je van een column- of tabelnaam i.p.v. waarden.

SELECT ‘name’, ‘adres’ FROM ‘users’

ORDER BY ‘users’. ‘UsersID’ ASC

Limit 0, 30

 

Agregates kunnen een enkele waarde produceren uit een groep waarden in een column.

SELECT MIN(‘balance’), MAX(‘balance’), AVEREDGE(‘balance’), SUM(‘balance’) FROM ‘users’

 

WHERE is bedoeld om het resultaat te beperken

SELECT * FROM ‘users’ WHERE ‘balance’ < 0;

Je kan ook het aantal bepalen met

SELECT COUNT() FROM ‘users’ WHERE ‘balance’< 0;

 

SELECT * FROM ‘’users WHERE ‘phone’ LIKE ‘%-9__-%’  zoekt naar een waarde die -9 heeft en daartussen 2 spaties en dan -

% >>> een of meer characters

-9 >>> begint met negen

_ >>> een character

phone number, postal code e.d. zijn strings en worden als ‘0633188089’ gespecificeerd worden

age vraagt om een numeric. Numerics kunnen in aggregates gebruikt worden. Numerics worden zonder ‘’ geschreven dus 35

date vraagt om een date value welke ook als ’17 June 1964’ gespecificeerd worden

 

Bij inserts kan je overslaan columns die null values toestaan, columns met een default value en columns met een auto value

Bij foreign key constraints kan je geen waarden in de Child table inserten alvorens je een corresponderende waarde hebt ingevuld in de parent table

Voor de primary key kan je geen waarde invullen die reeds bestaat aangezien de primary key uniek moet zijn.

 

UPDATES

UPDATE table SET ‘col1’= ‘waarde1’,’col2’= ‘waarde2’, ‘coln’ =‘waarden’ WHERE  ‘colx’ = ‘een waarde’

UPDATE van een column met een primary key kan alleen als het geen duplicate waarde is

UPDATE van column met foreign key constraint. Bij cascade zullen de waarden ingevuld in de parent zorgen voor een update van de child en waarden in de child kunnen slechts ingevuld worden als ze geen duplicate zijn van waarden in de parent.

UPDATE `users`

SET `balance` = `balance` + 45.72

WHERE `users`.`user_id` = 80;

-- updates multiple columns

UPDATE `users`

SET `address` = '123 Main Street', `city` = 'New York',`phone` = '212-305-8888'

WHERE `users`.`user_id` =00000080;

-- updates multiple rows: corrects rows to state code where state_province is spelled out as "Alaska"

UPDATE `users`

SET `state_province` = 'AK'

WHERE `state_province` = 'Alaska';

-- updates ALL rows: increases balance by 1%

UPDATE `users`

SET `balance` = `balance` * 1.01;

-- update of primary key fails if the value already exists

UPDATE `users`

SET `user_id` = '88'

WHERE `users`.`user_id` = 80;

-- update of primary key is OK if value does not already exist

-- notice the effect of constraint cascade on update -- look at purchases table

SELECT * FROM `purchases` WHERE `user_id` = 80;

UPDATE `users`

SET `user_id` = '99'

WHERE `users`.`user_id` = 80;

SELECT * FROM `purchases` WHERE `user_id` = 80; -- comes back empty

SELECT * FROM `purchases` WHERE `user_id` = 99; -- comes back w/ 1 row

 

DELETE FROM TABLES

 

-- deletes 1 row from table "users"

DELETE FROM `users`

WHERE `users`.`user_id` = 86;

-- deletes multiple rows from table "purchases"

DELETE FROM `purchases`

WHERE `user_id` = 0;

-- attempt to delete from parent table where child rows exist and constraint = restrict

DELETE FROM `users`

WHERE `users`.`user_id` = 88;

-- either delete child rows or change constraint to cascade on delete

DELETE FROM `purchases`

WHERE `purchases`.`user_id` = 88;

DELETE FROM `users`

WHERE `users`.`user_id` = 88;

 

Bij DELETE met een foreign key constraint RESTRICT kan je liever eerst de record in de Child verwijderen zodat de record in de Parent ook kan worden verwijderd. Bij CASCADE zullen bij deletion van de record in de Parent, de record in de Child automatisch verwijderd worden.

 

-- join users and purchases table

SELECT * FROM `users`

JOIN `purchases`

ON `users`.`user_id` = `purchases`.`user_id`;

-- only specify certain columns

SELECT

`users`.`name`,

`purchases`.`transaction`,

`purchases`.`quantity`,

`purchases`.`sale_price`

FROM `users`

JOIN `purchases`

ON `users`.`user_id` = `purchases`.`user_id`;

-- produces a message user_id ambiguous

SELECT

`users`.`name`,

`purchases`.`transaction`,

`purchases`.`date`,

`purchases`.`quantity`,

`purchases`.`sale_price`

FROM `users`

JOIN `purchases`

ON `users`.`user_id` = `purchases`.`user_id`

WHERE `user_id` = 66;

Als je de WHERE clause gebruikt moet je bij gelijknamige column ook de tabelnaam aangeven zoals hieronder aangegeven.

-- join users and purchases table with WHERE clause

SELECT

`users`.`name`,

P`purchases`.`transaction`,

`purchases`.`date`,

`purchases`.`quantity`,

`purchases`.`sale_price`

FROM `users`

JOIN `purchases`

ON `users`.`user_id` = `purchases`.`user_id`

WHERE `users`.`user_id` = 66;

 

-- join 3 tables

SELECT

`users`.`name`,

`products`.`sku`,

`products`.`title`,

`products`.`price`,

`purchases`.`transaction`,

`purchases`.`quantity`,

`purchases`.`sale_price`

FROM `users`

JOIN `purchases`

ON `users`.`user_id` = `purchases`.`user_id`

JOIN `products`

ON `purchases`.`product_id` = `products`.`product_id`

WHERE `users`.`user_id` = 66;

-- using "AS" to give aliases

SELECT

u.`name`,p.`sku`,p.`title`,p.`price`,

r.`transaction`,r.`quantity`,r.`sale_price`

FROM `users` AS u

JOIN `purchases` AS r

ON u.`user_id` = r.`user_id`

JOIN `products` AS p

ON r.`product_id` = p.`product_id`

WHERE u.`user_id` = 66;

-- use JOIN with SUM() and GROUP BY

SELECT u.`name`, r.`transaction`, r.`date`, SUM(r.`sale_price`)

FROM `users` AS u

JOIN `purchases` AS r

ON u.`user_id` = r.`user_id`

JOIN `products` AS p

ON r.`product_id` = p.`product_id`

WHERE u.`user_id` = 66

GROUP BY r.`transaction`;

Bovenstaand gebruikt transaction column om het resultaat te groeperen

 

<?php

Php database extension is een php extension die connectiviteit met een database bewerkstelligt.

API (application programming interface) = php database extension is een set van programmeerinstructies en standaarden voor toegang tot een web based programma. API’s voor MySQL zijn mysql, msysqli en pdo.

Comparison Chart >>> http://www.php.net/manual/en/mysqlinfo.api.choosing.php

PHP biedt drie verschillende API’s om te connecten met MySQL. Onderstaand staan de API’s van mysql, mysqli en pdo. Elke code snippet creert een connectie met de MySQL server op de website example.com door gebruik van de username ‘user’, password ‘password’. Een query loopt om de gebruiker te groeten.

De mysql API is deprecated m.a.w. hij zal ophouden te bestaan, dus is het beter om mysqli of pdo te gebruiken.

 

Op http://www.php.net/manual/en/bookpdo.php vindt je meer informatie over de pdo command set.

PDO drivers bieden toegang tot verschillende SQL servers

PDO_SQLSRV Microsoft SQL functions

 PDO_DBLIB Microsoft SQL en Sybase functions

PDO_OCI Oracle SQL functions

PDO_MySQL MySQL function >>> is de driver die gebruikt zal worden in deze cursus

PDO:: commands die de database connection zelf betreffen en

PDOstatement:: commands zorgen voor execution en fetching van results.

PDO:: query runt sql statements returns statement object

PDO::prepare stuurt statements naar de server om vooraf compiled te worden, returns result as a pdostatement object

PDO::lastinsertID returns de ID van de primary key van de laatste statement i.g.v. autoincrement

PDO::FETCH_ASSOC pakt een rij in de vorm van een associative array. De column names worden de keys.

 

Discussion >>> http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/

PDO (PHP Data Objects) kan op 12 verschillende database connecten terwijl msqli slechts op MySQL werkt. Daarom is PDO de gekozen API voor deze cursus.

http://stackoverflow.com/questions/2190737/what-is-difference-between-mysql-mysqli-and-pdo

Benchmarks >>> http://jnrbsn.com/2010/06/mysqli-vs-pdo-benchmarks

http://wooptoo.com/blog/pdo-vs-mysqli-performance-comparison/

 

Html elements kunnen een attribute hebben. De attribute geeft meer informatie over of bepaald de eigenschap van het element. Ze worden in de start tag gespecificeerd en komen als: naam = “waarde”

Onderstaand enkele voorbeelden

<!DOCTYPE html>   >>>document type is html
<html lang="en-US">     >>>taal is US engels
<body><h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>

</html>

<p title="About W3Schools">dit is een lang verhaal</p>

<a href="http://www.w3schools.com">This is a link</a>

<img src="w3schools.jpg" width="104" height="142">

PDO::ATTR plaatst een attribute op een database handle http://php.net/manual/en/pdo.constants.php

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION zet error reporting, error mode exception aan

 

Lezen van een database gebeurt met het volgende commando:

$dbh = new PDO(“mysql:host=website.com;dbname=tabelnaam”, $user,$pass);

Foreach ($dbh->query($sql)as $row){ }

In de query kan je ook een predefined mode incorporeren voor het returnen van results

foreach ($dbh->query('SELECT name FROM `users`', PDO::FETCH_ASSOC) as $row)

 

<?php

Onderstaand SELECT met pdo

$user = 'class';

$pass = 'password';

$dbh = new PDO('mysql:host=localhost;dbname=class', $user, $pass);  >>> database handle opent database voor bewerking

foreach ($dbh->query('SELECT name FROM `users`', PDO::FETCH_ASSOC) as $row) {echo implode(':', $row) . PHP_EOL;}

$dbh = NULL;

 

Onderstaand SELECT met PDO

Eerst worden alle properties en methods gedefinieerd

De query command wordt geexecuteerd vanaf de database handle

De parameters zijn de $sql statement en de database handle mode >>> PDO::...

PDO::FETCH_ASSOC pakt een rij in de vorm van een associative array. De column names worden de keys.

De statement pakt alle waarden uit de column ‘name’ als $row uit table ‘users’ en produceert een rij met alle waarden.

SELECT met PDO

 

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';   >>> data source = mysql driver,host= localhost, database naam = class

$dbh = new PDO($dsn, $user, $pass); PDO class represents the connection

$sql = 'SELECT * FROM `users` ORDER BY `state_province`, `city`;';   >>> SQL statement

query() for "one-time" SQL requests

echo '<h3>Users Sorted by State and City</h3>', '<hr />', PHP_EOL;

echo '<table border=1>', PHP_EOL;

foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row)

{ echo '<tr><td>', implode('</td><td>', $row), '</td></tr>', PHP_EOL;}         

echo '</table>', PHP_EOL;

$dbh = NULL;   >>> sluit de database connectie

 

Een prepared statement is een SQL statement die placeholders gebruikt i.p.v. de actuele data. Het wordt vooraf naar de server gestuurd om pre-compiled te worden. De actuele data wordt ingevoerd wanneer de statement geexecuteerd wordt.

Prepared statements geven een performance boost als ze in een loop gebruikt worden en ze helpen bij protectie tegen SQL injection attacks. Een prepared statement gaat als volgt.

Maak een pdo object $pdo

Formuleer de SQL statement $sql met gebruik van placeholders

Stuur de prepared statement naar de server: $stmt = $pdo->prepare($sql)

Bij executie van de statement biedt je de waarden aan: $stmt->execute(array(val1, val2, etc))

Fetch het resultaat: foreach($stmt->fetch()PDO::FETCH_ASSOC)as $row){}

 

SQL injection attack is het bijvoegen van malicious code aan de waarden toegevoegd via een input form op je website.

 

 

SELECT pdo met prepared statements

Er wordt met een extra parameter PDO::ATTR_ERRMODE=>ERRMODE_EXCEPTION gewerkt. Deze moet worden weggehaald als het programma wordt opgeleverd aangezien het hackers informatie in de vorm van error messages verschaft bij het proben van je website, voor een SQL injection attack.

use try { // code } catch (PDOException $e) { // code } to trap

 

$sqlPurchases gebruikt concatenate “.”aangezien de select statement (welke een string is) niet op een regel past.

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

try {        $pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

                $sqlUsers = 'SELECT `user_id`, `name` FROM `users` ORDER BY `name`;';

                $sqlPurchases = 'SELECT `transaction`,`date`,SUM(`sale_price`) AS s '

                                                                .'FROM `purchases` WHERE `user_id` = :id GROUP BY `transaction`;'; >>> placeholder

                $purchStmt = $pdo->prepare($sqlPurchases);

                                echo '<h3>User Purchases</h3>', '<hr />', PHP_EOL;

                                echo '<table border=2>', PHP_EOL;              >>> echo een table met randdikte = 2

                foreach ($pdo->query($sqlUsers, PDO::FETCH_ASSOC) as $row)

                { $purchStmt->execute(array(':id' => $row['user_id']));

                                echo '<tr><th>', $row['name'], '</th><td>';

                                echo '<table border=1>', PHP_EOL;

                                echo '<tr><th>Transaction</th><th>Date</th><th>Amount</th></tr>', PHP_EOL;

                while($result = $purchStmt->fetch(PDO::FETCH_ASSOC))

                { echo '<tr>';

                                echo '<td>', $result['transaction'], '</td>', PHP_EOL;

                                echo '<td>', $result['date'], '</td>', PHP_EOL;

                                echo '<td align="right">', $result['s'], '</td>', PHP_EOL;

                                echo '</tr>'; }

                                echo '</table>', PHP_EOL;

                                echo '</td></tr>', PHP_EOL; }

                                echo '</table>', PHP_EOL;

                                $dbh = NULL; }

catch (PDOException $e) { echo $e->getMessage();

                                                echo $e->getTraceAsString(); }    >>> vangt exceptions die gegooid kunnen worden op

 

INSERT DATA

Om met PHP data te schrijven naar een database

Maak de PDO object $pdo

Formuleer de SQL statement $sql met gebruik van placeholders :waarde of ?

Stuur de prepared statement naar de server: $stmt = $pdo->prepare($sql)

Execute the statement met de waarden $stmt->execute((array)val1, val2, etc)

Voor het schrijven van data vanaf een csv file

Gebruik fopen en fgetcsv om elke rij van de file in een array te zetten, alvorens de prepared statements te gebruiken

Bij het schrijven met een constraint

Insert eerst de data in de parent table, achterhaal daarna eventueel de key met lastinserted() en populeer dan de child

 

Hieronder wordt de te inserten data vooraf gedefinieerd als een parameter $data.

<?php

// Sample INSERT of one row

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$data = array('name'         => 'Desi Arnaz',

                                                  'address' => '780 North Gower Street',

                                                  'city'     => 'Los Angeles',

                                                  'state' => 'CA',

                                                  'zip'                       => '90038',

                                                  'phone' => '213-222-4444',

                                                  'balance' => 556677.88);

try {        $pdo = new PDO($dsn, $user, $pass);

                $sql = 'INSERT INTO `users`(`name`, `address`, `city`, `state_province`, `postal_code`, `phone`, `balance`) '

                                 . 'VALUES (:name, :address, :city, :state, :zip, :phone, :balance)'; >>> lable placeholders voor strings

                $stmt = $pdo->prepare($sql);

                $result = $stmt->execute($data);

echo 'RESULT: ', $result;

                $pdo = NULL;}

catch (PDOException $e) {               echo $e->getMessage();

                                                                echo $e->getTraceAsString();}

 

<?php

Meerdere rijen inserten

 

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$fh = fopen('names_15.csv', 'r');                    >>> opent een csv file met data die ingevoerd moet worden

 

try {        $pdo = new PDO($dsn, $user, $pass);

                $sql = 'INSERT INTO `users`(`name`, `address`, `city`, `state_province`, `postal_code`, `phone`) ';

                $sql .= 'VALUES (?, ?, ?, ?, ?, ?)';   >>> ? positional placeholders voor een rij van een numeric array

                $stmt = $pdo->prepare($sql);

                                $output = '';

while(!feof($fh)) {

                $names = fgetcsv($fh); >>> haalt de data uit een spreadsheet

                if (isset($names) && is_array($names) && count($names) == 6)

                {$result = $stmt->execute($names); >>> checked de waarden om te zien als ze valide zijn voor insert

                $output .= '<br />INSERTED: ' . $result . ':' . vsprintf('%20s | %20s | %20s | %6s | %5d | %s', $names) . PHP_EOL;}

                else {      $output .= '<br />FAILED  : ' . var_export($result, TRUE);      }               }

$pdo = NULL;}

catch (PDOException $e) {               echo $e->getMessage();

                                                                                echo $e->getTraceAsString();}

fclose($fh);

echo '<pre>' . $output . '</pre>';

 

INSERT met constraints

In onderstaande voorbeeld proberen we een insert te doen in een Child table.

We hebben de PDO::ERRMODE_EXCEPTION toegevoegd om de fout zichtbaar te maken

Als we een insert doen in de Child met foreign key waarden die niet bestaan in de parent, verschijnt er een error message.

 

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

try {        //$pdo = new PDO($dsn, $user, $pass);

                $pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

                $sql = 'INSERT INTO `purchases` (`transaction`, `product_id`, `user_id`) '

                                 . 'VALUES (:transaction, :productID, :userID);';       

                $stmt = $pdo->prepare($sql);

                $result = $stmt->execute(array('transaction' => 'AAA9999', 'productID' => 99, 'userID' => 99));              

                echo '<br />INSERTED: ' . $result . PHP_EOL;

                $pdo = NULL;

} catch (PDOException $e) {             echo $e->getMessage();

                                                                echo $e->getTraceAsString(); }

 

In het onderstaande vb is de userID een foreign key in de Child en een primary key van de Parent. Aangezien het auto increment is kunnen we na het invoeren van de record niet weten wat de primary key is. $userID = $pdo->lastInsertId(); wordt gebruikt om de laatst ingevoerde primary key te achterhalen en gebruiken bij invoer in de Child.

<?php

INSERT met Constraints

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$data = array(     'name'   => 'Truman Capote',

                                'address' => '1487 Hollywood Blvd',

                                'city'       => 'Los Angeles',

                                'state'    => 'CA',

                                'zip'         => '90044',

                                'phone'  => '213-555-6666',

                                'balance' => 223344.55);

$transID = 'XYZ9999';

$purchases =       array(     array('productID' => 11, 'quantity' => 10, 'salePrice' => 100),

                                                array('productID' => 22, 'quantity' => 10, 'salePrice' => 200),

                                                array('productID' => 33, 'quantity' => 10, 'salePrice' => 300),

                                                array('productID' => 44, 'quantity' => 10, 'salePrice' => 400));

 

try {        $pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

                $sqlParent = 'INSERT INTO `users`(`name`, `address`, `city`, `state_province`, `postal_code`, `phone`, `balance`) '

                                                . 'VALUES (:name, :address, :city, :state, :zip, :phone, :balance)';

                $stmtParent = $pdo->prepare($sqlParent);

                $resultParent = $stmtParent->execute($data);

                $userID = $pdo->lastInsertId(); >>> resulteert in de laatst ingevoerde waarde aangezien we niet weten wat het is.

                $sqlChild = 'INSERT INTO `purchases` (`transaction`, `product_id`, `user_id`, `quantity`, `sale_price`) '

                                                  . 'VALUES (:transaction, :productID, :userID, :quantity, :salePrice);';              

                $stmtChild  = $pdo->prepare($sqlChild);

                $output = 'TRANSACTION: ' . $transID;

                $output .= '<br />USER: ' . $data['name'] . "($userID)";

                foreach ($purchases as $item) {     $result = $stmtChild->execute

(array(   'transaction'        => $transID,

                                'productID'           => $item['productID'],

                                'userID' => $userID,

                                'quantity'              => $item['quantity'],

                                'salePrice'             => $item['salePrice']          ) );          

$output .= sprintf("<br />INSERTED: %s | PURCHASE: %s\n", $result, implode(' - ', $item)); }

                $pdo = NULL; }

catch (PDOException $e) {               echo $e->getMessage();

                                                                echo $e->getTraceAsString();   }

echo '<pre>', $output, '</pre>', PHP_EOL;

 

UPDATE USING PHP

 

Het updaten van data in een table met PHP gaat alsvolgt

Formuleer de SQL statement $sql met gebruik van placeholders

Stuur de prepared statement naar de server: $stmt = $pdo->prepare($sql)

Execute statement met de waarden: $stmt->execute(array(val1, val2, etc))

Bij het updaten van een Parent row met update cascade on, worden de veranderingen gepropageerd in de Child

Gebruik SELECT om de userID te achterhalen op de Parenttable als je de userID niet kent, en UPDATE hiermee de Childtable

 

Voorbeeld van een eenvoudige update van een niet bestaande user die nog moet worden toegevoegd.

De userID mag dus niet bestaan.

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$name2update = 'Truman Capote';

$data = array(     'userID' => 153,  >>> mag niet bestaan

                                 'address' => '1633 East Colorado Boulevard',

                                'city'       => 'Pasadena',

                                'phone'  => '626-795-0431',

                                'zip'         =>'91106',

                                'name'   => $name2update);

try {        $pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

                $sql = 'UPDATE `users` '

                                 . 'SET `user_id`= :userID,`address`= :address,`city`= :city,`postal_code`= :zip,`phone` = :phone '

                                 . 'WHERE `name` = :name;';

                $stmt = $pdo->prepare($sql);

                $result = $stmt->execute($data);

                echo 'RESULT: ', $result, PHP_EOL;

                $pdo = NULL;}

catch (PDOException $e) {               echo $e->getMessage();

                                                                echo $e->getTraceAsString(); }

 

 

Je probeert hier discount toe te passen op de purchase van een user.

Als je de naam van de user kent, kan je de ID vinden. Discount is ook een parameter.

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$name2update = 'Truman Capote';

$discount = .8;

try {        $pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

                $sqlLookup = 'SELECT user_id FROM `users` WHERE `name` = :name'; >>>resulteert in een userID

                $stmtParent = $pdo->prepare($sqlLookup);

                $stmtParent->execute(array('name' => $name2update));

                $lookup = $stmtParent->fetch(PDO::FETCH_ASSOC);

                echo '<br />Lookup Result: ', var_dump($lookup); >>> resulteert in de rij voor de gewenste ID

if ($lookup && is_array($lookup) && count($lookup) > 0) >>> checkt als ID bestaat het in een array is,  en er waarden in zitten

{$sqlSum = 'SELECT SUM(`sale_price`) AS s FROM `purchases` WHERE  `user_id` = :userID';

                                $stmtSum = $pdo->prepare($sqlSum);

                                $stmtSum->execute(array('userID' => $lookup['user_id']));

                                $before = $stmtSum->fetch(PDO::FETCH_ASSOC);

                                echo '<br />SUM BEFORE DISCOUNT: ', $before['s'];

                                $sqlPurchases = 'UPDATE `purchases` SET `sale_price` = `sale_price` * ' . $discount     . ' '

                                                                  . 'WHERE `user_id` = :userID';

                                $stmtDiscount = $pdo->prepare($sqlPurchases);

                                $update = $stmtDiscount->execute(array('userID' => $lookup['user_id']));

                                echo '<br />UPDATE RESULT: ', $update, PHP_EOL;

                                $stmtSum->execute(array('userID' => $lookup['user_id']));

                                $after = $stmtSum->fetch(PDO::FETCH_ASSOC);

                                echo '<br />SUM AFTER DISCOUNT: ', $after['s'];     }

                $pdo = NULL;}

catch (PDOException $e)

                { echo $e->getMessage();

                echo $e->getTraceAsString();  }

 

UPDATE purchases with random dates to generate fake data

<? php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

try {        $pdo = new PDO($dsn, $user, $pass);

                $sqlLookup = "SELECT * FROM `purchases` WHERE `transaction` > 'V' ORDER BY `transaction`;";

                $stmtLookup = $pdo->prepare($sqlLookup);

                $stmtLookup->execute();

                $sql = 'UPDATE `purchases` SET `date`= :date WHERE `transaction` = :transaction;';

                $stmt = $pdo->prepare($sql);

                $trans = '';

                echo '<pre>';

                while($line = $stmtLookup->fetch(PDO::FETCH_ASSOC)) {

                                if ($line['transaction'] != $trans) {

                                                $trans = $line['transaction'];

                                                $year = rand(1990, date('Y'));

                                                $month = sprintf('%02d', rand(1,12));

                                                $day = sprintf('%02d', rand(1,28));

                                                $hour = sprintf('%02d', rand(0,23));

                                                $min = sprintf('%02d', rand(1,59));

                                                $sec = sprintf('%02d', rand(1,59));

                                                $date = sprintf('%4d-%02d-%02d %02d:%02d:%02d', $year, $month, $day, $hour, $min, $sec);

                                                $result = $stmt->execute(array('date' => $date, 'transaction' => $trans));

                                                echo 'RESULT: ', $result, ':', $trans, ':', $date, PHP_EOL;       }               }

                echo '</pre>';

                $pdo = NULL;

} catch (PDOException $e) {             echo $e->getMessage();

                                                                echo $e->getTraceAsString();  }

 

 

DELETE DATA VAN EEN TABEL

Bij een ON DELETE constraint

Gebruik standaard delete als er geen child rows zijn

Vindt eerst de ID van de parent en gebruik DELETE op de child table

Bij een ON CASCADE constraint

Delete de Parent en de Child wordt automatisch gedelete

 

Onderstaand wordt een rij gedelete

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$trans2delete = 'XYZ9999';  >>> voor het localiseren van de transaction

$prod2delete = 33; >>> voor het localiseren van de product_id

$pdo = new PDO($dsn, $user, $pass);

$sql = 'DELETE FROM `purchases` WHERE `transaction` = :trans2delete AND `product_id` = :prod2delete;';

$stmt = $pdo->prepare($sql);

$result = $stmt->execute(array('trans2delete' => $trans2delete, 'prod2delete' => $prod2delete));

echo 'RESULT: ', $result, PHP_EOL;

$pdo = NULL;

 

DELETE user + purchases waarbij de naam van de user bekend is.

constraint = ON DELETE RESTRICT laat geen updates toe. Verander het eerst in phpadmin> structures in ON CASCADE.

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$name2delete = 'Truman Capote';

$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); >>> geen try catch block

$sqlLookup = 'SELECT user_id FROM `users` WHERE `name` = :name'; >>> vindt de user_id

$stmtParent = $pdo->prepare($sqlLookup);

$stmtParent->execute(array('name' => $name2delete));  >>>vindt de rij

$lookup = $stmtParent->fetch(PDO::FETCH_ASSOC); >>> zet rij om in array(1) { ["user_id"]=> string(8) "00000XXX" }

if ($lookup && is_array($lookup) && count($lookup) > 0) {  >>> checkt als het wel bestaat

                $sqlPurchases = 'DELETE FROM `purchases` WHERE `user_id` = :userID'; >>> verwijderd eerst record van child

                $stmt = $pdo->prepare($sqlPurchases);

                $delete = $stmt->execute(array('userID' => $lookup['user_id']));

                echo 'PURCHASES DELETE RESULT: ', $delete, PHP_EOL;

                $sqlUsers = 'DELETE FROM `users` WHERE `user_id` = :userID';

                $stmt = $pdo->prepare($sqlUsers);

                $delete = $stmt->execute(array('userID' => $lookup['user_id']));

                echo '<br />USER DELETE RESULT: ', $delete, PHP_EOL; }

$pdo = NULL;

 

DELETE of user + purchases waar de usernaam bekend is

constraint = ON DELETE CASCADE

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$name2delete = 'Rogelio King';

$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

$sqlUsers = 'DELETE FROM `users` WHERE `name` = :name';

$stmt = $pdo->prepare($sqlUsers);

$delete = $stmt->execute(array('name' => $name2delete));

echo '<br />USER DELETE RESULT: ', $delete, PHP_EOL;

$pdo = NULL;

 

 

DATA LEZEN VAN MEERDERE TABELLEN

 

Maak een PDO object $pdo

Formuleer de SQL statement $sql using placeholders

Stuur de prepared statement naar de server: $stmt = $pdo->prepare($sql)

Voer de statement uit met de waarden: $stmt->execute(array(val1, val2, etc))

Zet het resultaat om in een array: foreach ($stmt->(PDO::FETCH_ASSOC)as $row){}

Bij meer dan twee tabellen gebruik je de Join statement:

Use SELECT … FROM table1

JOIN table2 ON condition1

JOIN tableN ON conditionN etc

 

Bij meerdere tabellen wordt de SELECT statement toegepast met een JOIN

We gebruiken concatenate om de $sql statement leesbaar te maken. Kan ook op één lange regel zonder concatenate.

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

$sql = 'SELECT u.name, u.address, u.city, p.transaction, p.product_id, p.sale_price '

                 . 'FROM `users` AS u '

                 . 'JOIN `purchases` AS p '

                 . 'ON u.`user_id` = p.`user_id` '

                 . 'WHERE u.`name` = :name;';

$stmt = $pdo->prepare($sql);

$stmt->execute(array('name' => 'Lana Burns'));

echo '<pre>';

while($result = $stmt->fetch(PDO::FETCH_ASSOC)) {

                echo '<br />', var_dump($result), PHP_EOL;}

echo '</pre>';

$dbh = NULL;

 

De JOIN statement produceert heel veel duplicate data. Om dit tegen te gaan kan je werken met twee SELECT statements

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

$sql1 = 'SELECT u.user_id, u.name, u.address, u.city '

                 . 'FROM `users` AS u '

                 . 'WHERE u.`name` = :name;';

$stmt1 = $pdo->prepare($sql1);

$stmt1->execute(array('name' => 'Lana Burns'));

$result1 = $stmt1->fetch(PDO::FETCH_ASSOC);

$sql2 = 'SELECT p.transaction, p.product_id, p.sale_price '

                 . 'FROM `purchases` AS p '

                 . 'WHERE p.`user_id` = :userID;';

 

$stmt2 = $pdo->prepare($sql2);

$stmt2->execute(array('userID' => $result1['user_id']));

echo '<pre>';

echo '<br />', var_dump($result1), PHP_EOL;

while($result2 = $stmt2->fetch(PDO::FETCH_ASSOC)) {

                echo '<br />', var_dump($result2), PHP_EOL;}

echo '</pre>';

$dbh = NULL;

 

Hieronder wordt data gehaald uit drie tabellen. We gebruiken dus gewoon weer de JOIN statement.

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

$sql = 'SELECT u.`name`,p.`sku`,p.`title`,p.`price`,r.`transaction`,r.`quantity`,r.`sale_price` '

                 . 'FROM `users` AS u '

                 . 'JOIN `purchases` AS r '

                 . 'ON u.`user_id` = r.`user_id` '

                 . 'JOIN `products` AS p '

                 . 'ON r.`product_id` = p.`product_id` '

                 . 'WHERE u.`name` = :name '

                 . 'ORDER BY r.`transaction`;';

$stmt = $pdo->prepare($sql);

$stmt->execute(array('name' => 'Lana Burns'));

echo '<pre>';

while($result = $stmt->fetch(PDO::FETCH_ASSOC)) {

                echo '<br />', var_dump($result), PHP_EOL;}

echo '</pre>';

$dbh = NULL;

 

Het bovenstaande voorbeeld geeft een vrij chaotisch beeld van zaken. Als we het allemaal netjes in een array willen zonder teveel duplicate information, moeten we de display aanpassen zoals hier beneden.    

<?php

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

$sql = 'SELECT '

                 . 'u.`name`,'

                 . 'p.`sku`,p.`title`,p.`price`,'

                 . 'r.`transaction`,r.`quantity`,r.`sale_price` '

                 . 'FROM `users` AS u '

                 . 'JOIN `purchases` AS r '

                 . 'ON u.`user_id` = r.`user_id` '

                 . 'JOIN `products` AS p '

                 . 'ON r.`product_id` = p.`product_id` '

                 . 'WHERE u.`name` = :name '

                 . 'ORDER BY r.`transaction`;';

try {        $stmt = $pdo->prepare($sql);

                $stmt->execute(array('name' => 'Lana Burns'));

                $first = TRUE;

                $name = 'Unknown';

                $oldTrans = '';

                while($result = $stmt->fetch(PDO::FETCH_ASSOC)) {

                                                if ($result && is_array($result) && count($result) > 0) {

                                                                if ($first) {

                                                                $first = FALSE; >>> hierdoor wordt de if statement slechts een maal uitgevoerd

                                                                $name = $result['name'];

                                                                echo '<style>';

                                                                echo 'td { border: 1px solid gray; }';

                                                                echo 'th { border: 1px solid black; }';

                                                                echo 'table { width: 600px; }';

                                                                echo '</style>' . PHP_EOL;

                                                                echo "<h1>$name</h1><hr />\n";

                                                                echo '<table>';                    }

                                                                $trans = $result['transaction'];

                                                if ($trans != $oldTrans) {

                                                                echo '</table>';

                                                                echo "<br /><h3>Transaction: $trans</h3>\n";

                                                                echo '<table>';

                echo '<tr><th>Product</th><th>SKU</th><th>Price</th><th>Quantity</th><th>Sale Price</th></tr>' . PHP_EOL;

                                                                $oldTrans = $trans;} >>> maakt steeds een nieuwe table totdat er geen transacties meer zijn

                                                echo '<tr>';

                                                echo '<td align="right">' . $result['title'] . '</td>';

                                                echo '<td align="right">' . $result['sku'] . '</td>';

                                                echo '<td align="right">' . $result['price'] . '</td>';

                                                echo '<td align="right">' . $result['quantity'] . '</td>';

                                                echo '<td align="right">' . $result['sale_price'] . '</td>';

                                                echo '</tr>' . PHP_EOL;    }               }               }

catch (PDOException $e) {               echo $e->getMessage();

                                                                echo $e->getTraceAsString(); }

$dbh = NULL;

               

GEBRUIK VAN REGULAR EXPRESSIONS

 

Een regular expression gebruikt een set van voorafgespecificeerde symbolen om een string te beschrijven.

Het wordt gebruikt voor validatie van informatie die via een untrustworthy source binnenkomt, en ook voor het extraheren en filteren van data uit webdocumenten.

Valideren is het verifieren van data als het voldoen aan het verwachte formaat en regels.

Ereg*, mb_ereg*, en preg* zijn de regular expressions voor PHP extensies. Preg wordt tegenwoordig gebruikt.

Om preg* met multi-byte strings te gebruiken moet er je het einde van het patroon een u modifier toevoegen.

Multibyte strings gebruiken meer dan een byte voor sommige characters vb zijn Chinees, Thai, Arabisch etc.

Preg* geeft een performance letdown (latency). Als je het character type kent kan je een ctype* family gebruiken, en als het character die je zoekt niet veranderd kan je strops() en stripos() gebruiken.

 

DEFINING BASIC PATTERNS

Een patern is een string die gebruikt word tom een string te beschrijven

Je definieert een pattern om PHP te vertellen wat je zoekt.

/word/ or/word/i vindt een woord in een zin (i staat voor case insensitive)

/wordt1|word2|word3|etec vind meerdere woorden in een zin (| staat voor or)

/^beginning/ zoekt een pattern vanaf het ^begin of /ending$/ zoekt een pattern vanaf het eind$.

/^…$/ betekent dat alleen en precies de gespecificeerde characters worden gezocht, niets meer

/international/u

/jpg$/i zoekt naar een *.jpg file of *.JPG file

/^man$/ betekent dat alleen man een match maakt dus human, romantic, jungerman etc matchen niet

/[A-Z]/ vindt letters

[0-9]/ of /\d/ vindt nummers

/w/ vindt letters en/of nummers

{N}/ = precies N

{N, M} = tussen N en M characters

* = 0 of meer

? = 0 of 1 

()? = wat tussen haakjes staat is optioneel

+ = meer dan 0

/multibytecharacters/u  de u maakt het mogelijk om het te testen

 

GEBRUIK REGULAR EXPRESSIONS

Preg_match() wordt gebruikt voor het valideren of verifieren van informatie van complexe aard zoals

Valideren van postal code of telefoon nummers

Preg_match(“/pattern/”, $string) returns T (TRUE) of F (FAIL) en stopt na de eerste match

Werkwijze: Bepaal de natuur van de data en de regels

Construeer de juiste pattern

If (preg_match(“/pattern/”,$user_da nta)){//code if match;} else {//code if no match;}

 

GEBRUIK REGULAR EXPRESSIONS VOOR FORM VALIDATIE

 

<?php

Validatie van een huis number

$pattern = '/^(\w|\s){1,16}$/'; >>> dit patron checkt  1 to 16 letters, numbers or spaces

$testArray = array('1100', '<bad>House Number</bad>', 'Basement Left', '39 Top Right'); >>> de test data

echo "<pre><br /><b>$pattern</b><br />\n";

foreach ($testArray as $item) {

                echo htmlspecialchars($item), ' [';

                if (preg_match($pattern, $item)) { echo 'OK'; }

else {  echo 'NOT OK';        }

                echo ']', PHP_EOL;}

echo "</pre>\n";

 

<?php

// boolean preg_match(pattern, string)

validating a Canadian postal code

$pattern = '/^[A-Z][0-9][A-Z]\s[0-9][A-Z][0-9]$/i'; >>>letter-number-letter <space> number-letter-number

$testArray = array('M5K 1A1', 'AB11 6EW', '14609-1234', 'H2Y 1Z7', '10001');

echo "<pre><br /><b>$pattern</b><br />\n";

foreach ($testArray as $item) { echo $item, ' [';

                if (preg_match($pattern, $item)) {echo 'OK';}

                else {echo 'NOT OK';}

                echo ']', PHP_EOL;}

echo "</pre>\n";

 

<?php

boolean preg_match(pattern, string)

$pattern = '/^\d{5}(-\d{4})?$/i'; >>> nnnnn-nnnn (where the last "-nnnn" is optional)

$testArray = array('M5K 1A1', 'AB11 6EW', '14609-1234', 'H2Y 1Z7', '10001');

echo "<pre><br /><b>$pattern</b><br />\n";

foreach ($testArray as $item) { echo $item, ' [';

                if (preg_match($pattern, $item)) {echo 'OK';}

else {      echo 'NOT OK';    }

                echo ']', PHP_EOL; }

echo "</pre>\n";

 

validating an address and postal code from a web form

huisnummer = total of 16 alpha numeric characters or spaces

validate postal code = letter-number-letter <space> number-letter-number or nnnnn-nnnn

 

<?php

$houseNumber = 'Number'; >>> default waarde

$postalCode = 'A9A 9A9';  >>>default waarde

$validHouseNo = '<b style="color: red;">House number must only contain letters, numbers or punctuation!</b>';

$validPostCode = '<b style="color: red;">Postal code must be in the form A9A 9A9 or 99999-9999!</b>';

$_GET[] >>> haalt data op van de form op een website’s url

if (isset($_GET['houseNumber'])) {$houseNumber = $_GET['houseNumber'];}

if (isset($_GET['postalCode'])) {      $postalCode = $_GET['postalCode']; }

if (preg_match('/^(\w|\s){1,16}$/', $houseNumber)) {

                $validHouseNo = '<b style="color: green;">House number validates OK!</b>'; }

//onderstaand test zowel de US als de Canadian postal code format

if (preg_match('/^[A-Z][0-9][A-Z]\s[0-9][A-Z][0-9]$/i', $postalCode)

|| preg_match('/^\d{5}(-\d{4})?$/i', $postalCode)) {

                $validPostCode = '<b style="color: green;">Postal code validates OK!</b>';}

?>

 

<!-- // display the form -->

<form>

<br /><input type="TEXT" name="houseNumber" size=16 maxlength=16  value="

<?php echo htmlspecialchars($houseNumber); ?>"/>

<br /><?php echo $validHouseNo; ?>

<br />

<br /><input type="TEXT" name="postalCode" size=10 maxlength=10  value="<?php echo htmlspecialchars($postalCode); ?>"/>

<br /><?php echo $validPostCode; ?>

<br />

<br /><input type="SUBMIT" />

</form>

 

PREGMATCH ALL

 

PREG_MATCH_ALL vindt alle matches met de gezochte pattern anders dan PREG_MATCH die slechts de eerste vindt

Het is erg handig bij het zoeken naar informatie op een website

preg_match_all(pattern, string, matches)

TRUE als tenminste een match gevonden is

matches toont een array van alle mogelijke matches

Onderstaand word in een html document gezocht naar links

".*?"  >>> het minimale aantal nummers of characters die de pattern vinden

 

<?php

$pattern = '/<a .*?>/i'; >>> gezochte patroon

$string = file_get_contents('http://www.unlikelysource.com/smiling_jack/'); >>> website

preg_match($pattern, $string, $matches);

echo '<b>preg_match()</b>';

echo '<pre>';

echo '<br /><b>PATTERN:</b> ', htmlspecialchars($pattern);

echo '<br /><b>RESULT:</b> ', htmlentities(var_export($matches, TRUE));

echo '</pre>';

preg_match_all($pattern, $string, $matches);

echo '<b>preg_match_all()</b>';

echo '<pre>';

echo '<br /><b>PATTERN:</b> ', htmlspecialchars($pattern);

echo '<br /><b>RESULT:</b> ', htmlentities(var_export($matches, TRUE));

echo '</pre>';

 

Zoekt naar links in een html document

() formuleert een sub-patroon of sub-groep

<?php

$pattern = '/<a .*?href=(".*?")>/i';

$string = file_get_contents('http://www.unlikelysource.com/smiling_jack/');

preg_match_all($pattern, $string, $matches);

echo '<b>preg_match_all()</b>';

echo '<pre>';

echo '<br /><b>PATTERN:</b> ', htmlspecialchars($pattern);

echo '<br /><b>RESULT:</b> ', htmlentities(var_export($matches, TRUE));

echo '</pre>';

 

PREG MATCH INTELLEGENT SEARCH AND REPLACE PREG_REPLACE

 

preg_replace(search_pattern, replacement, string)

resulteert in een string met replacements ingevuld voor search_pattern

voorbeeld voor reformatting using preg_replace(). Hier wordt de datum die wordt ingetypt verandert in een ander format

strip_tags() verwijderd extraneous HTML tags (malicious data) voor security

the date() command produceert een datum

 

if (isset($_GET['date'])) {  $date = strip_tags($_GET['date']);}

else {      $date = date('m/d/Y');}

$pattern = '|(\d+)/(\d+)/(\d+)|'; >>> vertegenwoordigt subpatterns $1, $2 en $3

$replace = '$3-$1-$2'; >>>hier ga je de volgorde veranderen

$result = preg_replace($pattern, $replace, $date);

 

?>

<!-- // display the form -->

Try typing this:

<br />

12/31/1962

<form>

<br /><input name="date" size=16 maxlength=16 value="<?php echo $date; ?>"/>

<br /><input type="SUBMIT" />

</form>

<i>This is what will get stored in the database:</i>

<br />

<?php echo htmlspecialchars($result); ?>

 

<?php

Gebruiker typt krasse taal en het programma gebruikt preg_replace() om de krasse woorden met nettere te vervangen

if (isset($_GET['comments'])) { $comments = strip_tags($_GET['comments']);

} else {    $comments = '';}

$search = array('/heck/i', '/dastardly/i', '/blinking/i', '/stinking/i', '/idiot/');

Onderstaand de lijst van aanpassingen die je wilt in de volgorde van de te vervangen woorden

$replace = array('blue blazes', 'mean hearted', 'bad smelling', 'inwardly oriented', 'intellectually challenged individual');

 

// sanatize comments

$result = preg_replace($search, $replace, $comments);

?>

<!-- // display the form -->

Try typing this:

<br />

You blinking, stinking, dastardly idiot!  What in heck do you think you're doing?

<form>

<br /><textarea name="comments" rows=4 cols=60 ><?php echo htmlspecialchars($comments); ?></textarea>

<br /><input type="SUBMIT" />

</form>

<i>This is what will get displayed:</i>

<br />

<?php echo htmlspecialchars($result); ?>

 

EMAIL

 

E-MAILS STUREN MET MAIL

 

Een van de belangrijkste manieren om customers contact met je te laten maken is via Email forms

Email wordt ook gebruikt om een nieuwe gebruiker te bevestigen die wil registreren voor jouw website.

De PHP mail() command eist dat de OS een sendmail binary heeft

Sendmail is een programma dat mail via het internet stuurt. De meeste web hosting providers hebben sendmail die je PHP website kan gebruiken. Om Email te sturen vanaf je local development environment moet je eerst sendmail of een equivalent programma installeren. De PHP mail() commando is deel van de PHP core, en is de belangrijkste manier waarop je Email stuur met PHP.

mail($to, $subject, $mefsage, $additionalHeaders)

Voor meerdere ontvangers, scheidt je de Emailaddressen met commas.

Veel voorkomende additionele headers zijn From, CC en BCC

Gebruik ze om …

Je moet altijd twee headers toevoegen een voor het MIME type, en een ander voor het Content type

 

<?php

Je moet een Email Server installeren

Om je Email programmas te testen moet je een testsendmail programma configureren

Open in the /path/to/xampp/php/php.ini file

Zoek sendmail_path parameter

Gebruik het sendmail program welke past bij jouw systeem

Gebruik sendmail of sendmail.bat geboden in de working files area voor dit hoofdstuk

 

Bij het opstellen van een simple form:

Typisch wil je een “From” header en eventueel “CC” en “BCC” headers toevoegen

Hierbij maak je gebruik van concatenate  ".="  en alle headers behalve de laatste eindigen met  "\r\n"

"X-Mailer: PHP/xxx" gebruik je aan het eind van de laatste header, om de Email server te vertellen dat de mail van een PHP programma komt en phpversion plaatst de huidige versie van PHP.

Bv.

$to = ‘john_sno@hotmail.com’;

$subject = 'Simple Send Test Message Subject Line';

$message = 'Simple send test message body.';

$headers = 'From: ‘john@iemsabi.com’' . "\r\n";

$headers .= 'CC: yodea2000@iemsabi.com  ' . "\r\n";

$headers .= 'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers); >>>stuurt de mail met het mail() commando

 

Bij het sturen van mail naar meerdere ontvangers kan je gewoon een comma plaatsen tussen de Email addressen. Gebruik een if statement om te checken als de mail succesvol verzonden is.  Zodoende kan je de website users laten weten als er een probleem is.

 

<?php

 

$to = 'test@unlikelysource.com, test3@unlikelysource.com';

$subject = 'Test Message Multiple Senders Subject Line';

$message = 'Test message multiple senders body.';

$headers = 'From: ‘john@iemsabi.com’' . "\r\n"

                                 . 'X-Mailer: PHP/' . phpversion();

if (mail($to, $subject, $message, $headers)) { echo 'OK';}

else { echo 'Problem'; }

 

Typisch wil je een “From” header en eventueel “CC” en “BCC” headers toevoegen

Hierbij maak je gebruik van concatenate en alle headers behalve de laatste eindigen met  "\r\n"

Met een if statement kan je checken als de mail gestuurd is.

<?php

$to = ‘john_sno@hotmail.com’;

$subject = 'Test Message With CC and BCC Subject Line';

$message = 'Test message body with CC and BCC';

 

$headers = 'From: ‘john@iemsabi.com’' . "\r\n";

$headers .= 'CC: yodea2000@iemsabi.com  ' . "\r\n";

$headers .= 'BCC: yodea2000@iemsabi.com  '  . "\r\n";

$headers .= 'X-Mailer: PHP/' . phpversion();

 

if (mail($to, $subject, $message, $headers)) {echo 'OK';}

else {echo 'Problem';}

 

HTML Emails hebben grafisch meer mogelijkheden. Om ze te kunnen verzenden moet je eerst de MIME type en Content type headers instellen.

<?php

$to = ‘john_sno@hotmail.com’;

$subject = 'HTML Email Test Message Subject Line';

// Notice that there are HTML tags in this message body

$message = '<h1>HTML Test</h1><hr /><p><i>HTML email test message body.</p></i>';

 

// To send HTML email, add these two headers:

$headers  = 'MIME-Version: 1.0' . "\r\n";

$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

 

// the rest of the additional headers are like the earlier examples

$headers .= 'From: ‘john@iemsabi.com’' . "\r\n";

$headers .= 'CC: yodea2000@iemsabi.com  ' . "\r\n";

$headers .= 'BCC: yodea2000@iemsabi.com  '  . "\r\n";

$headers .= 'X-Mailer: PHP/' . phpversion();

 

if (mail($to, $subject, $message, $headers)) { echo 'OK';}

else {echo 'Problem'; }

 

 

GEBRUIK VAN EXTERNAL MAIL LIBRARIES

 

External mail libraries zijn geen onderdeel van de core en moeten gedownload worden van verschillende bronnen.  External libraries zijn essentieel bij het ontwikkelen van jouw website als je special features wilt gaan gebruiken. De meeste external libraries hebben een open source license en zijn gratis. Enkele zijn PHPMailer, swiftmailer en PEAR libraries. De verschillende PHP frameworks zoals Zend Framework, Code Igniter and cakephp hebben allen Email libraries geincorporeerd

Je moet je library downloaden en het pad aangeven in include_path in php.ini > gebruik dan set_include_path() om het pad in te stellen als je PHP programma loopt.

1.    Download from https://github.com/Synchro/PHPMailer

2.    Unzip into a directory

3.    Make sure this directory is in the php.ini "indude_path"

 

1.    require_once("/path/to/phpmailer/class.phpmailer.php")

2.    $mail = new PHPMailer();

3.    Gebruik de gewenste $mail->xxx() commando zoals $mail->SetFrom()

 

phpmailer setup:

 1. Download vanaf https://github.com/Synchro/PHPMailer

 2. Unzip in een directory

 3. zorg ervoor dat deze directory is geregistreerd in de php.ini "include_path"

 

Onderstaand stuurt John Sno john@iemsabi.com een file “contents.html” als html Email naar mr. John Sno  john_sno@hotmail.com . In de subject line kom “PHPMailer Test Subject Basic Send”. Als mr. John Sno geen html heeft, ontvangt hij een message dat hij een html compatible viewer moet gebruiken.

<?php

 

$includePath = get_include_path();

set_include_path('./PHPMailer' . PATH_SEPARATOR . $includePath);

require_once('./PHPMailer/class.phpmailer.php');

$mail = new PHPMailer();

 

$body = file_get_contents('./PHPMailer/examples/contents.html');

$mail->SetFrom('‘john@iemsabi.com’', ‘John Sno’);

$mail->AddAddress(‘john_sno@hotmail.com’, 'mr. John Sno');

$mail->Subject = 'PHPMailer Test Subject Basic Send';

$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';

$mail->MsgHTML($body); >>> body als een html header

if(!$mail->Send()) {  $status = 'Mailer Error: ' . $mail->ErrorInfo;}

else {  $status = 'Message sent!';}

?>

<html>

<head>

<title>PHPMailer Test Subject Basic Send</title>

</head>

<body>

<h1>PHPMailer Test Subject Basic Send</h1>

<hr />

<h3>STATUS:</h3>

<?php echo $status; ?>

</body>

</html>

 

In het onderstaande voorbeeld worden een CC, BCC, and Reply To toegevoegd.

 

<?php

 

$includePath = get_include_path();

set_include_path('./PHPMailer' . PATH_SEPARATOR . $includePath);

require_once('./PHPMailer/class.phpmailer.php');

$mail = new PHPMailer();

 

$body = file_get_contents('./PHPMailer/examples/contents.html');

$mail->SetFrom('‘john@iemsabi.com’', 'Doug Bierer');

$mail->AddAddress(‘john_sno@hotmail.com’, 'Test User');

$mail->Subject = 'PHPMailer Test Subject via mail(), basic';

 

$mail->AddCC('yodea2000@gmail.com');

$mail->AddBCC('yodea2000@iemsabi.com  ');

$mail->AddReplyTo('‘john@iemsabi.com’');

 

$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';

$mail->MsgHTML($body);

 

if(!$mail->Send()) { $status = 'Mailer Error: ' . $mail->ErrorInfo;}

else {  $status = 'Message sent!';}

?>

<html>

<head>

<title>PHPMailer Test Subject CC, BCC, etc.</title>

</head>

<body>

<h1>PHPMailer Test Subject CC, BCC, etc.</h1>

<hr />

<h3>STATUS:</h3>

<?php echo $status; ?>

</body>

</html>

 

EEN ATTACHMENT TOEVOEGEN AAN MAIL

 

Een attachment is alles dat je toevoegt aan een Email zoals fotos, pdf files, documenten etc.

Je zal attachments nodig hebben als je users additionele informatie zoals forms in pdf format wilt sturen, of gewoon om je mail te illustreren.

Het is veel gemakkelijker om mail met een attachment te sturen als je gebruik maakt van een external library zoals phpmailer.php >>>PHPMailer: require_once("./PHPMailer/class.phpmailer.php")

 

In onderstaand voorbeeld wordt met AddAttachment() een attachment toegevoegd aan Email

Er is een TRUE parameter gebruikt om een exception te gooien als er errors zijn

 

<?php

$includePath = get_include_path();

set_include_path('./PHPMailer' . PATH_SEPARATOR . $includePath);

require_once('./PHPMailer/class.phpmailer.php');

$mail = new PHPMailer(TRUE);

 

try {

  $mail->AddAddress(‘john_sno@hotmail.com’, 'Test User');

  $mail->SetFrom('‘john@iemsabi.com’', 'Doug Bierer');

  $mail->Subject = 'PHPMailer Test Subject Adding Attachment';

  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';

  $mail->MsgHTML(file_get_contents('./PHPMailer/examples/contents.html'));

    $mail->AddAttachment('further_indications.jpg');     

  $mail->Send();

  $status = "Message Sent OK</p>\n";}

catch (phpmailerException $e) {  $status = $e->errorMessage(); }

catch (Exception $e) { $status = $e->getMessage()}; //>>>is toegevoegd ingeval de error geen PHPMailer Exception is

?>

<html>

<head>

<title>PHPMailer - Sending an Attachment</title>

</head>

<body>

<h1>PHPMailer - Sending an Attachment</h1>

<hr />

<h3>STATUS:</h3>

<?php echo $status; ?>

</body>

</html>

 

Hieronder voegen we een attachment toe zonder gebruik te maken van een external library

 

<?php

$msgTo      = ‘john_sno@hotmail.com’;

$msgSubject = 'Test Attachment Using Only PHP mail()';

$msgBody           = 'Test attachment using only php mail()';

$fnShort              = 'further_indications.jpg';

$fileName           = __DIR__ . DIRECTORY_SEPARATOR . $fnShort;

$num                    = md5(time());

 

$headers = 'From: ‘john@iemsabi.com’' . "\r\n";

$headers .= 'MIME-Version: 1.0' . "\r\n";

$file        = file_get_contents($fileName);

$file        = chunk_split(base64_encode($file));

$headers .= "Content-Type: multipart/mixed; boundary=------".$num."\r\n";

$headers .= "\r\n";

$headers .= "This is a multi-part message in MIME format.\r\n";

$headers .= "--------" . $num . "\r\n";

$headers .= "Message-ID: <" . sha1(microtime()) . "@".$_SERVER['SERVER_NAME'].">\r\n";

$headers .= "X-Mailer: PHP v".phpversion()."\r\n";        

$headers .= "Content-Type: text/html; charset=iso-8859-1; format=flowed\r\n";

$headers .= "Content-Transfer-Encoding: 8bit\r\n";

$headers .= "<html><body>";

$headers .= "" . $msgBody . "\n";

$headers .= "</body></html>";

$headers .= "--------" . $num . "\r\n";

$headers .= "Content-Type: image/jpeg name=\"$fnShort\"r\n";

$headers .= "Content-Transfer-Encoding: base64\r\n";

$headers .= "Content-Disposition: attachment; filename=\"$fnShort\"\r\n\n";

$headers .= "" . $file . "\r\n";

$headers .= "--------" . $num . "--";

 

if (mail($msgTo, $msgSubject, $msgBody, $headers)) {  echo 'OK';}

else {     echo 'Problem';}

 

MAILS STUREN MET SMTP

 

SMTP = Simple Mail Transport Protocol

SMTP is algemeen beschikbaar bij de meeste web hosting providers, en is veel secuurden dan gebruik van sendmail alleen. Het is aangeraden dat je een external library zoals PHPMailer gebruikt. Op het PHPMailer Object $mail, geef je het

$mail->isSMTP() commando en dan configureer je de nodige parameters als vereist door je SMTP server.

 

Hier wordt PHPMailer gebruikt met SMTP

<?php

 

require_once('./PHPMailer/class.phpmailer.php');

$mail             = new PHPMailer();

$mail->AddAddress(‘john_sno@hotmail.com’, 'Test User');

$mail->SetFrom('‘john@iemsabi.com’', 'John Sno');

 

$body                   = file_get_contents('./PHPMailer/examples/contents.html');

$mail->Subject                  = 'PHPMailer Test Subject via SMTP';

$mail->MsgHTML($body);

$mail->AddAttachment('./PHPMailer/examples/images/phpmailer.gif');      // attachment

$mail->AddAttachment('./PHPMailer/examples/images/phpmailer_mini.gif'); // attachment

 

$mail->IsSMTP(); // >>> commando om SMTP te gebruiken

$mail->SMTPDebug  = 1;    //>>> activeert SMTP debug information ( 1 = errors and messages, 2 = messages only)                                           

$mail->SMTPAuth   = true;   // >>> activeert SMTP authentication

$mail->CharSet   = 'utf-8'; //>>>character encoding

$mail->Secure     = 'tls';  // >>>stelt security transport in op transport layer security ( kan ook op"ssl")

$mail->Host       = 'smtp.iemsabi.com';    //>>>stelt de SMTP server in

$mail->Port       = 587;     //>>>SMTP "tls" port. Volg hierbij instructies van de provider

$mail->Username   = '‘john@iemsabi.com’'; // >>>SMTP account username

$mail->Password   = 'password';        //>>> SMTP account password

 

if ($mail->Send()) { $status = 'Message sent!';}

else {$status = 'PROBLEM!'; }

?>

<html>

<head>

<title>PHPMailer - SMTP basic test</title>

</head>

<body>

<h1>PHPMailer - SMTP basic test</h1>

<hr />

<h3>STATUS: </h3>

<?php echo $status; ?>

</body>

</html>

 

WERKEN MET DATUM EN TIJD

TIMESTAMP

 

Timestamp komt van Unix en vertegenwoordigd het aantal seconden since 12:00 January 1970 GMT

Het wordt vaak gebruikt om datum en tijd-informatie op te slaan in een database

Gebruik: time(), mktime() of strtotime() opdrachten

Relative formats behelsen dag namen, nummers, ordinality (first, third etc), relative (next, last) en units (hour, day, month)

 

<?php

time() returns the number of seconds since 1-1-1970

 

echo '<br />Current Timestamp: ', time();

date(format_string, timestamp)

format_string:

l = full name of the day of the week

d = 2 digit day of the month

F = full name of the month

Y = 4 digit year

echo '<br />Date of Timestamp 1: ', date('l, d F Y', 1);

echo '<br />Today\'s Date: ', date('l, d F Y', time());

 

 

Working with Date and Time: Understanding Timestamps

mktime(hour, min, sec, month, day, year) returns the equivalent timestamp

generates a timestamp for 10 January 2013 at midnight

$timeStamp = mktime(0, 0, 0, 1, 10, 2013);

echo '<br />Timestamp for 10 January 2013 at midnight: ', $timeStamp;

date(format_string, timestamp)

 format_string:

 l = full name of the day of the week

 d = 2 digit day of the month

 F = full name of the month

 Y = 4 digit year

echo '<br />Date of Timestamp: ', date('l, d F Y', $timeStamp);

 

strtotime(date_string) returns the equivalent timestamp

Je kan een fixed date gebruiken.

timestamp for 1 January 2013

$timeStamp1 = strtotime('2013-01-01');

echo '<br />Timestamp for 2013-01-01: ', $timeStamp1;

$timeStamp2 = strtotime('01 Jan 2013');

echo '<br />Timestamp for 01 Jan 2013: ', $timeStamp2;

echo '<br />';

 of je kan een relatieve datum gebruiken

http://www.php.net/manual/en/datetime.formats.relative.php heeft meer over relatieve data

 

$timeStamp = strtotime('first Monday January 2013'); >>> genereert een timestamp voor 1st Monday in January 2013

echo '<br />Timestamp for the 1st Monday in 2013: ', $timeStamp;

echo '<br />Date for the timestamp: ', date('l, F jS, Y', $timeStamp);

echo '<br />';

 

$timeStamp = strtotime('yesterday');  //>>> genereert een timestamp voor gisteren

echo '<br />Timestamp for yesterday: ', $timeStamp;

echo '<br />Date for the timestamp: ', date('l, F jS, Y', $timeStamp);

echo '<br />';

 

echo '<br />Third Thursday of Each Month in 2013:'; // >>> genereert een timestamp voor de derde donderdag van 2013

for($x = 1; $x <= 12; $x++) {$dateString = sprintf('third thu 2013-%02d-01', $x);

                $timeStamp = strtotime($dateString);

                echo '<br />', date('l, F jS, Y', $timeStamp);          }

 

 

DATE COMMAND

 

Date command wordt gebruikt om een datum te genereren in de vorm van een string van een timestamp

Het wordt gebruikt om data te tonen aan de website users

De date format string is veelal als een format string die printf() gebruikt.

Er zijn format letters die deel van datum of tijd

Y = 4 digit year m = 2 digit month, d = 2 digit day, H = 24 hour, I = minutes, s = seconds

 

Working with Date and Time: Using the date() Command

Meer informatie over de date() command op http://php.net/manual/en/function.date.php

syntax: date(format_string [,timestamp])

if no timestamp, uses current time (i.e. time())

 

<?php

echo '<table width=60%>';

printf('<tr><th>Day</th><td>%s</td>',               date('l'));

printf('<tr><th>Month</th><td>%s</td>', date('F (M)'));

printf('<tr><th>Year</th><td>%s</td>',              date('Y'));

printf('<tr><th>h:i A</th><td>%s</td>', date('h:i A'));

 

printf('<tr><th>m/d/y</th><td>%s</td>',                          date('m/d/y'));

printf('<tr><th>d M Y</th><td>%s</td>',                           date('d M Y'));

printf('<tr><th>Y-m-d H:i:s</th><td>%s</td>',                 date('Y-m-d H:i:s'));

printf('<tr><th>l, d F Y h:i A</th><td>%s</td>',date('l, d F Y h:i A'));

 

echo '</table>';

 

DATE TIME CLASS

 

De DateTime class is een standard PHP extensie

Het incorporeert de verschillende time classes in een enkele class

De DateTime class is handig als je object oriented programming gebruikt

Het laat date arithmetic toe zonder dat je de minute, huren, dagen en weken hoeft te calculeren.

$date = new DateTime(“date_string”) of $date->setTimestamp(timestamp)

Data capture kan je in een web form doen als je aparte velden voor year, month en day etc. gebruikt

 

 

 

 

DATE ARITHMETIC

 

Date arithmetic houdt in het optellen of delen van tijdsperiodes naar of van een gegeven datum

DateInterval en DateTime classes bieden een gemakkelijke manier om te achterhalen hoeveel dagen, weken, maanden af te trekken.

Date arithmetic is handig wanneer je de exacte datum moet uitvissen met het gegeven van dagen of weken in de toekomst

1.       Bouw een timestamp die de date vertegenwoordigd

2.       Date (“I”,$timestamp)

 

DATE CAPTURE OF BIRTH GEBRUIKMAKEND VAN DATETIME

 

Je kan direct met timestamps werken maar je moet de seconden calculeren

<?php

echo '<table width=60%>';

$secondsInHour = 60 * 60; // >>> berekend het aantal seconden in een uur

echo '<tr><th>Today</th><td>',                date('l, d F Y h:i A'), '</td></tr>';

echo '<tr><th>+1 Hour</th><td>',  date('l, d F Y h:i A', time() + $secondsInHour), '</td></tr>';

echo '<tr><th>+6 Hours</th><td>', date('l, d F Y h:i A', time() + $secondsInHour * 6), '</td></tr>';

echo '<tr><th>-4 Hours</th><td>', date('l, d F Y h:i A', time() - $secondsInHour * 4), '</td></tr>';

echo '<tr><td colspan=2><hr /></td></tr>';

 

$secondsInDay = 60 * 60 * 24;    // >>> calculeert het aantal seconden in een dag

echo '<tr><th>Today</th><td>',               date('l, d F Y h:i A'), '</td></tr>';

echo '<tr><th>+1 Day</th><td>',  date('l, d F Y h:i A', time() + $secondsInDay), '</td></tr>';

echo '<tr><th>+6 Days</th><td>', date('l, d F Y h:i A', time() + $secondsInDay * 6), '</td></tr>';

echo '<tr><th>-4 Days</th><td>', date('l, d F Y h:i A', time() - $secondsInDay * 4), '</td></tr>';

echo '<tr><td colspan=2><hr /></td></tr>';

 

$secondsInWeek = 60 * 60 * 24 * 7;         // >>> calculeert het aantal seconden in een week

echo '<tr><th>Today</th><td>',                date('l, d F Y h:i A'), '</td></tr>';

echo '<tr><th>+1 Week</th><td>',  date('l, d F Y h:i A', time() + $secondsInWeek), '</td></tr>';

echo '<tr><th>+6 Weeks</th><td>', date('l, d F Y h:i A', time() + $secondsInWeek * 6), '</td></tr>';

echo '<tr><th>-4 Weeks</th><td>', date('l, d F Y h:i A', time() - $secondsInWeek * 4), '</td></tr>';

 

echo '</table>';

 

<?php

Voor informatie over intervals: http://php.net/manual/en/dateinterval.construct.php

Je kan ook DateTime::add() en sub() gebruiken

 

echo '<table width=60%>';

$date = new DateTime();

echo '<tr><th>Today</th><td>', $date->format('l, d F Y h:i A'), '</td></tr>';

 

$interval = new DateInterval('P1W'); // >>> creeert intervallen en telt een week op P=period, W=week

 

$date->add($interval);

echo '<tr><th>+1 Week</th><td>', $date->format('l, d F Y h:i A'), '</td></tr>';

 

$interval = new DateInterval('P3M2D'); // >>> trekt 3 maanden en 2 dagen af.  P = period; M = month; D = day

$date->sub($interval);

echo '<tr><th>-3 months 2 days</th><td>', $date->format('l, d F Y h:i A'), '</td></tr>';

 

echo '</table>';

 

De dag uit een gegeven datum halen. ‘l’ staat voor lowercase

<?php

 

$date = new DateTime('28 March 2013');

 

echo '<br />Using DateTime:';

echo '<br />Day of Week for 28 March 2013: ', $date->format('l');

 

$timeStamp = strtotime('28 March 2013');

echo '<br />Using date():';

echo '<br />Day of Week for 28 March 2013: ', date('l', $timeStamp);

 

 

DateTime class gebruiken. Data info halen van verschillende velden in een webform. De huidige datum tonen.

Eerst halen we uit de form het jaar in int data type voor security en de option van het huidige jaar met

$nowDate->format('Y') zo ok de maand en de dag.

<?php

$nowDate = new DateTime();

 

$year = isset($_GET['year']) ? (int) $_GET['year'] : $nowDate->format('Y');

$month = isset($_GET['month']) ? strtolower($_GET['month']) : $nowDate->format('M');

if (strlen($month) != 3) {$month = $nowDate->format('M');}

elseif (!ctype_alpha($month)) {$month = $nowDate->format('M'); }

$day = isset($_GET['day']) ? (int) $_GET['day'] : $nowDate->format('d');

 

$userDate = new DateTime(sprintf('%4d %3s %4d', $day, $month, $year));

$curDate = $userDate->format('l, d M Y');

 

// onderstaand wordt de datum 6 weken van de huidige datum bepaald

$interval = new DateInterval('P6W');

$userDate->add($interval);

$newDate = $userDate->format('l, d M Y');

 

?>

<!DOCTYPE html>

<head>

                <title>Date Arithmetic</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>

 

<body>

<form>

                <table width=60%>

                                <tr>

                                                <th>Year</th><td><input type=text name="year" size=4 maxlength=4 /></td>

                                                <th>Month</th>

                                                                <td>

                                                                                <select name="month">

                                                                                                <option>Jan</option>

                                                                                                <option>Feb</option>

                                                                                                <option>Mar</option>

                                                                                                <option>Apr</option>

                                                                                                <option>May</option>

                                                                                                <option>Jun</option>

                                                                                                <option>Jul</option>

                                                                                                <option>Aug</option>

                                                                                                <option>Sep</option>

                                                                                                <option>Oct</option>

                                                                                                <option>Nov</option>

                                                                                                <option>Dec</option>

                                                                                </select>

                                                                </td>

                                                <th>Day</th><td><input type=text name="day" size=2 maxlength=2 /></td>

                                                <td><input type=submit /></td>

                                </tr>

                </table>

</form>              

<p>

                <b>USER DATE: </b><?php echo $curDate; ?>

                <br />

                You have until this date: <?php echo $newDate; ?>

                <br />

                to submit all the required information!

                <br />

                (6 weeks from the USER DATE)

</p>

</body>

 

</html>

 

WEB OPERATIONS

GLOBAL VARIABLES

 

Inbound information komt van de browser, een smartphone of een gebruiker die jouw website bezoekt.

$_*Globals zijn associative arrays, die automatisch gecreerd en gepopuleerd worden door de PHP engine.

$_GET, $_POST, $_COOKIE, $_REQUEST, $_SESSION, $_SERVER, $_ENV zijn enkele $*Globals

$_GET = user data in de URL

$POST = data van een form gepost door een user

$_COOKIE = data van cookies opgeslagen door de browser

$_SESSION = data namens de user opgeslagen op de server

$_SERVER = inkomende HTTP header information

$_ENV = information welke ontstaat in de OS van je webserver

phpinfo(INFO_VARIABLES); toont de inhoud van de $*Globals

 

 

<?php

setcookie(name, value, expiration time, path)

setcookie('name_from_cookie', 'NAME', time() + 3600, '/');

?>

<!DOCTYPE html>

<head>

                <title>$_* Globals</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head><body>

                                <h1>$_* Globals</h1>

                                <h3>GET</h3>

                                <form name="getForm" method="GET">

                                                <input type="text" name="name_from_get" />

                                                <input type="submit" />             

                                </form>              

                                <h3>POST</h3>

                                <form name="postForm" method="POST">

                                                <input type="text" name="name_from_post" />

                                                <input type="submit" />                             

                                </form>              

                                NOTE: $_REQUEST = $_GET + $_POST + $_COOKIE

                                <?php phpinfo(INFO_VARIABLES); ?>

</body></html>

 

 

COOKIES

 

Een cookie heeft een naam en vertegenwoordigd informatie ingesteld in een header en opgeslagen op de user’s browser. Om de inhoud van cookes te zien gebruik de chrome browser. Klik rechtsboven in de chrome browser op customize and control> select tools > developer tools > resources > cookies. Onderstaand een voorbeeld:

Cookies zijn nodig als basic identifiers zodat als de gebruiker terugkomt naar de website, we weten dat wie het is. Je moet een minimale hoeveelheid informatie instellen aangezien de informatie op de gebruikers computer of smartphone wordt opgeslagen en we ervan uitgaan dat het niet secuur is. Normaliter is deze informatie een ID nummer of een ‘token’.   Gebruik de setcookie() commando om een cookie te sturen vanaf de PHP browser naar de user’s computer. Om de cookie data van een user browser te lezen kijk in $_COOKIE[] array.

De eerste keer als iemand je website bezoekt is de cookie nog niet ingesteld, daarom is zijn nummer een minder dan zijn aantal bezoeken. Om een cookie te verwijderen stel de expiration time in in het verleden.

 

De cookie wordt ingesteld voor de <!DOCType html> met setcookie(name, value, expiration, path)

Hierbij specifeer je een naam, waarde en expiration time in de toekomst

Stel het pad in op  '/' tenzij je de cookie wilt verbinden aan een folder op je website

<?php

$futureTime = time() + 3600;

setcookie('info', 'Cookie Info', $futureTime, '/');

?>

<!DOCTYPE html>

<head>

                <title>Cookies</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>              <body>

                                <h1>Cookies</h1>

                                <?php phpinfo(INFO_VARIABLES); ?>

</body></html>

 

De cookie kan je lezen met $_COOKIE['name_of_cookie']

$value = strip_tags($_COOKIE['info']); wordt gebruikt om eventuele malicious code te strippen

Gebruik htmlspecialchars om de cookie waarde te echo-en voor security redenen

<?php  ?>

<!DOCTYPE html>

<head>

                <title>Cookies</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>

                <body>

                                <h1>Cookies</h1>

                                <b>Value: </b><?php echo htmlspecialchars($value); ?>

                                <?php phpinfo(INFO_VARIABLES); ?>

                </body>

</html>

 

Hier wordt de cookie verwijderd door de expiration time in het verleden te zetten

<?php

$pastTime = time() - 3600;

setcookie('info', 0, $pastTime, '/');

?>

<!DOCTYPE html>

<head>

                <title>Cookies</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>

                <body>

                                <h1>Cookies</h1>

                                <br />Refresh the page and see that the cookie has been removed

                                <?php phpinfo(INFO_VARIABLES); ?>

                </body>

</html>

 

Cookies zijn altijd een minder dan het aantal bezoeken, aangezien de cookie bij het eerste bezoek nog niet is ingesteld

Beneden checken we als de cookie is ingesteld en dan doen we een count.

<?php

if (isset($_COOKIE['count'])) {

                $count = (int) $_COOKIE['count'];

                if (isset($_GET['inc'])) {  $count++;}

else {     $count--;             }}

// if cookie is not set initialize variable to 0

else {     $count = 0;}

// set cookie with current count

setcookie('count', $count, time() + 3600, '/');      ?>

<!DOCTYPE html>

<head>

                <title>Cookies</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>

                <body>

                                <h1>Cookies</h1>

                                <b>Count: </b><?php echo $count; ?>

                                <form name="getForm" method="GET">

                                                <input type="submit" name="inc" value="+" />

                                                <input type="submit" name="dec" value="-" />

                                </form>              

                                <?php phpinfo(INFO_VARIABLES); ?>

                </body>

</html>

 

SESSIONS

 

Een session vertegenwoordigd informatie opgeslagen op de server van een bepaalde user.

session_start() stelt de session in, alternatief kan je

de php.ini parameter  "session.auto_start"  op 1 zetten

Als je een "session_startQ" command, instelt genereert het een unique random identifier en stuurt het in een cookie naar de gebruiker. Elke keer dat de geruiker jouw website bezoekt, wordt deze identifier gebruikt om session data van de server te ontvangen. Session informatie wordt opgeslagen op de webserver, cookie informatie op de gebruikers computer of cell.

Ga alsvolgt te werk:

session_start() and then $_SESSION["data"] = $newData

session_start() and then gsessionData = $_SESSION["data"]

Je kan allerlei data achterhalen. Voor objects include  class definition

 

first: een cookie PHPSESSID wordt ingesteld

second : zoekt naar de cookie and leest session info

 

<?php

session_start()

session_start();

if (isset($_POST['first_name'])) { $_SESSION['first'] = strip_tags($_POST['first_name']); }

else {     $_SESSION['first'] = 'Unknown';  }

if (isset($_POST['family_name'])) { $_SESSION['last'] = strip_tags($_POST['family_name']); }

 else {    $_SESSION['last'] = 'User'; }

$fullName = $_SESSION['first'] . ' ' . $_SESSION['last'];

?>

<!DOCTYPE html>

<head>

                <title>Sessions</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>

                <body>

                                <h1>Sessions</h1>

                                Welcome <?php echo htmlspecialchars($fullName); ?>

                                <form name="postForm" method="POST">

                                                <table width=60%>

                                                <tr><th>First Name</th><td><input type="text" name="first_name" /></td></tr>

                                                <tr><th>Family (last) Name</th><td><input type="text" name="family_name" /></td></tr>

                                                <tr><td>&nbsp;</td><td><input type="submit" /></td></tr>

                                                </table>             

                                </form>              

                                NOTE: session data never appears as inbound data!

                                <?php phpinfo(INFO_VARIABLES); ?>

                </body>

</html>

 

session data wordt per default 180 minutes opgeslagen gehouden

"session.cache_expire = xxx" php.ini parameter om de tijd in te stellen

"session.cookie_lifetime = xxx" parameter stelt de tijd totdat de session cookie expireert in. Geeft hetzelfde resultaat.

<?php

session_start();

if (isset($_SESSION['first']) && isset($_SESSION['last'])) {              $fullName = $_SESSION['first'] . ' ' . $_SESSION['last'];}

 else {    $fullName = 'Guest User';}

?>

<!DOCTYPE html>

<head>

                <title>Sessions</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head><body>

                                <h1>Sessions</h1>

                                Welcome <?php echo htmlspecialchars($fullName); ?>

                                <br />NOTE: session data never appears as inbound data!

                                <?php phpinfo(INFO_VARIABLES); ?>

</body></html>

 

Je kan van alles opslaan in een session

<?php

class Test

{              public $test = 'TEST';

                public function add($op1, $op2)

                {return $op1 + $op2;      }              }

session_start();

$_SESSION['object'] = new Test();

$_SESSION['array'] = array(1, 2, 3, 4, 5);

?>

<!DOCTYPE html>

<head>

                <title>Sessions</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>              <body>

                                <h1>Sessions</h1>

                                Info stored in session

                                <?php phpinfo(INFO_VARIABLES); ?>

</body></html>

 

Je moet de class definition wel instellen anders moet je var_dump() checken

<?php

class Test

{              public $test = 'TEST';

                public function add($op1, $op2)

                {  return $op1 + $op2;    }              }

session_start();

$object = $_SESSION['object'];

unset($_SESSION['array']);

?>

<!DOCTYPE html>

<head>

                <title>Sessions</title>

                <meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head><body>

                                <h1>Sessions</h1>

                                Add 2 + 2: <?php echo $object->add(2, 2); ?>

                                <br />

                                <?php var_dump($object); ?>

                                <br />

                                <?php var_dump($array); ?>

                                <?php phpinfo(INFO_VARIABLES); ?>

</body></html>

 

 

 

HEADERS

 

Headers zijn een onderdeel van het http protocol, die de World Wide Web bestuurt.

Het instellen van headers kan users redirecten naar andere delen van je website en kan ook status informatie relayen naar de browser. Een lijst van headers: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

Belangrijke headers zijn Location, Content-Type, Content-Length, and Content-Disposition

De header kan worden ingesteld met de header command

 

Redirection is het process waarbij PHP code wordt gestuurd om de gebruiker naar een andere web page of web site te dirigeren. Gebruik hiervoor header("Location: $url");

 

Onderin wordt de header ingesteld met: header(header_string, replace T | F, response_code)

Location: $url = … bepaald de locatie waarnaartoe wordt geredirect bv naar non-web files & graphics waarna de content type wordt ingesteld met Content-Type: text/html; charset=UTF-8 = sets type + character set for document

Default = Content-Type: text/html = default

http://en.wikipedia.org/wiki/MIME_type toont een lijst van andere content types

Content-Length: nnn = de grootte van de attachment in bytes

Content-Disposition: inline; filename=xxx = toont de file in de webpage

Content-Disposition: attachment; filename=xxx = als de file wordt behandeld als niet zijnde op de website

header(header_string, replace T or F, status_code) wordt gebruikt voor redirection

 

<?php

$filename = './furball_santa_rosa_433px.JPG';  

$jpg = file_get_contents($filename); >>>leest de file in $jpg

header('Content-Type: image/jpeg');

header('Content-Length: ' . strlen($jpg)); stelt de lengte in

header('Content-Disposition: inline; filename="' . $filename . '"');

echo $jpg; >>> toont de file

 

Onderin wordt gewerkt met een pdf file

<?php

$filename = './test.pdf';

$pdf = file_get_contents($filename);

header('Content-Type: application/pdf');

header('Content-Length: ' . strlen($pdf));

header('Content-Disposition: attachment; filename="' . $filename . '"');

echo $pdf;

 

header(header_string, replace T or F, status_code)

<?php

header('Location: http://www.unlikelysource.com/');

exit;

 

READING HEADER INFORMATION

In de headers vindt je informatie over users die jouw website bezoeken

Gebruik phpinfo(INFO_VARIABLES) om informatie te genereren wanneer je bezig bent te ontwikkelen

Lees informatie van de PHP super global $_SERVER[] in jouw programma

$_SERVER["REMOTE_ADDR"] >>> to find the customers IP-address

$_SERVER["HTTP_REFERER"]>>> to find which website referred the user

$_SERVER["HTTP_USER AGENT']>>> to discover the customers browser

PHP code is portable en kan zonder aanpassing hergebruikt worden op verschillende website projects

I.p.v.  "hard coding" van het server adres gebruik je  use $_SERVER["HTTP_HOST"].

 

$_SERVER slaat binnenkomende HTTP header information op

<?php

echo '<br /><b>IP Address:</b> ', $_SERVER['REMOTE_ADDR'];

echo '<br /><b>Previous Webpage:</b> ', $_SERVER['HTTP_REFERER'];

echo '<br /><b>Browser:</b> ';

$customerBrowser = $_SERVER['HTTP_USER_AGENT'];

switch (TRUE) {

                case stripos($customerBrowser, 'MSIE') :

                                echo 'Internet Explorer';

                                break;

                case stripos($customerBrowser, 'Chrome') :

                                echo 'Google Chrome';

                                break;

                default :

                                echo 'Unidentified';        }

phpinfo(INFO_VARIABLES);

 

Gebruik $_SERVER['HTTP_HOST'] om de code portable te maken

<?php

$url = 'http://' . $_SERVER['HTTP_HOST'] . '/WorkingFiles/Chapter15/web-ops_set_headers_2.php';

?>

<html><body>

<a href="<?php echo $url; ?>">Click Here to See Kitten</a>

</body></html>

 

OUTPUT BUFFERING

 

Output buffering is het process van verzamelen van html en andere output in een memory buffer om het dan naar de gebruiker te versturen in een hap. Het is de snelste en gemakkelijkste manier om de response tijd van je website te verbeteren; het maakt efficienter gebruik van het internet.

Ob_start kan je plaatsen aan het begin van jouw programma of je kan

Output buffering instellen in php.ini

XAMPP output buffering is ingesteld op 4096, wat ook de voorgestelde waarde is

Ob_flush() kan je gebruiken om de buffer te flushen

Ob_get_contents() om de inhoud van de buffer ten allen tijde te accessen zolang het niet is geflushed.

 

gebruik ini_set('output_buffering', xxxx) to override the php.ini setting

 Onderstaand werken we met obtest($test) die een random string van 100,000 letters, nummers and spaces produceert.

<?php

function obTest($test)

{              $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ';

                $len = strlen($string) - 1;

                list($sec, $msec) = explode(' ', microtime());

                $time1 = $sec + $msec;

                $space = rand(1,64);

                echo $test;

                echo '<br /><hr />';

                for ($x = 0; $x < 100000; $x++) {

                                if ($space--) {

                                                $pos = rand(0, $len);

                                                echo substr($string, $pos, 1);     }

else {     echo ' ';

                                $space = rand(1,64);       }              }

                list($sec, $msec) = explode(' ', microtime());

                $time2 = $sec + $msec;

                echo '<br /><hr />';

return '<br /><hr />' . $test . '<hr /><br />Start: ' . $time1 . '<br />Stop:  ' . $time2 . '<br />Difference: ' . ($time2 - $time1);}

 

// speed test -- no output buffering

// use ini_set() to override the php.ini setting

ini_set('output_buffering', 0);

$result1 = obTest('NO OUTPUT BUFFER');

 

// speed test -- output buffering set to 4096

ini_set('output_buffering', 4096);

$result2 = obTest('OUTPUT BUFFER = 4096');

 

echo '<br /><hr />';

echo $result1;

echo $result2;

echo '<br /><hr />';

echo '<br /><br /><br />';

 

 

<?php

// Managing Web Operations: Managing Output Buffering

// demonstrates using ob_start(), ob_get_contents(), and ob_flush()

 

ob_start();

echo '<h3>Output Buffer Test</h3>', '<hr />', PHP_EOL;

echo '<br />Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id augue diam. Praesent mollis augue eu nulla suscipit a aliquam felis feugiat. Fusce nec elit odio. In luctus ornare libero nec porta. Proin porta ligula a urna tristique et rutrum tortor posuere. Nulla nec leo id sapien commodo congue. In nunc erat, tristique eu laoreet et, commodo eget sem. Aliquam faucibus elit eu magna vehicula vitae sollicitudin arcu aliquet. Donec suscipit augue eget nunc tristique et ultrices felis aliquam. Fusce adipiscing suscipit quam, sed sollicitudin lectus tempus in. Proin ante purus, vehicula at vulputate eget, aliquam vitae lacus. Mauris faucibus velit sed purus auctor eu fringilla orci posuere. Curabitur vestibulum pretium libero fermentum dictum.', PHP_EOL;

 

// get contents of buffer

$contents = ob_get_contents();

 

// flush the buffer

ob_flush();

 

echo '<h3>Contents from Buffer</h3>', '<hr />', PHP_EOL;

echo $contents;

 

// flush the buffer

ob_flush();

<?php

// Managing Web Operations: Managing Output Buffering

// demonstrates using ob_start(), ob_get_contents(), and ob_flush()

 

ob_start();

echo '<h3>Output Buffer Test</h3>', '<hr />', PHP_EOL;

echo '<br />Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id augue diam. Praesent mollis augue eu nulla suscipit a aliquam felis feugiat. Fusce nec elit odio. In luctus ornare libero nec porta. Proin porta ligula a urna tristique et rutrum tortor posuere. Nulla nec leo id sapien commodo congue. In nunc erat, tristique eu laoreet et, commodo eget sem. Aliquam faucibus elit eu magna vehicula vitae sollicitudin arcu aliquet. Donec suscipit augue eget nunc tristique et ultrices felis aliquam. Fusce adipiscing suscipit quam, sed sollicitudin lectus tempus in. Proin ante purus, vehicula at vulputate eget, aliquam vitae lacus. Mauris faucibus velit sed purus auctor eu fringilla orci posuere. Curabitur vestibulum pretium libero fermentum dictum.', PHP_EOL;

$contents = ob_get_clean(); >>>get contents of buffer and erases it

ob_flush(); >>>flush the buffer

echo '<h3>Contents from Buffer</h3>', '<hr />', PHP_EOL;

echo $contents;

ob_flush();

 

BUILDING WEBFORMS

FORM DATA

Webforms worden gebruikt om data op te vragen van een user.

Het instellen van een form method doe je met

Get method="GET" als de data moet komen in de browser URL

Set method="POST” als je een hoeveelheid formdata hebt of bij het oploaden van een file

De form action stel je als volgt in

Set "action" = the PHP program which will handle the form

Binnenkomende data kan je vinden in een van de drie plaatsten

$_GET = data from the URL

$_POST = data from a form where method=" POST"

$_REQUEST = combination of $_GET and $_POST

Als je form data in een array wil capturen moet je [] plaatsen

Bij het definieren van de “name ” attribute in de input tag, kan je [] plaatsen achter de name, als je data van de form tag in een array wilt vangen. bv

input type="text" name="address[line1]" />

In de HTML file bij het definieren van de Form tag, stel “action”=PHP program die de form moet processen

Onderstaand de manier om een form te processen als je alleen PHP gebruikt

Je kan PHP gebruiken om een HTML file te incorporeren of HTML genereren met de “echo” commando

1.            Filter en validate alle inkomende form data

2.            Save de form data in variabelen of een array

3.            Bereid een SQL INSERT of UPDATE statement voor, met placeholders in plaats van de waarden

4.            Executeer the statement

 

 

Het opvangen van formdata gaat alsvolgt:

<?php

echo '<br />$_GET<hr />'; var_dump($_GET);

echo '<br />$_POST<hr />'; var_dump($_POST);

 

Het opvangen van alle input data gaat alsvolgt

<?php

if (isset($_POST['submit'])) {

                $data = var_export($_POST, TRUE) . PHP_EOL;} //>>>vangt data op van web-forms_capturing_1.html

else {     $data = '';}

$form = file_get_contents('web-forms_capturing_2.html'); //>>>leest form in, in een variabele

$form = str_ireplace('#ACTION#', strip_tags($_SERVER['SCRIPT_NAME']), $form); >>> filteren van de form data

$form = str_ireplace('#DATA#', htmlspecialchars($data), $form);

echo '<!DOCTYPE html>';

echo '<!-- Building Web Forms: Capturing <form> Data -->';

echo '<head>';

echo '<meta charset="utf-8">';

echo '<title>Building Web Forms</title>';

echo '<link href="css/style.css" media="screen" rel="stylesheet" type="text/css" >';

echo '<link href="images/favicon.ico?v=2" rel="shortcut icon" type="image/vnd.microsoft.icon" >';

echo '</head>';

echo '<body topmargin="0" leftmargin="0">';

echo $form; >>> leest de informatie in

echo '</body>';

echo '</html>';

 

Je kan een class includen om een form te ontwerpen

array $_POST['data']['key'] toont data in de vorm van een array

Uitgaande van het gegeven dat elle formelements een name=key hebben, kunnen we alle data van de key in $_POST

var_export($data, TRUE) pakt de data van var_dump zonder het direct te outputten

<?php

ini_set('display_errors', 1);

require 'web-forms_capturing_3_class.php';

$header = 'Capturing Form Data';

$title = 'Building Web Forms';

if (isset($_POST['data'])) {

                $postData = var_export($_POST['data'], TRUE);}

 else {    $postData = '';   }

$form = new Form();

// >>>forminhoud wordt alsvolgt ontwikkeld

$formContents = $form->input('ID', 'text', 'id', 6, 8);

$formContents .= $form->input('Name', 'text', 'name', 60, 255);

$formContents .= $form->textarea('Address', 'address', 4, 40);

$formContents .= $form->input('City', 'text', 'city', 50, 255);

$formContents .= $form->input('Postal Code', 'text', 'postcode', 16, 16);

$formContents .= $form->input('Phone', 'text', 'phone', 20, 20);

$formContents .= $form->submit('submit', 'Update');

//>>>form inhoud wordt alsvolgt in de form tag geplaatst

$formHeader = $form->h(4, $header);

$formTable  = $form->buildForm('userInfo', $_SERVER['REQUEST_URI'], $form->div('aTable', $formContents));

$formDiv             = $form->div('theForm', $formHeader . $formTable);

$dataDiv              = $form->div('data', $postData);

$formFooter = $form->footer('&copy; 2012 by InfiniteSkills.com | All rights reserved');

echo $form->html($title, $form->div('container', $formDiv . $dataDiv . $formFooter));

 

Checken om te zien als de data verstuurd is

<?php

if (isset($_POST['data'])) {

                $data = $_POST['data']; //>>>  zet $_POST data in een variabele

                foreach ($data as $key => $value) {$data[$key] = strip_tags($value); } //>>> opschonen van data

                echo '<br />POST data<hr />', var_dump($data);

                $user = 'class';

                $pass = 'password';

                $dsn = 'mysql:host=localhost;dbname=class';

                $pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

//>>>labels in "VALUES" in de SQL statement moeten $_POST field names komend van de form matchen

                $sql = 'INSERT INTO `users` '

                                 . '(`name`, `address`, `city`, `state_province`, `postal_code`, `phone`) '

                                 . 'VALUES (:name, :address, :city, :stateProvince, :postCode, :phone)';

                $stmt = $pdo->prepare($sql);

                $result = $stmt->execute($data);

                echo '<br />RESULT: ', $result;

                $pdo = NULL;}

else {     include 'web-forms_capturing_4.html'; }

 

FORM INPUT ELEMENTS

 

Een form input element is een HTML tag ongeveer als deze: <input type="XXX" name="YYY" />

Form input elements zijn onmisbaar bij het vergaren van informatie of queries van een website bezoeker

De meest voorkomende form input elements zijn: text, textarea, password, file, submit, select, checkbox, en radio

Text >>> voor het vergaren van een lijn aan informatie

Textarea >>> voor het vergaren van commentaar, volledige addressen etc

Password >>> als je wilt bewerkstelligen dat hetgeen de bezoeker intypt onzichtbaar blijft

File >>> als je de bezoeker in de gelegenheid wilt stellen om een file te uploaden

 

Onderin worden verschillende typen form elements getoond. Eerste regel is een check als de submit button ingedrukt is.

Action=”#” >>> gebruik deze file om de form te verwerken. 

<?php

if (isset($_POST['submit'])) {phpinfo(INFO_VARIABLES);

exit; }

?>

<!DOCTYPE html>

<head>

    <meta charset="utf-8">

    <title>Building Web Forms</title>

    <link href="css/style.css" media="screen" rel="stylesheet" type="text/css" >

                <link href="images/favicon.ico?v=2" rel="shortcut icon" type="image/vnd.microsoft.icon" >

</head>

<body topmargin="0" leftmargin="0">

    <div class="container">

                <div class="theFormAbove">

                <h4 style="text-align: center;">Understanding Form Input Elements</h4>

                </div>

                <div class="theFormMiddle">

                <!-- action="#" means use this file to process the form -->

                <form name="purchases" action="#" method="POST" enctype="multipart/form-data">

                <div class="aTable">

                <div class="aRow">

                <div class="aCell label">Name</div>

                <div class="aCell formTd"><input type="text" name="data[name]" size=60 maxlength=255 value="NAME"/></div>

                </div>

                <div class="aRow">

                <div class="aCell label">Address</div>

                <div class="aCell formTd"><textarea name="data[address]" rows=4 cols=44>ADDRESS</textarea></div>

                </div>

                <div class="aRow">

                <div class="aCell label">Gender</div>

                <div class="aCell formTd text">

                                <input type="radio" name="data[gender]" value="M" />Male

                                <input type="radio" name="data[gender]" value="F" />Female

                                <input type="radio" name="data[gender]" value="N" />Neutral

                </div>

                </div>

                <div class="aRow">

                <div class="aCell label">Airport</div>

                <div class="aCell formTd">

                                <select name="data[airport]" >

                                <option value="ATL">Hartsfield-Jackson Atlanta International Airport</option>

                                <option value="ORD">O'Hare International Airport</option>

                                <option value="LHR">London Heathrow Airport</option>

                                <option value="HND">Tokyo International Airport</option>

                                <option value="LAX">Los Angeles International Airport</option>

                                <option value="FRA">Frankfurt International Airport</option>

                                <option value="CDG">Charles De Gaulle International Airport</option>

                                <option value="AMS">Schiphol Airport</option>

                                <option value="MAD">Barajas International Airport</option>

                                <option value="HKG">Hong Kong International Airport</option>

                                <option value="DMK">Don Muang International Airport</option>

                                <option value="SFO">San Francisco International Airport</option>

                                <option value="JFK">John F. Kennedy International Airport</option>

                                <option value="LGW">London Gatwick Airport</option>

                                <option value="PEK">Beijing Capital International Airport</option>

                                <option value="YYZ">Toronto Pearson International Airport</option>

                                </select>

                </div>

                </div>

                <div class="aRow">

                <div class="aCell label">How Did You <br />Hear About Us?</div>

                <div class="aCell formTd">

                <span class="text">Check all that apply</span>

                <ul>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="AAR">AARP Magazine</li>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="RDI">Reader's Digest</li>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="DEV">Devputra</li>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="WDA">Woman's Day</li>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="CLI">Canadian Living</li>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="INT">The Internet</li>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="TVA">TV Advertisement</li>

                <li class="text"><input type="checkbox" name="data[hear_about][]" value="FRE">Friend or relative</li>

                </ul>

                </div>

                </div>

                <div class="aRow">

                <div class="aCell label">Password</div>

<div class="aCell formTd"><input type="password" name="data[password]" size=20 maxlength=255 /></div>                                 </div>

                <div class="aRow">

                <div class="aCell label">Upload Your Photo</div>

                <div class="aCell formTd"><input type="file" name="file_upload" size=20 maxlength=255 /></div>

                </div>

                <div class="aRow">

                <div class="aCell label">&nbsp;</div>

                <div class="aCell formTd"><input type="submit" name="submit" value="Submit" /></div>

                </div>

                </div>

                </form>

                </div>

                <div class="theFormBelow">

                </div>

<div style="clear: both;"></div>

<div class="footer">

<hr>

<p>&copy; 2012 by InfiniteSkills.com | All rights reserved</p>

</div>

</div> <!-- /container -->

</body>

</html>

 

 

SELECT TAGS

 

Een "select" tag wordt gebruikt om de user een "dropdown" list met keuzes te bieden

Een "option" tag gaat in de "select" tag. Elke "option" tag kan zijn eigen lable en waarde hebben.

Voeg de keyword "multiple" in de "select" tag om users verschillende selectieopties te geven

Gebruik een “foreach” loop om een “option tag” voor elke array element te creeeren. Bij een associative array, gebruik je

$key => $value alsvolgt: <option value="$key">$value</option>

Hoe kan je een database gebruiken om de opties voor een select tags te creeren:

1.    Create the SQL SELECT statement

2.    Prepare

3.    Execute

4.    In the fetch loop, add "option" tags from the results

 

Onderin word teen array gebruikt om de options op te slaan en een function om een serie option tags:

<option value="xxx">This</option> etc te produceren

<?php

function buildOptions($array)

{              $output = '';

                foreach ($array as $key => $value) {  $output .= '<option value="' . $key . '">' . $value . '</option>' . PHP_EOL;  }

                return $output;                  }

$airports = array(

                'ATL' => 'Hartsfield-Jackson Atlanta International Airport',

                'ORD' => 'O\'Hare International Airport',

                'LHR' => 'London Heathrow Airport',

                'HND' => 'Tokyo International Airport',

                'LAX' => 'Los Angeles International Airport',

                'FRA' => 'Frankfurt International Airport',

                'CDG' => 'Charles De Gaulle International Airport',

                'AMS' => 'Schiphol Airport',

                'MAD' => 'Barajas International Airport',

                'HKG' => 'Hong Kong International Airport',

                'DMK' => 'Don Muang International Airport',

                'SFO' => 'San Francisco International Airport',

                'JFK' => 'John F. Kennedy International Airport',

                'LGW' => 'London Gatwick Airport',

                'PEK' => 'Beijing Capital International Airport',

                'YYZ' => 'Toronto Pearson International Airport',);

if (isset($_POST['submit'])) {phpinfo(INFO_VARIABLES);               exit;} ?>

<!DOCTYPE html>

<head>

  <meta charset="utf-8">

  <title>Building Web Forms</title>

  <link href="css/style.css" media="screen" rel="stylesheet" type="text/css" >

<link href="images/favicon.ico?v=2" rel="shortcut icon" type="image/vnd.microsoft.icon" >

</head>

<body topmargin="0" leftmargin="0">

    <div class="container">

                <div class="theFormAbove">

                                <h4 style="text-align: center;">Understanding Form Input Elements</h4>

                                </div>

                                <div class="theFormMiddle">

                                <!-- action="#" means use this file to process the form -->

                                <form name="purchases" action="#" method="POST" enctype="multipart/form-data">

                                                <div class="aTable">

                                                <div class="aRow">

                                                                <div class="aCell label">Airport</div>

                                                                <div class="aCell formTd">

                                                                                <select name="data[airport1]" >

                                                                                <?php echo buildOptions($airports); ?>

                                                                                </select>

                                                                </div>

                                                                </div>

                                                                <div class="aRow">&nbsp;</div>

                                                                <div class="aRow">

                                                                <div class="aCell label">Multiple Airports</div>

                                                                <div class="aCell formTd">

                                                                                <select multiple name="data[airport2][]" >

                                                                                <?php echo buildOptions($airports); ?>

                                                                                </select>

                                                                </div>

                                                                </div>

                                                                <div class="aRow">

                                                                <div class="aCell label">&nbsp;</div>

                                                                <div class="aCell formTd"><input type="submit" name="submit" value="Submit" /></div>

                                                                </div>

                                                </div>

                                </form>

                                </div>

                                <div class="theFormBelow">

                                </div>

                                <div style="clear: both;"></div>

      <div class="footer">

                <hr>

        <p>&copy; 2012 by InfiniteSkills.com | All rights reserved</p>

      </div>

    </div> <!-- /container -->

  </body>

</html>

 

Je kan met een query doen de lijst met opties uit een database halen, en met een functie de lijst met opties produceren.

Hierbij worden waarden in <option> tags omgezet.  PDO::FETCH_ASSOC zet de database waarden in een array

 country_name' column is de array waarde, 'ISO2' column is de array key >>>ISO2 staat voor country codes

 

<?php

function buildOptions($array)

{$output = ''; foreach ($array as $key => $value) {    $output .= '<option value="' . $key . '">' . $value . '</option>' . PHP_EOL;}

return $output;   }

 

$user = 'class';

$pass = 'password';

$dsn = 'mysql:host=localhost;dbname=class';

$pdo = new PDO($dsn, $user, $pass);

 

$list = array();

$sql = 'SELECT `ISO2`, `country_name` FROM `country_codes`;';

foreach ($pdo->query($sql, PDO::FETCH_ASSOC) as $row) {

                $list[$row['ISO2']] = $row['country_name'];        }

$dbh = NULL;

               

if (isset($_POST['submit'])) { phpinfo(INFO_VARIABLES);              exit;       }

 

?>

<!DOCTYPE html>

<head>

    <meta charset="utf-8">

    <title>Building Web Forms</title>

                <link href="css/style.css" media="screen" rel="stylesheet" type="text/css" >

                <link href="images/favicon.ico?v=2" rel="shortcut icon" type="image/vnd.microsoft.icon" >

</head>

<body topmargin="0" leftmargin="0">

    <div class="container">

                <div class="theFormAbove">

                                <h4 style="text-align: center;">Understanding Form Input Elements</h4>

                                </div>

                                <div class="theFormMiddle">

                                <form name="purchases" action="#" method="POST" enctype="multipart/form-data">

                                                <div class="aTable">

                                                                <div class="aRow">

                                                                                <div class="aCell label">Country</div>

                                                                                <div class="aCell formTd">

                                                                                                <select name="data[country1]" >

                                                                                                <?php echo buildOptions($list); ?>

                                                                                                </select>

                                                                                </div>

                                                                </div>

                                                                <div class="aRow">&nbsp;</div>

                                                                <div class="aRow">

                                                                                <div class="aCell label">Multiple Countries</div>

                                                                                <div class="aCell formTd">

                                                                                                <select multiple name="data[country2][]" >

                                                                                                <?php echo buildOptions($list); ?>

                                                                                                </select>

                                                                                </div>

                                                                </div>

                                                                <div class="aRow">

                                                                <div class="aCell label">&nbsp;</div>

                                                                <div class="aCell formTd"><input type="submit" name="submit" value="Submit" /></div>

                                                                </div>

                                                </div>

                                </form>

                                </div>

                                <div class="theFormBelow">

                                </div>

                                <div style="clear: both;"></div>

      <div class="footer">

                <hr>

        <p>&copy; 2012 by InfiniteSkills.com | All rights reserved</p>

      </div>

    </div> <!-- /container -->

  </body></