PHP & MySQL gevorderd



Vergelijkbare documenten
PHP en een MySQL database.

PHP tekst-bewerkingen, uploaden csv-bestanden import/eport

Kies File>New>Blank Page>PHP. Je kunt eventueel nog een stylesheet koppelen. Definieer nu eerst een site! Dat betekent: Site>New Site

Formulieren maken met Dreamweaver CS 4/CS 5

Les 15 : updaten van gegevens in de database (deel2).

Handleiding RS Form! 1.0.4

9. MYSQL. Daarin zien we het administratie paneel van mysql.

Formulier maken en opvangen met php

Een website maken met databasetoegang.

HTML in Outlook Hoe zorgt u ervoor dat uw goed in beeld komt?

Technische nota AbiFire Rapporten maken via ODBC

Installeer Apache2: Landstede februari 2009 versie 3 1 Bertil Hoentjen

Gebruikershandleiding voor: Beperkte Password protectie met JavaScript

Les 12 : database koppeling, opmaken van template, webstructuur en afdrukken van gegevens. (deel2).

PHP & MySQL. Studievaardigheden Frank Takes (ftakes@liacs.nl) LIACS, Universiteit Leiden

Les 9: formulier controle met javascript.

De MySQL C API. Variabelen in C Functies in C Pointers in C

Les 11 : Basis SQL (deel2).

MWeb 4.0. Handleiding Basis Modules Versie 1.0

LES 11: VAN LOKAAL NAAR ONLINE. Lesoverzicht: Aan de slag Domeinnaam Web hosting FTP gegevens FTP programma s Database exporteren Samenvatting

16. Web Station. In dit hoofdstuk komen de volgende onderwerpen aan bod:

Handleiding website. Inloggen Start uw internet browser en ga naar

ideal Betaal Formulier (Ondersteund o.a. ideal, MisterCash, Direct E-Banking en Credit Card)

Handleiding: Whitelabel Customersite

Handleiding CMS VOORKANT

Koppeling met een database

AFO 142 Titel Aanwinsten Geschiedenis

Foutcontrole met Javascript

Automatische Installatie op IIS server

Programmeren voor het web met PHP

Denit Backup instellen op een Linux server

Inhoudsopgave. versie 0.8

Handleiding Content Management Systeem

Puntjes op de I. Baris Firat

HTML. Formulieren. Hans Roeyen V 3.0

Voor vragen: of mail naar

Handleiding: OpenEmm nieuwsbrief manager Diergaarde Blijdorp

15 July Betaalopdrachten web applicatie gebruikers handleiding

Formulierbeheer Importeren bestaand (model)formulier... 2 Wat is exporteren/importeren eigenlijk?... 3 Formulier aanpassen/opbouwen...

Dynamische Websites. Week 2

GEBRUIKERSHANDLEIDING Content Management Systeem. Gebruikershandleiding RelaxWeb CMS

Formulieren maken met Dreamweaver CS 4

Handleiding Faxdiensten

Handleiding ESS na de upgrade People Inc. versie 3.5.0

15 July Betaalopdrachten web applicatie beheerders handleiding

Domein API Handleiding

cbox UW BESTANDEN GAAN MOBIEL! VOOR ANDROID-SMARTPHONES EN -TABLETS GEBRUIKERSHANDLEIDING

Een database gebruiken

Inhoud. Pagina 2 van 13

Naam project Lost And Found Animals Lokaal gehost Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50%

Trippeltrap Content Management System

Opmerkingen kan je mailen naar: A. Kouters: A. Steijlen: Versie Datum Opmerkingen

PHP & MySQL. Studievaardigheden Jan van Rijn (j.n.van.rijn@liacs.leidenuniv.nl) LIACS, Universiteit Leiden

Handleiding sms-dienst Adviesburo Pompoen

Handleiding Formulieren in TYPO3 Versie 1.2, 18 juli 2008

Xampp Web Development omgeving opzetten onder Windows.


Technische nota AbiFire5 Rapporten maken via ODBC

UNIX FAQ. Migratie naar een nieuwe server

Datum: Gemaakt door: Berend de Groot Voor: ComSi, ROC Friese Poort

Producten toevoegen. Inleiding

Widget Tip van de dag!

Gebruiksaanwijzing om de nieuwspagina van uw peuterspeelzaal online aan te kunnen passen. Hiervoor heeft u een internetverbinding nodig!

En hoe gaan ze dit allemaal terugvinden?

1 Inleiding Installatie 21. WAMP met Apache Friends 23. XAMPP starten en controleren 26. LAMP 32 De installatie ongedaan maken 33

De nieuwste build van CarmenTV Injector heeft een aantal verbeterde en nieuwe functies.

Globale kennismaking

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at

PhPlist Gebruikers Handleiding

A.C. Gijssen. 0.3 PHP en MySQL

IMAP-handleiding Bookinto

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

Mailing List Manager. Hoofdstuk 19

Handleiding wordpress

In het CMS is het mogelijk om formulieren aan te maken. Voorafgaand een belangrijke tip:

Installatie SQL: Server 2008R2

EBUILDER HANDLEIDING. De Ebuilder is een product van EXED internet EXED CMS UITLEG

cbox UW BESTANDEN GAAN MOBIEL! VOOR SMARTPHONES EN TABLETS MET HET ios BESTURINGSSYSTEEM GEBRUIKERSHANDLEIDING

Taak Versleutelen en dan weer terug... 1

WebUntis 2014 Instructies basisinstallatie

Opdrachtgever: Avpec1910 Auteur: Avalon Systems Versie: 1.0 Datum: 12/01/2011. Handleiding WYSIWYG HTML editor: CKEditor

Handleiding ChainWise Digitaal factureren

Outlook koppeling ChainWise

Gegevens uit een database tonen

Les W-04: Een introductie in PHP

Bitrix Site Manager gebruikershandleiding BureauZuid

8.1.1 Aanmaken van een nieuwsbrieflijst voor een nieuwsbrief

DrICTVoip.dll v 2.1 Informatie en handleiding

PHP-OPDRACHT SITE BOUWEN

Databases - Inleiding

Beknopte handleiding voor het gebruik van de Secure Download (en upload-) Facility

Content Management System

Handleiding NarrowCasting

Getting Started. AOX-319 PBX Versie 2.0

XAMPP Web Development omgeving opzetten onder Windows.

INHOUDSOPGAVE BEHEERDERS HANDLEIDING

Formulieren en waarden posten naar een view

U krijgt de melding dat uw browser geen cookies aanvaardt? Volg dan onderstaande weg om ze wel te accepteren.

Transcriptie:

PHP & MySQL gevorderd

Inhoudsopgave Inleiding! 4 Voorkennis voor PHP & SQL! 4 Database resources! 4 De werking van een PHP-module op een webserver! 5 Opbouw web-pages (php)! 6 MySQL! 7 Het beveiligen van phpmyadmin! 7 De opbouw van een database! 8 PHP koppelen met een Database! 8 Gegevens uit een database opvragen! 10 Invoegen van records! 13 Formuliergegevens toevoegen aan een Database! 14 Query met WHERE en gegevens uit meerdere tabellen! 15 ORDER BY statement! 16 Update van records! 17 Verwijderen van records! 18 Meer PHP functies voor MySQL bewerkingen! 19 PHP security! 21 Wachtwoord onleesbaar voor database- administrators! 21 Validatie op invoervelden.! 24 Capcha (no-robot invoer beveiliging)! 26 IP- highjacking! 27 Invoerveld beveiligingen tegen sql-injections.! 28 Sessies! 29 Sessie beveiliging! 29 Sessie-tijd! 31 Mailen met PHP! 32 Basis tekst e-mail verzenden! 32 2011 2

Een HTML-mail verzenden! 33 Een HTML-mail verzenden met een attachment! 34 PDFʼs maken met PHP! 38 Cookies! 38 Toepassingen! 41 Toepassing1: SQL database koppeling! 41 Toepassing2: SQL toevoegen van een tupel in een database! 41 Toepassing3: SQL opvragen en beheren database gegevens! 42 Toepassing4: update tabelvelden vanuit een VIEW! 44 2011 3

Inleiding PHP & MySQL gevorderd Deze handleiding is een vervolg op basis en gevorderde PHP. De focus ligt volledig op de koppeling tussen PHP en een MySQL- database. Onderwerpen die aanbod komen zijn: hoe gegevens uit een MySQL-database gehaald kunnen worden, toegevoegd, geupdate en andere bewerkingen. De derde PHP-handleidingen geven een goede basis voor het toepassen van PHP met de juiste gereedschappen om zelf meer functionaliteit aan een website toe te voegen. Het vinden van de juiste, simpele en eenduidige code voor een behoefte blijft een combi van: zelf bedenken of vinden in ander (online) handleidingen of forums. Na de twee beschikbare handleidingen en de juiste drive, zal het zeker moeten lukken :-) Voorkennis voor PHP & SQL Ervaring hebben met inzicht in het volgende moeten hebben: HTML-code (en of XHTM). Gebruik en installatie van een webservers en een databases (bijv: Apache als web-server, MySQL als database of gecombineerd in: XAMPP of MAMP) Basiskennis van PHP. Basis SQL-statements (query- syntax en database begrippen) Database resources Om de PHP-code die in deze handleiding gebruikt word toe te passen is een database nodig. De eenvoudigste manier om dit te doen is door XAMPP of MAMP te installeren. Activeer naast Apache ook MySQL en maak hierin een database aan die benaderbaar is. De databasenaam moet bekend zijn, een gebruikersnaam en wachtwoord met uitsluitend de rechten die nodig zijn om de gewenste acties uit te kunnen voeren. Zie meer informatie hierover; zie materiaal over databases op kerssies64.net. Hier zijn ook exports te vinden van databases, die geïmporteerd kunnen worden in een eigen gemaakte database, waarna deze te gebruiken zijn om de gebruikte voorbeelden in deze handleiding uit te voeren uit te voeren. Door zelf databases met tabellen en content op te zetten wordt deze vaardigheid uiteraard verbeterd! 2011 4

De werking van een PHP-module op een webserver Ter opfrissing; PHP is een module die aan de server-kant werkt. De client krijgt uiteindelijk pure HTML-code toegestuurd waarmee een page wordt weergegeven. Hoe deze page tot stand is voor de client onzichtbaar. Hieronder staan wat gebeurt er als een php-webpagina wordt opvraagt door een client: 1. Aan de client zijde wordt een verzoek gedaan naar een (php)webpagina op een bepaalde webserver, bijvoorbeeld: www.kerssies64.net client 7. De ontvangen code wordt ontvangen door de client. In de browser wordt deze omgezet in een leesbare pagina 6. Het resultaat van de php-module wordt samengevoegd met eventueel aanwezige html-code. Deze code wordt door de webserver verstuurd naar de client 2. De webserver zoekt deze pagina op in z n filesysteem. 3. Omdat het een.php pagina is, stuurt de webserver deze pagina naar de php-module. Deze module moet op de webserver zijn geïnstalleerd 4. De php-module benaderd een database en voert hierop acties uit en geeft evt waarden terug database webserver.php 5. De php-module voert het phpscript uit en geeft het resultaat terug aan de webserver php-module 2011 5

Opbouw web-pages (php) Bij het maken van uitgebreidere websites wordt al snel duidelijk dat het overzicht al snel zoek is. Bij pure HTML-websites alleen al kan het overzicht zoek raken. De eerste stap ter verbetering is regels afbreken en vaker enteren. Door gebruik te maken van tabs, wordt het overzicht nog beter. Zeker wanneer er consequent wordt ingesprongen per tag en een tab wordt terug genomen wanneer deze wordt gesloten. Een uitkomst is het scheiden van opmaak en html-code, wat met CSS gebeurt. PHP & MySQL gevorderd Dit scheiden en overzichtelijk houden van code wordt steeds belangrijker. Zo kunnen bepaalde delen met includes in andere documenten worden gezet. Sessies moeten als eerste worden opgezet, en zo meer. Hieronder is een grafische weergave gegeven, als advies, hoe een phpdocument opgebouwd kan worden: <?php sessies starten variabelen instellen includes naar andere bronnen <html> <head> <title> titel browser-tab </title> link favicon.ico META voor "description" META voor "keywords" link CSS-bestand tbv opmaak HTML </head> <?php Alle PHP-logica en berekeningen <body> document opbouw en weergeven formulieren en content, evt dmv PHP-echo s </body> </html> 2011 6

MySQL MySQL is het populairste open-source databasesystemen, omdat deze database vrij te installeren en te gebruiken is, stabiel is en een goede ondersteuning heeft. De MySQL database wordt zeer vaak gebruikt in combinatie met PHP. De gegevens die in MySQL worden opgeslagen in tabellen. Een tabel is verzameling van ingevoerde gegevens die bestaan uit kolommen en rijen. Elke rij is een unieke set informatie die is opgebouwd uit meerdere kolomen elk met specifieke gegevens. De databases zijn handig voor het opslaan van informatie in categorieën. Een bedrijf zou een database kunnen hebben met de volgende tabellen: Werknemers, Producten, Klanten en Orders. Het beveiligen van phpmyadmin Tijdens de ontwikkeling van een website met daaronder een MySQL-database is het handig om de testomgeving op het locale-systeem te beveiligen. Als dit niet wordt gedaan, dan kan iedereen binnen het lokale-netwerk (LAN) de database benaderen en daarin wijzigingen maken. Dit komt door: Het beheer van de database gebeurt namelijk altijd met phpmyadmin phpmyadmin heeft een standaard login en geen wachtwoord Netwerk scanners kunnen up IP-adres vinden en zien dat er een webserver actief is en de database benaderen. (http://<ip-adres>/phpmyadmin, ) De phpmyadmin beveiligen kan als volgt: Maak een nieuwe gebruiker aan bij Rechten en geef die volledige toegang (ALL PRIVILEGES) Open config.inc.php in de XAMPP-map Zoek de volgende regels, of voeg ze toe: $cfg['blowfish_secret'] = 'wachtwoord'; $cfg['pmaabsoluteuri'] = http://127.0.0.1/phpmyadmin/'; $cfg['servers'][$i]['auth_type'] = 'cookie'; $cfg['servers'][$i]['user'] = 'gebruikersnaam'; $cfg['servers'][$i]['password'] = 'wachtwoord'; $cfg['servers'][$i]['allownopassword'] = false; Uiteraard moeten de eigen gegevens tussen de quotes komen. 2011 7

De opbouw van een database Een database bevat altijd één, maar mestal meerdere tabellen. Elke tabel moet en naam hebben (b.v. Klanten of Orders ). De tabellen bevatten records (rijen) met gegevens. Hieronder is een voorbeeld van een tabel genoemd Personen : ID achternaam tussenv voornaam adres hnr plaats 1 Pietersen Hans Doorweg 100 Zwolle 2 Kracht van Jip Straatlaan 3 Zwolle 4 Steijn Janneke Hobbelpad 28 Amersfoort De tabel bevat hierboven drie records (voor elke contactpersoon) zijn zes kolommen (AchterNaam, Tussen, VoorNaam, Adres, Nummer en Stad). Meer over de opbouw en constructie van databases is te vinden in de kerssies64.net readers databases en SQL, of andere (online) handleidingen. PHP koppelen met een Database Het maken van een koppeling met een database is de minimale vereiste om met PHP (of een andere taal) bewerkingen uit te voeren of vragen aan een database te stellen. In PHP, wordt de koppeling tussen het PHP- script en de database gedaan met de mysql_connect () functie. Syntaxis mysql_connect (servernaam, gebruikersbenaming, wachtwoord); Parameter servernaam login wachtwoord Beschrijving Optioneel; Specificeert de server om te verbinden met. De standaard waarde is localhost: 3306 Optioneel; Specificeert de gebruikersbenaming om het programma te openen. De standaardwaarde is de gebruiker die rechten heeft op het serverproces Optioneel; Specificeert het wachtwoord om in te loggen op de database. Standaard is:. Tip: Er zijn meer beschikbare parameters, maar de hierboven vermelde zijn het belangrijkst. Voor meer details wordt verwezen naar andere (online) materiaal. 2011 8

Het is verstandig meerdere gebruikers op de database aan te maken, zodat afhankelijk van de ingelogde gebruiker gespecificeerde database rechten beschikbaar komen. Bijvoorbeeld: PHP & MySQL gevorderd een administrator met alle rechten een administrator met alle rechten als reserve (wordt allen in nood gebruikt) een hoofdgebruiker waarmee online beheer op de database wordt uitgevoerd gebruiker(s) met beperkte rechten die afhankelijk van hun profiel gespecificeerde rechten op de database hebben De kerssies64.net site bevat enkele geëxporteerde tabellen die in een eigen database geïmporteerd kunnen worden, waarna de PHP-script code direct uitgevoerd kan worden. Let op dat de server, de databasenaam, het login en wachtwoord anders kunnen zijn... Voorbeeld: In het volgende voorbeeld slaat de koppeling in een variabele ($con) voor recenter gebruik in het script op. Het die gedeelte zal worden uitgevoerd als de koppeling niet opgebouwd kan worden: <html> <?php $con = mysql_connect('localhost',"login","ww"); //host kan ook IP-adres bevatten bijv: 127.0.0.1, of 10.0.2.100 if (!$con) die('geen connectie kunnen maken: '. mysql_error()); // eigen code else echo 'connectie opgebouwd'; mysql_close($con); //verbinding wordt gesloten met de database </html> Bij de servernaam wordt hier localhost gebruikt, maar dit is afhankelijk van de servernaam waarop de database is opgestart. In plaats van een naam kan er ook een IP-adres worden gebruikt. Localhost heeft altijd IP-adres 127.0.0.1, dit werkt gewoon. Net als elke ander IP-adres waar een server met database actief is, mits de poorten in de firewall open staan ;-). Een koppeling met een database zal automatisch worden gesloten wanneer het script beëindigt. Om de koppeling eerder te sluiten, gebruik dan de mysql_close () functie. 2011 9

Gegevens uit een database opvragen Een query is een vraag of een verzoek om gegevens uit een database. Met MySQL, kunnen specifieke gegevens worden opgevraagd en een recordset met gewenste informatie terug geven. Een voorbeeld van een simpele SQL- query: SELECT AchterNaam FROM Gebruikers De vraag selecteert hierboven alle gegevens in de kolom AchterNaam uit de tabel Gebruikers en kan een recordset zoals hieronder terug geven: AchterNaam Moes Blijvers Zetters Syntaxis SELECTEER kolom_naam FROM tabel_naam Om PHP het SQL- statement uit te laten voeren is de functie: mysql_query () nodig. Deze functie wordt gebruikt om een query of een opdracht naar een MySQL- koppeling te verzenden. Voorbeeld: <?php $con = mysql_connect('localhost',"login","ww"); if (!$con) die('geen koppeling met de database: '. mysql_error()); else echo 'connectie opgebouwd <br><br>'; mysql_select_db('phpsql', $con); //selecteerd de database $resultaat = mysql_query("select * FROM Gebruikers"); //zet query resultaat in een PHP-array while($row = mysql_fetch_array($resultaat)) echo $row["voornaam"]. " ". $row["achternaam"]; echo '<br />'; //voor elke record in de php-array wordt een regel gemaakt. mysql_close($con); 2011 10

Het voorbeeld slaat hierboven de gegevens op die door de functie mysql_query () zijn teruggekeerd in de variabele $resultaat. Daarna wordt mysql_fetch_array () functie gebruikt om de eerste rij van recordset als een array terug te geven. Elke vraag aan mysql_fetch_array () geeft de volgende rij in recordset. De whileloop loop door alle records in recordset om de waarden van elke rij te printen. Hiervoor wordt de $row variabele gebruikt: $row [ FirstName ] en: $row [ AchterNaam ]. Op het scherm wordt als uitkomst weergegeven: connectie opgebouwd Hans Pietersen Jip Kracht Janneke Steijn Natuurlijk kunnen de gegevens ook in een HTML- tabel worden weergegeven. Zie hiervoor PHP- basis materiaal van kerssies64.net. 2011 11

Syntaxen voor SQL-statements <? $con = mysql_connect ( localhost, login, ww ); if (! $con) die ( kon niet verbinden met:. mysql_error ()); mysql_select_db ( my_db, $con); $resultaat = mysql_query ( <SQL-STATEMENT>"); while ($row = mysql_fetch_array ($resultaat)) echo $row [ <Kolom1> ].. $row [ <Kolom2> ]; echo <br/> ; <? $con = mysql_connect ( localhost, login, ww ); if (! $con) die ( kon niet verbinden met:. mysql_error ()); mysql_select_db ( my_db, $con); $resultaat = mysql_query ( <SQL-STATEMENT> ); while ($row = mysql_fetch_array ($resultaat)) echo $row [ <Kolom1> ]; echo. $row [ <Kolom2> ]; echo. $row [ <Kolom3> ]; echo <br/> ; mysql_close ($con); TIP: Zet alle queries in één bestand en geef elke query een eigen variabele. Doormiddel van een include per web- page zijn alle variabelen queries beschikbaar. Bij wijzigingen in de database staan alle query bij elkaar, dit is makkelijker te beheren. TIP: Echo uit te voeren queries en probeer deze uit direct in de MySQL- database. Zo is het eenvoudig te controleren of een query wel correct is uitgewerkt. 2011 12

Invoegen van records Het INSERT INTOTO statement wordt gebruikt om nieuwe records aan een tabel toe te voegen in een aangegeven tabel. Syntaxis Het is mogelijk om het INSERT INTO statement op twee manieren te gebruiken. De eerste vorm specificeert niet de kolomnamen waarin de gegevens worden geplaatst, dus alleen de waarden worden genoemd in de juiste kolomvolgorde: INSERT INTO tabel_naam VALUES (Waarde1, Waarde2, Waarde3, ) De waarden worden ook op de zelfde volgorde in de kolommen geplaatst, deze vorm van invoeren wordt veel gebruikt wanneer altijd alle kolommen een waarde moeten hebben. De tweede vorm specificeert zowel de op te nemen kolomnamen als de waarden: INSERT INTO tabel_naam (kolom1, kolom2, kolom4, ) VALUES (Waarde1, Waarde2, waarde4, ) Om PHP deze sql- statements uit te laten voeren moet de mysql_query () functie gebruiken worden. Voorbeeld: In de tabel Gebruikers worden de kolommen: VoorNaam, AchterNaam en Plaats gevuld. Het volgende voorbeeld voegt twee nieuwe records toe aan de tabel Gebruikers : <? $con = mysql_connect ( localhost, login, ww ); if (! $con) die ( kon niet verbinden met:. mysql_error ()); mysql_select_db ( PHPsql, $con); mysql_query ( INSERT INTO Gebruikers (VoorNaam, AchterNaam, Plaats) VALUES ( Piet, Koetsier, Rotterdam ) ); mysql_query ( INSERT INTO Gebruikers (VoorNaam, AchterNaam, Plaats) VALUES ( Glenn, Azar, Naarden ) ); mysql_close ($con); 2011 13

Formuliergegevens toevoegen aan een Database Doormiddel van een HTML formulier worden de kolommen van een nieuw record gevult. Daarnaast wordt één veld gevuld door middel van autoincrement van MySQL en één veld wordt gevuld met een waarde uit een variabele. Het HTML-formulier: <html> <head> <title>invoegen Gebruiker</title> </head> <body> <form action="invoegen.php" method="post"> Voornaam: <input type="text" name="voornaam"> Tussen: <input type="text" name="tussen"> Achternaam: <input type="text" name="achternaam"><br> Adres: <input type="text" name="adres" /><input type="text" name="huisnr"><br> Plaats: <input type="text" name="plaats"><br> <input type="submit" /> </form> </body> </html> Het bestand invoegen.php verbindt zich met een server en daarna met een database. De mysql_query () functie bevat een variabele met daarin het INSERT INTO statement, en zal de gegevens uit het formulier toevoegen. Hier is de pagina invoegen.php : <html> <title>voer gegevens in </title> <body> <?php $con = mysql_connect ('localhost',"login","ww"); // koppeling met de database-server, gebruikersnaam en wachtwoord if (! $con) die ('kon niet verbinden met: '. mysql_error ()); echo 'OK, er is een verbinding <br>'; mysql_select_db ('PHPsql', $con); // PHPsql is de naam van de MySQL-database echo 'OK, de database is geselecteerd <br>'; $MemberDatum = date("y-m-d"); // datum wanneer een gebruiker is toegevoegd. echo 'Waarde nieuw record '.$MemberDatum.'<br>'; 2011 14

// ID in de tabel is 'autoincrement' en wordt automatisch door MySQL opgehoogd. $sql = "INSERT INTO Gebruikers (MemberDatum, AchterNaam, Tussen, VoorNaam, Adres, HuisNr, Plaats) VALUES ('$MemberDatum','$_POST[AchterNaam]', '$_POST[Tussen]', '$_POST[VoorNaam]', '$_POST[Adres]', '$_POST[HuisNr]', '$_POST[Plaats]')"; mysql_query ($sql,$con); // Tabelnaam en alle genoemde kolom-namen waarin de waarden vervolgens worden geplaatst if (! $con) echo "error"; else echo "1 record toegevoegd"; mysql_close ($con); </html> Query met WHERE en gegevens uit meerdere tabellen Syntax SELECT kolom(en) FROM tabel_naam WHERE kolom(en) en operator waarde AND tabel1.kolom-x = tabel2.kolom-x Voorbeeld: <?php $con = mysql_connect("localhost","login","ww"); if (!$con) die('geen verbinding met de database: '. mysql_error()); mysql_select_db("phpsql", $con); $sql = "SELECT AchterNaam, User, WachtWoord FROM Gebruikers, Login WHERE VoorNaam= Hans AND Gebruikers.ID = Login.ID ; $resultaat = mysql_query($sql) while($row = mysql_fetch_array($resultaat)) echo $row['achternaam']. " ". $row[user]. " ". $row[wachtwoord]; echo "<br />"; 2011 15

ORDER BY statement Syntax SELECT kolom(en) FROM tabel_naam ORDER BY kolom(en) ASC DESC <?php $con = mysql_connect("localhost","login","ww"); if (!$con) die('geen verbinding met de database: '. mysql_error()); mysql_select_db("phpsql", $con); $sql = SELECT AchterNaam, VoorNaam FROM Gebruikers WHERE Plaats = 'Zwolle' ORDER BY AchterNaam DESC ; $resultaat = mysql_query($sql); while($row = mysql_fetch_array($resultaat)) echo $row['achternaam']. " ". $row[voornaam]; echo "<br />"; 2011 16

Update van records De statement UPDATE wordt gebruikt om gegevens in een record van een tabel te wijzigen. Syntaxis UPDATE tabel_naam UPDATE kolom1=values, kolom2=values2, WHERE een_kolom=een_values Tip: Merk op dat de WHERE clausule in de syntaxis bij het UPDATE statement. WHERE specificeert welk record moeten worden bijgewerkt. Wordt de WHERE weglaten, dan zullen alle records worden bijgewerkt! Voorbeeld: Het volgende voorbeeld werkt sommige gegevens in de tabel van Personen bij : <? $con = mysql_connect ("localhost", "login", "ww"); if (! $con) die ('kon niet verbinden: '. mysql_error ()); mysql_select_db ("PHPsql", $con); mysql_query ("UPDATE Gebruikers SET Plaats = 'Groningen' WHERE VoorNaam = 'Hans' AND AchterNaam = 'Pietersen'"); echo 'update van record uitgevoerd'; mysql_close ($con); 2011 17

Verwijderen van records Het DELETE statement wordt gebruikt om records uit een tabel te verwijderen. Syntaxis DELETE FROM tabel_naam WHERE enkele_ kolom= enkele_waarden Tip: Merk op dat de WHERE clausule in de syntaxis bij het DELETE statement. WHERE specificeert welk record moeten worden verwijdert. Wordt WHERE weglaten, dan zullen alle records worden verwijdert! Het volgende voorbeeld verwijdert alle records in de tabel van Gebruikers waar AchterNaam Pietersen is: <? $con = mysql_connect ("localhost", "test", "test"); if (! $con) die ("kon niet verbinden: ". mysql_error ()); mysql_select_db ("PHPsql", $con); mysql_query ("DELETE FROM Gebruikers WHERE AchterNaam='Pietersen'"); echo "record verwijderd <br>" mysql_close ($con); 2011 18

Meer PHP functies voor MySQL bewerkingen (engelse uitleg) Functie mysql_affected_rows() mysql_change_user() mysql_client_encoding() mysql_close() mysql_connect() mysql_create_db() mysql_data_seek() mysql_db_name() mysql_db_query() mysql_drop_db() mysql_errno() mysql_error() mysql_escape_string() mysql_fetch_array() mysql_fetch_assoc() mysql_fetch_field() mysql_fetch_lengths() mysql_fetch_object() mysql_fetch_row() mysql_field_flags() mysql_field_len() mysql_field_name() mysql_field_seek() mysql_field_table() mysql_field_type() mysql_free_result() mysql_get_client_info() mysql_get_host_info() mysql_get_proto_info() mysql_get_server_info() mysql_info() mysql_insert_id() Beschrijving Returns the number of affected rows in the previous MySQL operation Deprecated. Changes the user of the current MySQL connection Returns the name of the character set for the current connection Closes a non-persistent MySQL connection Opens a non-persistent MySQL connection Deprecated. Creates a new MySQL database. Use mysql_query() instead Moves the record pointer Returns a database name from a call to mysql_list_dbs() Deprecated. Sends a MySQL query. Use mysql_select_db() and mysql_query() instead Deprecated. Deletes a MySQL database. Use mysql_query() instead Returns the error number of the last MySQL operation Returns the error description of the last MySQL operation Deprecated. Escapes a string for use in a mysql_query. Use mysql_real_escape_string() instead Returns a row from a recordset as an associative array and/or a numeric array Returns a row from a recordset as an associative array Returns column info from a recordset as an object Returns the length of the contents of each field in a result row Returns a row from a recordset as an object Returns a row from a recordset as a numeric array Returns the flags associated with a field in a recordset Returns the maximum length of a field in a recordset Returns the name of a field in a recordset Moves the result pointer to a specified field Returns the name of the table the specified field is in Returns the type of a field in a recordset Free result memory Returns MySQL client info Returns MySQL host info Returns MySQL protocol info Returns MySQL server info Returns information about the last query Returns the AUTO_INCREMENT ID generated from the previous INSERT operation 2011 19

mysql_list_dbs() mysql_list_fields() mysql_list_processes() mysql_list_tables() mysql_num_fields() mysql_num_rows() mysql_pconnect() mysql_ping() mysql_query() mysql_real_escape_string() mysql_result() mysql_select_db() mysql_stat() mysql_tablename() mysql_thread_id() mysql_unbuffered_query() Lists available databases on a MySQL server Deprecated. Lists MySQL table fields. Use mysql_query() instead Lists MySQL processes Deprecated. Lists tables in a MySQL database. Use mysql_query() instead Returns the number of fields in a recordset Returns the number of rows in a recordset Opens a persistent MySQL connection Pings a server connection or reconnects if there is no connection Executes a query on a MySQL database Escapes a string for use in SQL statements Returns the value of a field in a recordset Sets the active MySQL database Returns the current system status of the MySQL server Deprecated. Returns the table name of field. Use mysql_query() instead Returns the current thread ID Executes a query on a MySQL database (without fetching / buffering the result) 2011 20

PHP security Beveiliging van de database is erg belangrijk, er staan namelijk allerlei belangrijke gegevens in zoals: gebruikersnamen, wachtwoorden, adresgegevens, mail- adressen, rekeningnummers/ creditcardnummers, etc. Wachtwoord onleesbaar voor database- administrators Met dit onderdeel worden enkele mogelijkheden getoond waarmee gegevens geverifieerd kunnen worden of worden versleuteling worden opgeslagen in de database. Een database- administrator heeft dan wel toegang tot de database, maar kan gegevens niet lezen, zoals bijvoorbeeld een wachtwoord. Zo is het mogelijk strings en bestanden te coderen. Maar ook om aangeboden bestanden te controleren of ze wel een origineel zijn van de aanbieder. Encryptie mogelijkheden zijn: Functie crc32() crypt() str_rot13() sha1() Beschrijving crc32(string) Berekend een 32-bit CRC (cyclisch redundantie checksum) voor een string crypt(string,moeilijkheid) de moeilijkheid is standaard 1, de hoger het cijfer, de moeilijker te kraken str_rot13(string) Het coderen met ROT13 verplaatst elke karakter 13 plaatsen in het alfabet. De numerieke en nietalfabetische karakters blijft staan. sha1(string,raw) sha1 op een string Optie: Specifcaties voor hex of binary output formaat: TRUE - exacte 20 character binary format FALSE - standaard. 40 character hex number sha1_file() md5() md5_file() sha1_file(bestand,raw) Sha1 op een bestand. $bestand = "voorbeeld.txt"; $sha1b = sha1_file($bestand); md5(string,raw) Berekend de MD5 hash van een string Optie: TRUE - Raw 16 karakter binary formaat FALSE - Standaard. 32 karakter hex nummer md5_file(file,raw) Berekend de MD5 hash van een bestand CRC32 op een string: 2011 21

<html> <?php $string = crc32("kerssies 64"); // het verschil met of zonder %u ligt in de spatie echo 'zonder %u: '.$string."<br />"; echo 'met %u: '; printf("%u",$string); </html> Het resultaat, de verschillen liggen in de speciale tekens in een string: zonder %u: -1712303409 met %u: 2582663887 MD5 toegepast op een string: <html> <?php $str = "Hello"; echo md5($str); </html> Het MD5 resultaat: 8b1a9953c4611296a827abf8c47804d7 Door gebruik te maken van encryptie kunnen gegevens gecodeerd worden bewaard in een tekst- bestand of database. Gebruikers en (sub)beheerders kunnen dan gevoelige informatie, zoals wachtwoorden of privé gevoelige data, niet zomaar lezen... 2011 22

Verschillende coderingen en encryptie toegepast: <html> <?php if (CRYPT_STD_DES == 1) echo "Standard DES: ".crypt("kerssies64.net applying knowlegde")."\n<br />"; else echo "Standard DES wordt niet ondersteund.\n<br />"; if (CRYPT_EXT_DES == 1) echo "Extended DES: ".crypt("kerssies64.net applying knowlegde ")."\n<br />"; else echo "Extended DES wordt niet ondersteund.\n<br />"; if (CRYPT_MD5 == 1) echo "MD5: ".crypt("kerssies64.net applying knowlegde ")."\n<br />"; else echo "MD5 wordt niet ondersteund.\n<br />"; if (CRYPT_BLOWFISH == 1) echo "Blowfish: ".crypt("kerssies64.net applying knowlegde "); else echo "Blowfish DES wordt niet ondersteund."; </html> Het resultaat op basis van het operating systeem kan zijn: Standard DES: 8kGC9cr6g59Sg Extended DES: s65gp10pq3tss MD5 wordt niet ondersteund. Blowfish DES wordt niet ondersteund. 2011 23

Validatie op invoervelden. Lege invoervelden of incorrecte gegevens in een formulier zorgen ervoor dat er vervuiling van de database ontstaat. Door de ingevoerde gegevens aan een bepaalde opmaak te controleren wordt ervoor gezorgd dat alleen de juiste informatie in een query wordt gezet. De functie preg_match is hierbij erg handig. Wanneer de validatie van de voornaam niet klopt, dan wordt er een uitroepteken voor het invoerveld geplaatst. Dit staat in een tabel-cel zodat de uitlijning met eventuele regels daaronder intact blijft... Tevens wordt er de variabele $v_fouten opgehoogd als er een incorrecte validatie is waargenomen. Deze variabele kan weer worden gebruikt... code... <?php $v_fouten = 0; //startwaarde fouten bij validatie if (!preg_match ($vp_naam,$_post['voornaam'])) echo '<b><font COLOR="red">!</FONT><B>'; $v_fouten = $v_fouten+1; <INPUT TYPE="text" NAME="voornaam" value="<?php echo $_POST['voornaam'];" SIZE="25" MAXLENGTH="25">... meer code... echo 'het aantal validatie fouten bij de invoer is: '. $v_fouten; if(isset($_post[bewaar]) && $v_fouten!= 0 ) elseif (isset($_post[bewaar]) && $v_fouten == 0) if ($_SESSION['profiel'] == 0 ) $_SESSION['profiel'] = 1; include ("SaveAccount.php"); // php script waar update query wordt uitgevoerd. else echo '<br>er is een problemen, neem contact op met de beheerder'; 2011 24

validatie.php, bevat diverse variabelen met validatie- strings voor preg_match. <?php //naam validatie $vp_naam = '/^[A-Z]1[A-Za-z -]1,+$/D'; //tussen $vp_tussen = '/^[a-z\-]2,8+$/d'; // ook "" akkoord //nummer $vp_nummer = '/^([0-9])+$/D'; // toevoegsel bij huisnummer van een adres // Toevoegsel $vp_toev = '/^([a-za-z-0-9]1,3)+$/d'; // ook "" akkoord // nederlands postcode $vp_postcode ='/^[0-9]4+([a-z]2 [A-Z]2)$/D'; //landsnaam validatie $vp_land ='/^[A-Z]1[a-z]1,$/D'; // ook "" akkoord //Huistelefoon $vp_telefoon ='/^(0[1-9]2\-[0-9]7) (0[1-9]3\-[0-9]6)$/D'; // ook "" akkoord //mobiel nummer $vp_mobiel ='/^(0[0-9]1\-[0-9]8)$/D'; // ook "" akkoord // email $vp_mail = '/^[a-za-z0-9&\.\-_]+@[a-za-z0-9\-_]+\.([a-za-z0-9\-]+\.)*+[a-z]2,3$/d'; // ook "" akkoord //datum $vp_datumeu = '/^0[1-9]1 1[0-9]1 2[0-9]1 3[01]1\-0[1-9]1 1[012]1\-19 20[0-9]2$/D'; $vp_datumeu2 = '00-00-0000'; $vp_datumus = '/^19 20[0-9]2\-0[1-9]1 1[012]1\-0[1-9]1 1[0-9]1 2[0-9]1 3[01]1$/D'; //tijd $vp_tijd = '/^0[0-9]1 1[0-9]1 2[0-4]1[\:]0[0-9]1 1[0-9]1 2[0-9]1 3[0-9]1 4[0-9]1 5[0-9]1$/D'; //geldbedrag $vp_geld ='/^[0-9]1,.[0-9]2$/D'; // ook "" akkoord 2011 25

vervolg validatie.php // rekeningnummer IBAN voorbeeld: DE05.1002.0500.0003.2873.00 $vp_gironr = '/^[0-9]7+$/D'; $vp_rekeningnr = '/^[0-9]9+$/D'; $vp_iban = '/^[A-Z]2[0-9]2+[\.-]+[0-9]4+[\.-]+[0-9]4+[\.-]+[0-9]4+[\.-]+[0-9]4+ [\.-]+[0-9]2+$/D'; // ook "" akkoord // gebruiker tbv accountnaam (minimaal 6 karakters) $vp_account = '/^[a-za-z0-9&\.\-_\+\!@#$%&]6,$/d'; // wachtwoord (minimaal 8 karakters) $vp_ww = '/^[a-za-z0-9&\.\-_\+\!@#$%&]8,$/d'; // memo (minimaal 2 karakters) $vp_memo= '/^[a-za-z0-9&\.\-_\+\!?%&]2,$/d'; De validatie kan nog beter met look-forward en look-backward optiesin preg_match. Capcha (no-robot invoer beveiliging) Om te voorkomen dat robot s ofwel computers allerlei combinaties los laten op invoervelden kan een capcha worden. Er wordt een willekeurige code ( aantal cijfers, letters of een combinatie) gegenereerd die de gebruiker moet intypen voordat hij verder mag. Grbruik van capcha s worden vaak gebruikt bij: Vanaf een website e-mail versturen naar een gebruiker Een nieuw wachtwoord aanvragen Op het internet zijn gratis code-blokken te vinden die hier geschikt voor zijn. De kunst is om een gewenste uitvoervorm te vinden die tevens eenvoudig is in te voegen tussen de bestaande code. 2011 26

IP- highjacking Bij IP-highjacking maakt een hacker gebruik van sessie gegevens van een ingelogde gebruiker. Wat echter (meestal) ongelijk is is het IP-adres waarvandaan een hacker toegang verschaft tot de site. Door het IP-adres bij het inloggen in een sessie te zetten en deze te controleren met het IP-adres van de gebruiker die een web-page opend kan dit worden voorkomen. actie bij het inloggen: $_SESSION['remoteIPlogin'] = $_SERVER['REMOTE_ADDR']; // eerder opgeslagen ip gebruiker (normaal moeten deze waarde tijdens inloggen worden ingesteld) acties bij het openen van elke webpage (evt met een include toegoegen): <?php ini_set(display_errors, 0); // error niet weergegeven --> fout opnieuw sessie starten session_start(); if ( mysql_real_escape_string($_session['remoteiplogin'])!= mysql_real_escape_string($_server['remote_addr']) ) session_destroy(); mysql_close($con); echo '<meta http-equiv="refresh" content="0; url= index.php">'; 2011 27

Invoerveld beveiligingen tegen sql-injections. Bij capcha s is al aanbod gekomen dat invoervelden een zwak punt zijn van een website met daar achter een database. Het is handig om de volgende tips in ieder geval op te volgen: Maximaliseer het aantal in te voeren karakters invoervelden door maxlength te gebruiken. <input name="username" size="15" maxlength = 20 type="text"> <br> <input name="password" size="8" maxlength = 8 type="password"> Ook is het mogelijk om gebruik te maken van zogenaamde sql injections, hierbij wordt er in een invoerveld code geplaatst waardoor er een stukje script tussen het originele script wordt gezet. De geposte waarden (met code) worden in een query naar de database gestuurd en uitgevoerd. Het gevolg kan zijn dat er een query wordt uitgevoerd die gegevens of delen van de database bloot geeft. Gebruik daarvoor een escape-string, deze haal slahes, punt-komma s en andere programmeercode karakters uit de geposte string. (oa / en ; ), waardoor de sql-injection zijn noodzakelijke karakters verliest. $wachtwoord = mysql_real_escape_string($_post['wachtwoord']); of $wachtwoord = addslashes($_post['wachtwoord']); 2011 28

Sessies In sessie kunnen gegevens worden opgeslagen die later worden gebruikt in de web-site. Hiervoor moet helemaal in het begin wan een php-page het volgende stukje code staan. : <?php PHP & MySQL gevorderd session_start(); Als er een web-pagina wordt geopend zonder deze functie, dan vervalt de sessie. Sessie beveiliging Door gebruik te maken van de sessies kan er een nieuw soort beveiliging worden toegepast op web-pages. Zonder deze techniek heeft inloggen geen enkele zin.door in de browser-historie halen URL s te benaderen of gewoon URL s te proberen kan een gebruiker web-pages benaderen die niet gezien mogen worden, hoewel de link niet wordt weergegeven in een van de publiekelijk te benaderen webpages. Acties die per webpage ingesteld moeten zijn of worden: <?php ini_set(display_errors, 0); // error niet weergegeven --> fout opnieuw sessie starten session_start(); // initiatie - input tbv simulatie $_SESSION['profiel'] = 3; // profiel gebruiker instellen (normaal moeten deze waarde tijdens inloggen worden ingesteld) $level = 3; // welk profiel deze page mag zien (deze waarde voor elke page instellen op de page zelf) $pass = mysql_real_escape_string($_session['profiel']); $level = mysql_real_escape_string($level); Controle of de gebruiker de webpage mag zien, dit wordt bepaald door de waarde van het profiel: level <=0; geen rechten level 1; toegang als level 2; toegang als level 3 overal toegang, gebruiker user level >=4; geen rechten admin 2011 29

Valt het profiel buiten de toegestane waarden of is het level om een web-page te zien hoger dan het profiel dat is ingelogd, dan wordt een andere web-page weergegeven. if ($pass!= 0 && $pass!= 1 && $pass!= 2 && $pass!= 3) // voorkomt doorlaten van webpages door het intypen van URL's in de adresbalk van de browser // beveiliging: Lege profiel variabelen proberen pages te openen zonder in te loggen session_destroy(); mysql_close($con); echo '<meta http-equiv="refresh" content="0; url= NietToegestaan.html">'; elseif ($pass < $level) // gebruiker heeft geen rechten op pages hoger dan zijn eigen profiel echo '<meta http-equiv="refresh" content="0; url= NietToegestaan.html">'; <html> <body> <h2>webpage </h2> Inhoud website </body> </html> 2011 30

Sessie-tijd Wanneer een gebruiker is ingelogd en wegloopt bij zijn website, dan kunnen onbevoegden gebruikmaken van functionaliteiten waartoe ze geen rechten hebben. Door een sessietijd in te stellen op de webserver of met php-code aan de site toe te voegen, zal de site na een ingestelde tijd uitloggen en de index-pagina weergeven. $aantal_min = 1; //minuten instellen $inactief = 60 * $aantal_min; // aantal minuten in seconden $nu = time(); $sessie_duur = $nu - $_SESSION['timeout']; echo 'sessie duur: '.$session_duur.'<br>'; echo 'sessie: '.time().' - '.$_SESSION['timeout'].' = '.$sessie_duur.'<br>'; echo 'inactief: '.$inactief.' seconden<br>';*/ // sessietijd als idle-tijd te lang is if(isset($_session['timeout']) ) $sessie_duur = time() - $_SESSION['timeout']; if($sessie_duur > $inactief) session_destroy(); header("location: sessietijdverkopen.html"); // <html> <body> <h2>webpage </h2> <FORM METHOD="post" ACTION="index.php"> <I>klik voor herladen:</i> <INPUT TYPE="submit" VALUE="herladen"> </FORM> </body> </html> Onderaan de webpage wordt de huidige tijd (laatste actie) opnieuw in een sessie gezet: // huidige tijd in de sessie zetten $_SESSION['timeout']=time(); 2011 31

Mailen met PHP Basis tekst e-mail verzenden Met PHP is het mogelijk berichten via mail te versturen. Dit kan alleen als de webserver ook een maildienst (SMTP) heeft draaien. Een eenvoudig script om te mailen: ini_set ( 'SMTP', ''smtp_server''); //(optioneel) servernaam, bijv: mail.provider.nl ini_set ( 'smtp_port', ''smtp_poort''); // (optioneel) poort, meestal: 110 $to = test@provider.nl ; $subject = Mail onderwerp ; $txt = 'Beste gebruiker, Hier volgt de body van het mail bericht. Type gewoon enkele regels tekst, eventueel met daarin variabelen verwerkt. '.$mail_bericht['mailbody1'].' mvg, kerssies64.net ; $headers = 'From: beheerder <'.$array['mailadres'].'>'; mail($to,$subject,$txt,$headers); Uiteraard moet het e-mail adres waarnaar verstuur wordt kloppen, dit hoeft echter niet voor het mailadres waarvan het verstuurd wordt. Bedenk wel spammen is strafbaar!!! Denk bij e-mail adressen waar je vanaf verstuurd ook aan: noreply@provider.net of info@provider.nl 2011 32

Een HTML-mail verzenden Wanneer een simpele mail met PHP verstuurd kan worden is het vrij eenvoudig om er een HTMLmailtje van de maken. Er worden de header krijgt andere inhoud en de boodschap bevat HTMLtags en opmaak. Hieronder is een simpel voorbeeld weergegeven: <html> <head> <title>html-mail</title> </head> <body bgcolor="#hbd9ff"> <?php if (isset($_post[zend])) $newline = "\r\n"; $headers = "MIME-Version: 1.0". $newline; $headers.= "Content-type: text/html; charset=utf-8". $newline; $headers.= "From: blabla <test@test.nl>". $newline; $to = $_POST[email]; $subject = "Test mail"; $message = '<html><body bgcolor = "grey">'; $message.= '<img height ="50" src="http://www.backups.nl/images/windows%20mail.png" /><hr>'; $message.= 'Hallo,<br>Bedankt voor uw reactie.<br>uw gegevens zijn bewaard.<br>'; $message.= 'groet, de Beheerder<hr></body></html>'; mail($to,$subject,$message,$headers); <script type="text/javascript"> <!-- alert ("de html-mail is verstuurd \r\n<?php echo $_POST[email];" ) --> </script> <?php <form name="form1" method="post" action="index.php"> <div align="center"> <h1>html-mail versturen</h1><br /> <input name="email" type="text" value=""><br /> <input type="submit" name="zend" value="verstuur mail"> </div> </form> </body> </html> 2011 33

Een HTML-mail verzenden met een attachment Een werkende HTML-mailer kan eenvoudig worden uitgebouwd. Het voorbeeld hieronder upload bestanden naar een vaste map, waarna deze worden toegevoegd aan een HTML-mailtje. ook is er een prioriteiten veld aan toegevoegd. <html> <head> <title>html-mail + att</title> </head> <body bgcolor="#hbd9ff"> <?php // >> uploaden bestand naar map "upload" $targetfolder = "attachments/"; //uploadfolder bepalen (pad) $targetfolder = $targetfolder.basename( $_FILES['uploaded']['name']); $uploaded_size = filesize($_files['uploaded']['size']); $uploaded_type = filesize($_files['uploaded']['type']); $ok=1; // >> beperkingen uploads $max_mb = 5000; if (isset($_post[upload]) && $uploaded_size > $max_mb) // beperk bestands grootte echo "Het bestand is groter dan ".($maxmb/1000). "MB <br> Upload een kleiner bestand<br>"; $ok=0; if (isset($_post[upload]) && $uploaded_type == "text/php") // pregmatch op extentie //Beperk het soort bestanden echo "PHP-bestanden mogen niet worden geupload<br>"; $ok=0; if (isset($_post[upload]) && $ok==0 ) //Error-melding wanneer $ok == 0 echo "Het bestand voldoet niet aan de voorwaarden"; else //Er is voldaan aan upload-voorwaarden -> uploaden bestand if(move_uploaded_file($_files['uploaded']['tmp_name'], $targetfolder)) echo "Het bestand <b>". basename( $_FILES['uploadedfile']['name']). "</b> is geupload naar de map"; unset($_post[submit]); 2011 34

//Bekijk eerst de bronversie van een ontvangen e-mail in je mail-applicatie (mail-format) if (isset($_post[zend])) $newline = PHP_EOL; //"\r\n" $separator = md5(time()); $prioriteit = $_POST['prioriteit']; // 1 of 0 $to = $_POST[email]; $subject = "Test mail"; $headers.= "From: blabla <test@test.nl>".$newline; if ($prioriteit == 1) $headers.="x-priority: 1". $newline. "Priority: Urgent". $newline. "Importance: high". $newline; // basis = 0 - Normal - normal $headers.= "MIME-Version: 1.0".$newLine; $headers.= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$newline. $newline; $headers.= "Content-Transfer-Encoding: 7bit".$newLine; $headers.= "This is a MIME encoded message.".$newline.$newline; // start header voor message $headers.= "--".$separator.$newline; $headers.= "Content-type: text/html; charset=utf-8". $newline; $headers.= "Content-Transfer-Encoding: 8bit".$newLine.$newLine; // afbeeldingen (embedded) in message $source_file = "globe.png"; // link naar bestand $handle = fopen($source_file,'rb'); // b-flag om binary-bestanden toe te voegen, anders alleen tekst $file_content = fread($handle,filesize($source_file)); fclose($handle); $encoded = chunk_split(base64_encode($file_content)); $headers.= '<html><body bgcolor = "green">'; //$headers.= 'afb van een exteren link: <img height ="50" src="http://www.backups.nl/images/windows%20mail.png" /><hr>'; //$headers.= '<br>'; //$headers.= 'afb embedded met base64: <object type="image/png" data="data:image/png;base64,'.$encoded.'" width="150" height="150"/></object><hr>'; $headers.= '<br>'; $headers.= 'Hallo,<br> '.$_POST[mail_content].'<br>'. 'Bedankt voor uw reactie.<br><br> Er volgt nog een attachement...<br>'; $headers.= 'groet, de Beheerder<hr></body></html>'; $headers.= $newline; 2011 35

// >>>> voe attachments uit map toe aan mail $path = 'attachments/'; $dir = scandir($path); // was "attachments" // print_r($dir); $aantal_files = count($dir); for ($i =0; $i < $aantal_files; $i++) if ($dir[$i]!= '.' && $dir[$i]!= '..') $full_path = $path.$dir[$i]; $size = filesize($full_path); $attach = fopen($full_path,"rb"); $data = fread($attach,$size); $attachment = chunk_split(base64_encode($data)); $headers.= $newline."--".$separator.$newline; $headers.= "Content-Transfer-Encoding: base64".$newline; $headers.= 'Content-Disposition: attachment; filename="'.$dir[$i].'"; size='.$size.';'. $newline.$newline; //inline; $headers.= $attachment.$newline.$newline; if (mail($to,$subject,"",$headers)) <script type="text/javascript"> <!-- alert ("de html-mail is verstuurd \r\n<?php echo $_POST[email];" ) --> </script> <?php else echo 'fout bij versturen mail'; PHP & MySQL gevorderd Hieronder wordt het formulier weergegeven om een mailtje met prioriteit te verzenden en attachemts toe te voegen. 2011 36

<!-- /////to = opmerking... ////// --> <form name="form1" method="post" action="index.php"> <div align="center"> <h1>html-mail versturen met attachements</h1> met upload naar folder<br /> <table> <tr> <td colspan="2"><input type="submit" name="zend" value="verstuur mail"> </td> </tr> <tr> <td>to<input name="email" type="text" size="42" value="<?php echo $_POST[email];? >"></td> <td><input TYPE="checkbox" NAME="prioriteit" VALUE="1">prio</td> </tr> <tr> <td colspan ="2"width="200px" height="70px"> html-bericht<textarea name="mail_content" ROWS="4" COLS="50" wrap="hard" value="<?php echo $_POST[mail_content];" /> </TEXTAREA> </td> </tr> </form> <form enctype="multipart/form-data" action="index.php" method="post"> <tr> <td><input name="uploaded" type="file" /></td> <td><input type="submit" name="upload" value="upload" /></td> </tr> </form> <?php $dir = opendir("attachments"); //Lijst bestanden in aangegeven directory while ($file = readdir($dir)) if ($file!= '.' && $file!= '..') echo "<tr><td>filename: </td><td>". $file. "</td></td>"; //closedir($dir); echo '<hr>'; </table> </div> </body> </html> 2011 37

PDFʼs maken met PHP Soms wil je gegevens omzetten in een pdf-bestand. Hiervoor kan je naar FPDF (http://www.fpdf.org/), daar staat php-code in een class (object georienteerd stukje php-code). Dit is aan te passen naar je eigen wensen. Er zitten drie stijlen van tabellen in de class, namelijk een eenvoudig-, nettere- en uitgebreidere-versie. Het aantal kolommen, breedtes en de kleuren zijn aan te passen. Uiteraard zijn er meerdere stukken php-code op het Internet te vinden die het zelfde kunnen bieden. Cookies Een cookie wordt vaak gebruikt om een gebruiker te identificeren. Een cookie is een klein bestandje dat de server op de computer van de gebruiker plaatst. Wanneer een browser om een webpagina vraagt, dan de server ook een cookie verzenden. Met PHP, kunnen cookie- waarden worden verstuurd en opgehaald. Als een gebruiker eenmaal is ingelogd, dan kunnen de login gegevens in een cookie op het cliëntsysteem worden opgeslagen. Bij een volgend bezoek kunnen de standaard waarden automatisch worden ingevuld met de waarden uit het cookie... Let o, cookies kunne privé gegevens bevatten en bij gebruik van onder andere publiekelijke PC s is dit niet wenselijk. Een Cookie maken De setcookie () functie wordt gebruikt om een cookie te plaatsen. Tip: De setcookie () functie moet VOOR de <html>markering worden geplaatst. Syntaxis setcookie (naam, waarde, verloopt, pad, domein); 2011 38

Voorbeeld 1: In het voorbeeld hieronder wordt een cookie met de naam gebruiker aangemaakt met de waarde Jan van Berg. Na één uur moet verlopen (+3600 seconden): <? setcookie ( gebruiker, Jan van Berg, tijd () +3600); <html>... PHP & MySQL gevorderd Tip: De waarde van het cookie is automatisch URLencoded, een cookie verzenden is gecodeerd en automatisch gedecodeerd bij ontvangst (om geen URLencoding te gebruiken moet setrawcookie () worden gebruikt) Voorbeeld 2: U kunt de aflooptijd van het cookie op een andere manier ook plaatsen. Het kan gemakkelijker zijn dan gebruikend seconden. <? $verloopt=time () +60*60*24*30; setcookie ( gebruiker, Jan van der Berg, $verloopt); <html>... In het voorbeeld hierboven is de verlooptijd een maand (60 seconden * 60 min * 24 uren * 30 dagen). De waarde van een cookie opvragen De PHP $_COOKIE variabele wordt gebruikt om een cookies waarde op te vragen. Hieronder worden alle gebruiker- waarde van het cookie genoemd getoond het op een pagina: <? // Print een cookie echo $_COOKIE [ gebruiker ]; // Een manier om alle cookies te bekijken print_r ($_COOKIE); In het volgende voorbeeld is de isset() functie gebruikt om te controleren of het cookie is geplaatst: <html> <body> <? if (isset ($_COOKIE [ gebruiker ])) echo Welkom. $_COOKIE [ gebruiker ].! <br/> ; else echo U bent gast op onze site <br/> ; </body> </html> 2011 39

Een Cookie verwijderen Wanneer een cookie verwijdert moet worden, dan moet de vervaldatum in het verleden liggen. Dit kan terug gezet worden... Voorbeeld om een cookie te verwijderen: <? // stelt de vervaldatum aan, en wordt één uur geleden setcookie ( gebruiker, "", tijd () - 3600); Wat als Browser Geen Cookies steunt? Als de gebruikte browser geen cookies ondersteund, dan zijn er andere methodes om gebruikinformatie van één pagina tot een andere in uw toepassing over te gaan. Één methode is de gegevens door formulieren (een formulier vraagt om gebruikersinput en is eerder behandeld). Het formulier vraagt de gebruiker om informatie en stuurt dit naar groet.php, wanneer de gebruiker op de submit knop klikt: <html> <body> <form name= form method= " post action= " welkom.php " " > Naam: <input type= "text" name= " naam "/> Leeftijd: <input type= "text" name= " leeftijd "/> <input type= submit name= verstuur value = verstuur > </form> </body> </html> Win de waarden in het file groet.php als dit terug: <html> <body> Welkom <? echo $_POST [ naam ];.<br/> U bent <? echo $_POST [ leeftijd ]; oude jaren. </body> </html> 2011 40

Toepassingen Toepassing1: SQL database koppeling Het koppelen met een database wordt gedaan bij het laden van een website. Het opbouwen moet zo veilig mogelijk op de server staan. Als de toegang tot de database beschikbaar komt voor derden, dan liggen alle gegevens op straat. Zet dit bij voorkeur in de private_html map van je webserver en include deze code in de site. $host = 'localhost'; $username = "user_db"; $password = "wachtwoord_db"; $database = "db_naam"; $con = mysql_connect($host, $username, $password); if (!$con) die('geen connectie gemaakt met DB: '. mysql_error()); else //connectie met database maken mysql_select_db($database, $con); Toepassing2: SQL toevoegen van een tupel in een database Na connectie met de database wordt er na het klikken van de knop invoegen worden de acoountgegevens uit het formulier toegevoegd in de tabel. include("../private_html/site/db_connect.php"); $q_invoegen_account = INSERT INTO tabel_account VALUES (email, voornaam, tussenv, achternaam, adres, hnr, plaats) ; if (isset($_post[invoegen]) && $invoerfouten == 0) // uitvoeren na klik invoegen mysql_query($q_invoegen_account); meer code, waarin een formulier zit met knop om de velden als nieuwe gebruiker toe te voegen 2011 41

Toepassing3: SQL opvragen en beheren database gegevens Een query die alle account gegevens uit een database haalt en in een tabel weergeeft. Alle gegevens worden in een formulier weergegeven, zodat de gebruiker dit kan aanpassen en updaten. Met een formulier daaronder kan het record worden verwijdert. Elke regel met de gegevens van een account heeft een eigen achtergrondkleur. Dit kan met CSS worden gedaan (er is geen css-uitwerking meegeleverd). Ook bevat elke regel een bewerk- en verwijder-knop. Na 2 includes,staat er acties die uitgevoerd worden mist die knop is geklikt (viewaccounts.php): include("../private_html/site/db_connect.php"); include(../private_html/site/queries.php ); if (isset($_post[ja])) // uitvoeren na klik op ja-knop mysql_query("start TRANSACTION;"); // transactie mysql_query($delete_aankopen_account); mysql_query($delete_gegevens_account); mysql_query($delete_account); mysql_query("commit;"); if (isset($_post[update])) // uitvoeren na klik op update-knop mysql_query($update_account); if (isset($_post[verwijder]) ) // Delete Ja/Nee -keuze; alleen weergeven wanneer er is geklikt op delete echo'<table class ="JaNee"><tr> <td> <form name= "ZekerJa" action="viewaccounts.php" method="post"> <input name="ja" type="submit" value="ja"> </form> </td> <td> <form name= "ZekerNee" action="viewaccounts.php" method="post"> <input name="nee" type="submit" value="nee"> </form> </td> <td class ="JaNee"></tr></table>'; Query om accounts op te vragen wordt uitgevoerd en een tabel wordt opgezet. $accountszoeken = mysql_query($zoekaccount_q); $lijn = 0; // variabele achtergrondkleuren per regel echo '<table border = "0" cellpadding = "0" cellspacing = "0">'; De regels met accounts wordt weergegeven door een while-loop: while ($gevondenaccounts = mysql_fetch_array($accountszoeken)) $accid = $gevondenaccounts['u_id']; $lijn ++; echo '<tr CLASS= '; if ($lijn & 1) echo ' "odd" '; else echo ' "even" '; echo '>'; // CSS-class even en odd elk met een eigen achtergrond-kleur echo '<FORM NAME="view_update_account" ACTION="viewaccounts.php" method="post">'; // het email-account maakt een gebruiker uniek en is de sleutel in de database echo '<td> <INPUT TYPE="text" name="email" value ="'.$gevondenaccounts['email'].'" SIZE="20" MAXLENGTH="25"> '; 2011 42