20130308 GB les 6

82
programmas verbinden met gegevensbanken Matthijs van Leeuwen [email protected] 2012 - 2013 Slides grotendeels door: Katrien Verbert

Transcript of 20130308 GB les 6

Page 1: 20130308 GB les 6

programma’s verbinden met gegevensbanken

Matthijs van [email protected]

2012 - 2013

Slides grotendeels door: Katrien Verbert

Page 2: 20130308 GB les 6

inhoud

• benaderingen voor gegevensbankprogrammeren

• ingebedde SQL– Embedded SQL in C

– SQLJ in Java

• gegevensbanken via APIs– Java en JDBC

– Python en pyodbc

• webtoegang tot gegevensbanken– PHP

2

Page 3: 20130308 GB les 6

gebruik van SQL

• interactief– opdracht wordt aangeboden en onmiddellijk uitgevoerd

– command line client, maar ook bijv. PhpMyAdmin

• vanuit applicatie – SQL wordt gebruikt in een programma

3

Page 4: 20130308 GB les 6

programmeren met gegevensbanken

gebruikers applicaties gegevensbanken

SQLC/C++, Java, PHP, Python...

4

Page 5: 20130308 GB les 6

benaderingen

1. inbedden SQL opdrachten in programmacode• SQL opdrachten worden door een precompiler opgezocht

• en omgevormd tot functie-aanroepen van de programmeertaal

2. gebruik van een bibliotheek met functies • die toegang verschaffen tot de gegevensbank

• en resultaten beschikbaar stellen aan een programma in een API

3. een (nieuwe) programmeertaal ontwikkelen• die compatibel is met het gegevensmodel en query taal

• vb: PL/SQL van Oracle

Page 6: 20130308 GB les 6

twee aanpakken

Host language+

Embedded SQL

Preprocessor

Host language+

Function calls

Host‐languagecompiler

Object-codeprogram

SQL library

1.

2.

Page 7: 20130308 GB les 6

SQL/Host Language Interface

Function call SQLLibrary

host program

SQL stmt

DBMS

Fetch rows from the cursor 

Table

CursorWhile(…){

}Impedancemismatchproblem

[Kazuhiro Minami]

Page 8: 20130308 GB les 6

impedance mismatch

• verschillen tussen gegevensmodel en model van de programmeertaal– CHAR, VARCHAR -- String

– INTEGER -- int

• `bindings’ voor verschillende programmeertalen– definieert overeenkomsten van de attribuuttypes met de types in de programmeertaal

– bindt resultaat van query (=verzameling van tuples) aan datastructuur van het programma

• representatie in een tabelstructuur vaak onmogelijk– daarom meestal tupel voor tupel

8

Page 9: 20130308 GB les 6

typische interactie client/server model

1. het client programma opent een verbinding met de gegevensbankserver– vereist meestal adres van machine met de server,

– en login-naam en paswoord voor gegevensbank

2. interactie tussen het programma en de gegevensbank:– programma biedt queries, updates, … aan

– server levert resultaten van de queries,…

3. programma sluit de verbinding met de gegevensbank

9

Page 10: 20130308 GB les 6

twee aanpakken

Host language+

Embedded SQL

Preprocessor

Host language+

Function calls

Host‐languagecompiler

Object-codeprogram

SQL library

1.

2.

Page 11: 20130308 GB les 6

INGEBEDDE SQL

Page 12: 20130308 GB les 6

ingebedde SQL

• embedded SQL

• SQL opdracht kan in programmacode ingebed worden

• een pre-compiler verwerkt de SQL opdrachten vóór de compilatie van het programma:

– SQL opdrachten worden vervangen door declaraties en functie-aanroepen in de programmeertaal

• syntax verschilt wat naargelang van de programmeertaal

EXEC SQL < embedded SQL statement > END‐EXEC

EXEC SQL < embedded SQL statement > ;

#SQL { < embedded SQL statement > } ; 12

Page 13: 20130308 GB les 6

ingebedde SQL

– connecteren met de gegevensbank:

• slechts één connectie kan actief zijn;• wijzigen van de actieve connectie:

– verbinding beëindigen:

CONNECT TO < server name > AS < connection name >AUTHORIZATION < user account name and password > ;

DISCONNECT < connection name > ;

SET CONNECT < connection name > ;

13

Page 14: 20130308 GB les 6

ingebed gebruik van SQL

• gemeenschappelijke variabelen– SQL opdrachten kunnen verwijzen naar programmavariabelen

– dubbele punt (:) als prefix

• de gemeenschappelijke variabelen moeten gedeclareerd worden in een SQL declaratiesectie

• via variabelen kan informatie worden uitgewisseld

14

Page 15: 20130308 GB les 6

ingebedde SQL: voorbeeld

• Eén tupel ophalen uit een gegevensbank

• Voorbeeld:– declaratie van variabelen, in C

EXEC SQL BEGIN DECLARE SECTION;varchar dname[16], fname[16], lname[16]; char ssn[10], bdate[11], sex[2], minit[2];float salary, raise;int dno, dnumer; int SQLCODE ; char SQLSTATE[6];EXEC SQL END DECLARE SECTION;

Page 16: 20130308 GB les 6

ingebedde SQL: voorbeeld

Herhaal een aantal maal: vraag om ssn van een werknemer en geef gegevens van die werknemer

loop = 1;while (loop) {

prompt(“Enter a social security number: “, ssn);EXEC SQLselect Fname, Minit, Lname, Address, Salaryinto :fname, :minit, :lname, :address, :salaryfrom EMPLOYEEwhere SSN = :ssn;

if (SQLCODE == 0) printf(fname, minit, lname, address, salary)

else printf(“social sec. numb. does not exist: “, ssn);

prompt(“More s.s.numbers (enter 1 for Yes, 0 for No): “,loop) ;

}

Page 17: 20130308 GB les 6

SQLJ

• SQL commando’s ingebed in Java– SQLJ vertaler zet SQL commando’s om in Java,

– commando’s worden uitgevoerd d.m.v. de JDBC interface

– JDBC driver moet dus geïnstalleerd worden

• vereist:– importeren van verscheidene klassen

• JDBC en IO klassen

• extra klassen

– connecteren met de gewenste gegevensbank• getConnection

17

Page 18: 20130308 GB les 6

SQLJ

– importeren van de nodige klassen (vb. met Oracle)

– connectie maken

import java.sql.*;import java.io.*;import sqlj.runtime.*;import sqlj.runtime.ref.*;import oracle.sqlj.runtime.*;…

DefaultContext cntxt =oracle.getConnection(“<url name>”,

“<user name>”, “<pasword>”, true);DefaultContext.setDefaultContext(cntxt);…

Page 19: 20130308 GB les 6

SQLJ

– Voorbeeld 1: • lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van

die werknemer

ssn = readEntry(“Enter a social security number: “);try {

#sql{select Fname, Minit, Lname, Address, Salaryinto :fname, :minit, :lname, :address, :salaryfrom EMPLOYEE where Ssn = :ssn};

} catch (SQLException se) {System.out.println(“s.s.number does not exist: “+ ssn);return ;}

System.out.println(fname + “ “ + minit + “ “ + lname + “ “

+ “ “ + salary)

19

Page 20: 20130308 GB les 6

dname = readEntry(“Enter the department name: “);try {

#sql{select Dnumber into :dnumberfrom DEPARTMENT where Dname = :dname};

} catch (SQLException se) {System.out.println(“department does not exist:“ + dname);return;}

System.out.println(“ information for department: “ + dname);

#sql iterator Emp(String ssn, String fname, String minit, String lname, double salary);

Emp e = null;#sql e = {select ssn, fname, minit, lname, salary

from EMPLOYEE where Dno = :dnumber};

while (e.next()) {System,out.println(e.ssn + “ “ “ e.fname + “ “ +

e.minit + “ “ + e.lname + “ “ + e.salary);} ;

e.close();

Page 21: 20130308 GB les 6

twee aanpakken

Host language+

Embedded SQL

Preprocessor

Host language+

Function calls

Host‐languagecompiler

Object-codeprogram

SQL library

2.

DB API

Page 22: 20130308 GB les 6

JDBC

Page 23: 20130308 GB les 6

JDBC

• Call function interface voor toegang vanuit Java

• SQL statements worden dynamisch aangemaakt en doorgegeven als string

• Gebruikt API voor toegang tot DBMS

23

Page 24: 20130308 GB les 6

JDBC

• gestandaardiseerde API (Application Programming Interface)– geregistreerde naam door Sun Microsystems

– zou niet staan voor ‘Java DataBase Connectivity’

• JDBC driver = een implementatie van de functie-aanroepen die gespecificeerd zijn in de JDBC API

• DBMS leveranciers bieden JDBC drivers aan zodat het mogelijk wordt om gegevensbanken vanuit een Java programma aan te spreken

24

Page 25: 20130308 GB les 6

Copyright © 1997 Alex Chaffee

JDBC architectuur

Application JDBC Driver

• Java code roept JDBC library aan

• JDBC laadt een driver

• driver spreekt met een gegevensbank

25

Page 26: 20130308 GB les 6

stappen in JDBC gebruik

1. importeer het java.sql pakket

2. laad en registreer de driver

3. zorg voor passende variabelen in Java

4. maak een connectie met de gegevensbank

5. creëer een opdracht

6. voer de opdracht uit

7. haal het resultaat (of de resultaten) op

8. sluit de opdracht en de connectie

Page 27: 20130308 GB les 6

1. importeer het java.sql pakket

of

import java.sql.*;

import java.sql.Connection;import java.sql.SQLException;import java.sql.DriverManager;import java.sql.Driver;import java.sql.Statement;import java.sql.ResultSet;…

of

27

Page 28: 20130308 GB les 6

2. laad en registreer de driver

• dit gebeurt d.m.v. de klasse DriverManager

• laden van een specifieke driver gebeurt door de statische methode registerDriver() op te roepen

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

DriverManager.registerDriver(new org.postgresql.Driver());

28

Page 29: 20130308 GB les 6
Page 30: 20130308 GB les 6

JDBC gebruik

3. zorg voor de passende variabelen in Java

public class Department {private String dname;private String dnumber;private String mgrssn;private String mgrstartdate;

public Department(String dname, String dnumber, String mgrssn, String mgrstartdate) {

setDname(dname);setDnumber(dnumber);setMgrssn(mgrssn);setMgrstartdate(mgrstartdate);

}public String getDname() {

return dname;}

}

Page 31: 20130308 GB les 6

3. maak een connectie met de gegevensbank

• gebruik de statische methode getConnection() uit de klasse DriverManager om een connection object te maken

• twee schrijfwijzen– drie door komma’s gescheiden argumenten

– een string als argument

Connection con = DriverManager.getConnection(url,”userName”,”password”);

31

Connection con = DriverManager.getConnection("jdbc:postgresql:employee", "postgres", ”pwd");

Page 32: 20130308 GB les 6

4. creëer een opdracht

• Statement object

Statement stmt = con.createStatement();

vb: een tabel Department maken:Statement stmt = con.createStatement();String creeer= “CREATE TABLE Department (“ +

“ Dname Varchar(15) Not Null,”+“ Dnumber Integer Not Null,”+“ MgrSsn Char(9),”+“ MgrStartDate DATE,”+“ PRIMARY KEY (Dnumber),”+“ UNIQUE (Dname)”+“)”;

32

Page 33: 20130308 GB les 6

5. voer de opdracht uit

• executeQuery

• executeUpdate

try{

stmt.executeUpdate ("INSERT INTO DEPARTMENT VALUES ("+quotes(d.getDname())+", "+d.getDnumber()+", "+quotes(d.getMgrssn())+", "+getDate(d.getMgrstartdate())+") ");

stmt.executeUpdate("COMMIT");}catch(SQLException sqle){

stmt.executeUpdate("ROLLBACK");throw new FailureNoticeException(sqle.getMessage());

}stmt.close();

33

Page 34: 20130308 GB les 6

opdrachten

• ResultSet executeQuery(String sql_query)– Voert de query sql_query uit en geeft een ResultSet object

dat het resultaat van de query bevat.

• int executeUpdate(String sql_query)– Voert de query sql_query uit en geeft als resultaat het aantal

rijen dat werd toegevoegd/verwijderd/gewijzigd.

34

Page 35: 20130308 GB les 6

6. haal het resultaat (of de resultaten) op

• het resultaat wordt teruggegeven in een object van het type ResultSet

ResultSet rs = stmt.executeQuery("SELECT dname, dnumber, mgrssn, mgrstartdate " +"  FROM Department" +" WHERE dnumber = " + number );

if (!rs.next()) throw new FailureNoticeException("Geen departement voldoet aan het zoekcriterium.");

Department d = new Department(rs.getString("dname"), rs.getString("dnumber"), rs.getString("mgrssn"),rs.getString("mgrstartdate"));

rs.close();

35

Page 36: 20130308 GB les 6

7. afsluiten

sluit de opdracht en de connectie• ook eventuele resultset(s) moeten worden afgesloten

stmt.close();con.close ();

36

Page 37: 20130308 GB les 6

JDBC: overzicht van acties

DriverManager

Connection

Statement

ResultSet

getConnection

createStatement

execute

37

Page 38: 20130308 GB les 6

java.sql.Statement

• meest gebruikt type opdracht– v.b. Connection con = …;

Statement stmt = con.createStatement();

• hoe worden SQL statements uitgevoerd?– de gebruiker voert een SQL opdracht in

– het gevensbanksysteem ontleedt de opdracht

– het gegevensbanksysteem controleert de syntax

– het gegevensbanksysteem compileert de opdracht

– het gegevensbanksysteem voert de opdracht uit

38

Page 39: 20130308 GB les 6

java.sql.PreparedStatement

– gebruikt voor de (herhaalde) uitvoering van dynamische SQL opdrachten

• parameters kunnen later worden ingesteld

Res PreparedStatement p = con.prepareStatement("SELECT dname, dnumber, mgrssn, mgrstartdate " +" FROM Department" +" WHERE dnumber = ?" );

p.clearParameters();p.setInt(1, 1);ResultSet rs=p.executeQuery();

39

Page 40: 20130308 GB les 6

JDBC versus SQLJ

JDBCstmt = conn.prepareStatement(

"INSERT INTO DSN8710.EMP " +

"(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) "

+ "VALUES (?, ?, ?, ?, CURRENT DATE, ?)");

stmt.setString(1, empno);

stmt.setString(2, firstname);

stmt.setString(3, midinit);

stmt.setString(4, lastname);

stmt.setBigDecimal(5, salary);

stmt.executeUpdate();

stmt.close();

SQLJ

#sql [ctx] {INSERT INTO DSN8710.EMP

(EMPNO,  FIRSTNME,   MIDINIT,  LASTNAME,  HIREDATE,     SALARY)

VALUES

(:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary)

};

40

Page 41: 20130308 GB les 6

SQLJ versus JDBC

SQLJSQLJ JDBCJDBC

SQL statementsSQL statements static dynamic

Strong typingStrong typing yes no

CheckingChecking static runtime only

SyntaxSyntax concise API

StandardStandard ANSI Sun

PortablePortable yes yes

Object supportObject support yes* yes*

Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt

Page 42: 20130308 GB les 6

PYTHON EN GEGEVENSBANKEN

Page 43: 20130308 GB les 6

Python Database API 2.0

• gestandaardiseerde API– aanmoediging tot gelijkaardige DB modules voor Python

• vele verschillende implementaties beschikbaar– DBMS-specifiek

– Generiek: ODBC-gebaseerd, ADO (Windows)

– Maar ook: SQLite, flat files, XML, …

43

Page 44: 20130308 GB les 6

pyodbc

• voor veel platformen (besturingssystemen) beschikbaar– open source

• kan met veel DMBSen communiceren– want gebruikt ODBC drivers

44

Page 45: 20130308 GB les 6

pyodbc – verbinden

• maak een verbinding

• creëer een cursor

cnxn = pyodbc.connect('DRIVER={SQL Server}; SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass')

cursor = cnxn.cursor()

Page 46: 20130308 GB les 6

pyodbc – gegevens opvragen

cursor.execute("select user_id, user_name from users")row = cursor.fetchone()if row:

print row.user_name

cursor.execute("select user_id, user_name from users")rows = cursor.fetchall()for row in rows:

print row.user_id, user_name

Page 47: 20130308 GB les 6

pyodbc – data toevoegen

• execute() ipv query()

• met ODBC kun je een ? als parameter gebruiken en de waarde daarna los meegeven

• commit() is noodzakelijk om wijzigingen op te slaan

cursor.execute("insert into products(id, name) values (?, ?)", 'pyodbc', 'awesome library')

cnxn.commit()

Page 48: 20130308 GB les 6

WEBTOEGANG TOT GEGEVENSBANKEN

Page 49: 20130308 GB les 6

architectuur webapplicaties

WebserverWeb

browser Applicatie

RDBMSStatischeHTML

HTTP request

HTTP response

File access

DB access

Execute

Return

Page 50: 20130308 GB les 6

architectuur webapplicaties

Webserver

Webbrowser

+ applicatie

Interpreter

RDBMSFiles

Form, parameters, …

HTML, CSS, JavaScript, JSON, …

File access

SQL

Parameters, code

HTML, JavaScript,JSON, …

Result set

File

Page 51: 20130308 GB les 6

webtechnologie …

• met dit onderwerp kun je gemakkelijk een heel vak vullen, of twee

• we komen hier niet verder dan een heel globaal overzicht van de mogelijkheden van de combinatie van– HTML,

– PHP,

– MySQL

Page 52: 20130308 GB les 6

Hypertext Markup Language (HTML)

• gebruikt voor webpagina’s

• statische pagina’s

• tekst met tags tussen scherpe haakjes specificeren het formaat waarin de tekst getoond moet worden

<html><head><title>Welkom</title></head><body><h1>Ga zitten</h1><p>Hartelijk <b>welkom</b> in de cursus.</p></body></html>

Page 53: 20130308 GB les 6

Cascading Style Sheets (CSS)

• groot nadeel HTML: mengt vorm en inhoud

• met CSS kunnen vorm en inhoud beter worden gescheiden

• HTML bepaalt structuur en inhoud, CSS de vorm

div#main {background: #fff;color: #000;

}

h2 {color: #fff;font-weight: bold;text-align: center;

}

Page 54: 20130308 GB les 6

dynamische pagina’s

• moderne webpagina’s zijn zelden statisch!• server-side applicaties genereren dynamische HTML pagina’s

– vaak scripttalen: PHP, ASP, Python, Perl, …– maar ook Java, C++, etc. kunnen worden gebruikt

• gebruik scripttalen:– in een document kan afwisselend code en HTML worden geplaatst– wanneer de pagina wordt opgevraagd, wordt op de server de PHP code

uitgevoerd (geïnterpreteerd); het resultaat wordt doorgestuurd

<html><body><?php

echo "Welkom!";

?></body>

</html>

Page 55: 20130308 GB les 6

PHP: een inleiding

• scripttaal– een programmeertaal geschikt voor het schrijven van kleine

programma’s (=scripts)

– om veel voorkomende taken te automatiseren

• ontworpen in 1994 door Rasmus Lerdorf

• naam– oorspronkelijk: PHP = Personal Home Page

– nu: PHP = PHP: Hypertext Preprocessor

• PHP processor is geschreven in C, dus erg draagbaar

• erg geschikt voor het manipuleren van dynamische webpagina’s op een webserver

• heeft verscheidene functiebibliotheken voor toegang tot verschillende types van relationele gegevensbanken

Page 56: 20130308 GB les 6

variabelen

• namen– beginnen met $

– mogen verder letters, cijfers en het onderstrepingsteken bevatten (maar geen cijfers onmiddellijk na $-teken)

• type: variant – kan wijzigen in functie van de uitgevoerde bewerking – moet dus niet vooraf gedeclareerd worden

– een variable krijgt haar type bij de eerste toekenning (maar dat type kan later wijzigen!)

• data types– getallen; strings (tussen ‘ ‘ of “ “); booleaanse waarden

Page 57: 20130308 GB les 6

PHP

• Begin- en eindtag:– <?php ?>

– <? ?>

– Alleen code binnen tags wordt geïnterpreteerd en uitgevoerd, al het overige wordt direct naar client gestuurd

• Commentaar:– // tot einde regel

– # tot einde regel

– /* over verscheidene regels */

Page 58: 20130308 GB les 6

tabellen (arrays)

• zijn dynamisch: geen vast aantal elementen

• kan elementen van verschillende typen bevatten

• posities kunnen genummerd zijn (beginnend bij 0)

• posities kunnen ook door een string aangegeven worden; dan spreekt men van associatieve tabellen.

Page 59: 20130308 GB les 6

voorbeelden

• $Fruitlijst = array (`appel`, `banaan`, `sinaasappel`);– bevat 3 elementen, index begint bij 0

• $Fruitlijst = array (1=>`appel`, 2=> `banaan`, 3=>`sinaasappel`);– bevat 3 elementen, index begint bij 1

• $db = array (`host` => `localhost`,

`user` => `root`,

`password` => `geheim`,

`port` => `3306`,

`db_name` => `php_app`) ;

Page 60: 20130308 GB les 6

tabellen (arrays)

• Sequentieel doorlopen van tabellen kan met foreach

• foreach($Fruitlijst as $fruit)

print(“$fruit <br />”);

• foreach($Fruitlijst as $index => $fruit)

print(“$index: $fruit <br />”);

Page 61: 20130308 GB les 6

PHP

• rekenkundige operatoren:– * / % + - ++ --

• vergelijkingsoperatoren:– == === < > <= >= != <> !==

• echo() en print()– weergeven van strings binnen PHP

– met echo() kan de tekst meerdere regels omvatten, met print() niet

– Voorbeelden

echo `dit is tekst`;echo (`dit is tekst`);

Page 62: 20130308 GB les 6

PHP

• Logische operatoren– ! and && or ||

• String operatoren– . .= (bijv. $s = ‘G’; $s .= ‘B’;)

• Controlestructuren– if – else

– verkorte if-else

– switch

– for

– while

– do – while

– foreach

Page 63: 20130308 GB les 6

if .. then .. else ; include

<?phpif($user == `Matthijs`) {include(`secretpage.inc.php`);

} else {include(`publicpage.inc.php`);

}?>

• nadeel HTTP protocol: stateless

• voor iedere request wordt applicatie (PHP script) opnieuw opgestart

• status moet server-side worden bijgehouden

• oplossing: sessies en cookies

Page 64: 20130308 GB les 6

bereik (scoop) van variabelen

• variabelen zijn by default lokaal

• voorbeeld

<?php$som = 0;function maakSom ($g1, $g2){$som = $g1 + $g2;echo $som;

}?>...<?php echo $som ?> // geeft: 0<?php maakSom(5,6) ?> // geeft: 11<?php echo $som ?> // geeft: 0

Page 65: 20130308 GB les 6

globale variabelen

• gebruik van variabelen die buiten de functie aangemaakt zijn

• voorbeeld

<?php$som = 0;function maakSom ($g1, $g2){global $som;$som = $g1 + $g2;echo $som;

}?>...<?php echo $som ?> // geeft: 0<?php maakSom(5,6) ?> // geeft: 11<?php echo $som ?> // geeft: 11

Page 66: 20130308 GB les 6

globale variabelen #2

• gebruik van variabelen die buiten de functie aangemaakt zijn

• voorbeeld

<?php$som = 0;function maakSom ($g1, $g2){$GLOBALS[‘som‘] = $g1 + $g2;echo $GLOBALS[‘som‘];

}?>...<?php echo $som ?> // geeft: 0<?php maakSom(5,6) ?> // geeft: 11<?php echo $som ?> // geeft: 11

Page 67: 20130308 GB les 6

superglobal variabelen

• variabelen die automatisch door PHP aangemaakt worden en altijd globaal zijn

• een aantal arrays van superglobals zijn beschikbaar, o.a.: – $GLOBALS:

• array van alle variabelen die je zelf als global definieert

– $_GET en $_POST: • array van alle formuliervelden die via GET of POST verzonden worden

– $_SESSION: • array met sessievariabelen

– $_SERVER: • array met servergegevens (servernaam, protocol,…)

– $_ENV: • array met omgevingsvariabelen (OS, computernaam,…)

– …

Page 68: 20130308 GB les 6

formulieren

• geschikt voor invoer van gebruiker

• gepreciseerd tussen tags <form> en </form>

• belangrijke attributen van <form> tag:– action: verwijzing naar de pagina die de verwerking van het

formulier doet

– method: manier waarop de gegevens verstuurd worden (keuze tussen GET en POST)

• GET: plakt alle gegevens achter de URL

• POST: de verzonden gegevens zijn niet zichtbaar in de URL, maar komen in de HTTP-headers

• de velden van het formulier zijn beschikbaar in php-script d.m.v. de superglobals $_POST en $_GET

Page 69: 20130308 GB les 6

formulieren

• bij versturen van dit formulier gaan de gegevens naar het formHandler.php script, dat er b.v. als volgt kan uitzien:

<html><body><form action="formHandler.php" method="post">

Voornaam: <input type="text" name="voornaam" />Familienaam: <input type="text" name="naam" /><input type="submit" />

</form></body></html>

<html><body>Hallo <?php echo $_POST["voornaam"]." ".

$_POST["naam"]."!"; ?></body></html>

Page 70: 20130308 GB les 6
Page 71: 20130308 GB les 6

verbinding maken met een gegevensbank in PHP

Twee manieren

1. Database-specifieke API, bijv. voor MySQL

2. Algemene bibliotheek, bijv. MDB2

Page 72: 20130308 GB les 6

verbinding maken met een gegevensbank

• Gebruik mysql_connect en mysql_select_db– mysql_connect ([<server> [,<gebruikersnaam> [,<paswoord>]]]) ;

– mysql_select_db ( <gegevensbank> [,<connectie>]) ;

$host = ‘barbary.cs.kuleuven.be’ ;$user = ‘phpdb’ ;$pass = ‘frietjes’ ;$database = ‘muziek’ ;$conn = mysql_connect ( $host, $user, $pass )

or die(“cannot connect to database”);mysql_select_db ( $database ) ;

Page 73: 20130308 GB les 6

queries

• gebruik mysql_query– mysql_query ( <query> [, <connectie>] ) ;

– dit geeft een tabel als resultaat

$query = “SELECT user_id AS id, login_name AS naam, ”.”birthdate AS datum “.”FROM user ” ;

$result = mysql_query ($query) or or die (“database fout: “ .

mysql_error() ) ;

Page 74: 20130308 GB les 6

rijen uit het resultaat halen

• gebruik een herhaling zoals while, foreach,…

while ( $entry = mysql_fetch_array($result, MYSQL_ASSOC) ) {

?><tr>

<td><?php echo $entry[‘naam’]; ?> </td><td><?php echo $entry[‘datum’]; ?> </td>

</tr><?php}

Page 75: 20130308 GB les 6

afsluiten van de connectie

• Gebruik mysql_close mysql_close (<connectie>) ;

• Voorbeeldmysql_close($conn);

Page 76: 20130308 GB les 6

PEAR MDB2

• PEAR is een collectie PHP extensies

• MDB2 is een abstractielaag voor gegevensbanken

• kan met vele DMBSen verbinding maken

• niet altijd beschikbaar

require ‘MDB2.php‘;$d = MDB2::connect(‘oci8://acct1:[email protected]/db‘);if(PEAR::isError($d)) { die(‘Cannot connect: ‘.

$d->GetMessage()); }

Page 77: 20130308 GB les 6

PEAR – tupel toevoegen

• voor tabellen met een oplopend integer als primaire sleutel kunnen we `volgende ID’ opvragen

// Get next id$eid = $d->nextID(`EMPLOYEE`);

// Insert tuple into Employee table$q = $d->query(“INSERT INTO EMPLOYEE VALUES

($eid, `$_POST[`name`]`, $_POST[`dno`])“);

Page 78: 20130308 GB les 6

SQL injectie

• opgelet: vertrouw nooit je gebruiker!

• onderstaande query kan tot grote problemen leiden

// Get next id$eid = $d->nextID(`EMPLOYEE`);

// Insert tuple into Employee table$q = $d->query(“INSERT INTO EMPLOYEE VALUES

($eid, `$_POST[`name`]`, $_POST[`dno`])“);

Page 79: 20130308 GB les 6

SQL injectie

• name = Matthijs

• dno = 2); DELETE FROM EMPLOYEE;

// Get next id$eid = $d->nextID(`EMPLOYEE`);

// Insert tuple into Employee table$q = $d->query(“INSERT INTO EMPLOYEE VALUES

($eid, `$_POST[`name`]`, $_POST[`dno`])“);

INSERT INTO EMPLOYEE VALUES(81, `Matthijs`, 2); DELETE FROM EMPLOYEE; );

Page 80: 20130308 GB les 6

SQL injectie

• oplossing 1: valideer altijd alle invoer van de gebruiker, voordat je deze gebruikt (!)

• oplossing 2: gebruik het ? (mits ondersteund)

// Get next id$eid = $d->nextID(`EMPLOYEE`);

// Insert tuple into Employee table$q = $d->query(“INSERT INTO EMPLOYEE VALUES

(?, ?, ?)“, array($eid,$_POST[`name`],$_POST[`dno`]));

Page 81: 20130308 GB les 6

documentatie

• PHP Manualhttp://www.php.net/manual/en/index.php

• MySQL documentationhttp://dev.mysql.com/doc/

Page 82: 20130308 GB les 6

VRAGEN?

82