programma’s verbindenmet gegevensbankenMatthijs van Leeuwenmatthijs.vanleeuwen@cs.kuleuven.be2012 - 2013              Slid...
inhoud• benaderingen voor gegevensbankprogrammeren• ingebedde SQL  – Embedded SQL in C  – SQLJ in Java• gegevensbanken via...
gebruik van SQL• interactief   – opdracht wordt aangeboden en onmiddellijk uitgevoerd   – command line client, maar ook bi...
programmeren met gegevensbanken gebruikers      applicaties           gegevensbanken         C/C++, Java, PHP, Python...  ...
benaderingen1. inbedden SQL opdrachten in programmacode   •   SQL opdrachten worden door een precompiler opgezocht   •   e...
twee aanpakken                    Host language               1.         +                    Embedded SQL                ...
SQL/Host Language Interface                  SQL stmt Function call                      SQL                     Table    ...
impedance mismatch•   verschillen tussen gegevensmodel en model van de programmeertaal    – CHAR, VARCHAR -- String    – I...
typische interactie client/server model1. het client programma opent een verbinding met de gegevensbankserver   – vereist ...
twee aanpakken                    Host language               1.         +                    Embedded SQL                ...
INGEBEDDE SQL
ingebedde SQL•   embedded SQL•   SQL opdracht kan in programmacode ingebed worden•   een pre-compiler verwerkt de SQL opdr...
ingebedde SQL  – connecteren met de gegevensbank:   CONNECT TO < server name > AS < connection name >   AUTHORIZATION < us...
ingebed gebruik van SQL• gemeenschappelijke variabelen   – SQL opdrachten kunnen verwijzen naar programmavariabelen   – du...
ingebedde SQL: voorbeeld• Eén tupel ophalen uit een gegevensbank• Voorbeeld:   – declaratie van variabelen, in C  EXEC SQL...
ingebedde SQL: voorbeeld   Herhaal een aantal maal: vraag om ssn van een werknemer en   geef gegevens van die werknemerloo...
SQLJ• SQL commando’s ingebed in Java   – SQLJ vertaler zet SQL commando’s om in Java,   – commando’s worden uitgevoerd d.m...
SQLJ  – importeren van de nodige klassen (vb. met Oracle)import   java.sql.*;import   java.io.*;import   sqlj.runtime.*;im...
SQLJ    – Voorbeeld 1:       • lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van         die werkneme...
dname = readEntry(“Enter the department name: “);try {    #sql{select Dnumber into :dnumber         from DEPARTMENT where ...
twee aanpakken               Host language                     +               Embedded SQL               Preprocessor    ...
JDBC
JDBC• Call function interface voor toegang vanuit Java• SQL statements worden dynamisch aangemaakt en  doorgegeven als str...
JDBC•   gestandaardiseerde API (Application Programming Interface)    – geregistreerde naam door Sun Microsystems    – zou...
JDBC architectuur Application    JDBC                     Driver• Java code roept JDBC library aan• JDBC laadt een driver•...
stappen in JDBC gebruik1.   importeer het java.sql pakket2.   laad en registreer de driver3.   zorg voor passende variabel...
1. importeer het java.sql pakket     import java.sql.*;     ofof     import   java.sql.Connection;     import   java.sql.S...
2. laad en registreer de driver • dit gebeurt d.m.v. de klasse DriverManager • laden van een specifieke driver gebeurt doo...
JDBC gebruik3. zorg voor de passende variabelen in Javapublic class Department {    private String dname;    private Strin...
3. maak een connectie met de gegevensbank  •   gebruik de statische methode getConnection() uit de      klasse DriverManag...
4. creëer een opdracht • Statement objectStatement stmt = con.createStatement();vb: een tabel Department maken: Statement ...
5. voer de opdracht uit • executeQuery • executeUpdatetry{      stmt.executeUpdate ("INSERT INTO DEPARTMENT VALUES ("     ...
opdrachten• ResultSet executeQuery(String sql_query)  – Voert de query sql_query uit en geeft een ResultSet object    dat ...
6. haal het resultaat (of de resultaten) op• het resultaat wordt teruggegeven in een object van het  type ResultSetResultS...
7. afsluitensluit de opdracht en de connectie      •   ook eventuele resultset(s) moeten worden afgeslotenstmt.close();con...
JDBC: overzicht van acties   DriverManager                ConnectiongetConnection                             Statement   ...
java.sql.Statement• meest gebruikt type opdracht  – v.b.     Connection con = …;             Statement stmt = con.createSt...
java.sql.PreparedStatement– gebruikt voor de (herhaalde) uitvoering van dynamische SQL  opdrachten   • parameters kunnen l...
JDBC versus SQLJJDBC                                          SQLJstmt = conn.prepareStatement(                 #sql [ctx]...
SQLJ versus JDBC                                SQLJ         JDBC    SQL statements              static       dynamic    S...
PYTHON EN GEGEVENSBANKEN
Python Database API 2.0• gestandaardiseerde API   – aanmoediging tot gelijkaardige DB modules voor Python• vele verschille...
pyodbc• voor veel platformen (besturingssystemen) beschikbaar   – open source• kan met veel DMBSen communiceren   – want g...
pyodbc – verbinden• maak een verbinding• creëer een cursorcnxn = pyodbc.connect(DRIVER={SQL Server};      SERVER=localhost...
pyodbc – gegevens opvragencursor.execute("select user_id, user_name from users")row = cursor.fetchone()if row:    print ro...
pyodbc – data toevoegen• execute() ipv query()• met ODBC kun je een ? als parameter gebruiken en de  waarde daarna los mee...
WEBTOEGANG TOTGEGEVENSBANKEN
architectuur webapplicaties  Web     HTTP request                   Executebrowser                   Webserver            ...
architectuur webapplicaties           Form,    Web     parameters, …                        Parameters, code browser      ...
webtechnologie …• met dit onderwerp kun je gemakkelijk een heel vak  vullen, of twee• we komen hier niet verder dan een he...
Hypertext Markup Language (HTML)• gebruikt voor webpagina’s• statische pagina’s• tekst met tags tussen scherpe haakjes spe...
Cascading Style Sheets (CSS)• groot nadeel HTML: mengt vorm en inhoud• met CSS kunnen vorm en inhoud beter worden  geschei...
dynamische pagina’s• moderne webpagina’s zijn zelden statisch!• server-side applicaties genereren dynamische HTML pagina’s...
PHP: een inleiding• scripttaal   – een programmeertaal geschikt voor het schrijven van kleine     programma’s (=scripts)  ...
variabelen• namen   – beginnen met $   – mogen verder letters, cijfers en het onderstrepingsteken     bevatten (maar geen ...
PHP• Begin- en eindtag:   – <?php          ?>   – <? ?>   – Alleen code binnen tags wordt geïnterpreteerd en     uitgevoer...
tabellen (arrays)•   zijn dynamisch: geen vast aantal elementen•   kan elementen van verschillende typen bevatten•   posit...
voorbeelden• $Fruitlijst = array (`appel`, `banaan`, `sinaasappel`);   – bevat 3 elementen, index begint bij 0• $Fruitlijs...
tabellen (arrays)• Sequentieel doorlopen van tabellen kan met foreach• foreach($Fruitlijst as $fruit)      print(“$fruit <...
PHP• rekenkundige operatoren:   – *    /   %     +   -   ++   --• vergelijkingsoperatoren:   – ==       ===       <   >   ...
PHP• Logische operatoren   – !      and      &&      or   ||• String operatoren   – .        .=          (bijv. $s = ‘G’; ...
if .. then .. else ; include          <?php          if($user == `Matthijs`) {             include(`secretpage.inc.php`); ...
bereik (scoop) van variabelen• variabelen zijn by default lokaal• voorbeeld           <?php           $som = 0;           ...
globale variabelen• gebruik van variabelen die buiten de functie aangemaakt zijn• voorbeeld            <?php            $s...
globale variabelen #2• gebruik van variabelen die buiten de functie aangemaakt zijn• voorbeeld            <?php           ...
superglobal variabelen• variabelen die automatisch door PHP aangemaakt worden  en altijd globaal zijn• een aantal arrays v...
formulieren• geschikt voor invoer van gebruiker• gepreciseerd tussen tags <form> en </form>• belangrijke attributen van <f...
formulieren  <html>  <body>    <form action="formHandler.php" method="post">      Voornaam: <input type="text" name="voorn...
verbinding maken met eengegevensbank in PHPTwee manieren1. Database-specifieke API, bijv. voor MySQL2. Algemene bibliothee...
verbinding maken met eengegevensbank• Gebruik mysql_connect en mysql_select_db   – mysql_connect ([<server> [,<gebruikersn...
queries• gebruik mysql_query   – mysql_query ( <query> [, <connectie>] ) ;   – dit geeft een tabel als resultaat $query = ...
rijen uit het resultaat halen• gebruik een herhaling zoals while, foreach,…  while ( $entry = mysql_fetch_array($result,  ...
afsluiten van de connectie• Gebruik mysql_close    mysql_close (<connectie>) ;• Voorbeeld    mysql_close($conn);
PEAR MDB2  •   PEAR is een collectie PHP extensies  •   MDB2 is een abstractielaag voor gegevensbanken  •   kan met vele D...
PEAR – tupel toevoegen• voor tabellen met een oplopend integer als primaire  sleutel kunnen we `volgende ID’ opvragen  // ...
SQL injectie• opgelet: vertrouw nooit je gebruiker!• onderstaande query kan tot grote problemen leiden  // Get next id  $e...
SQL injectie• name = Matthijs• dno = 2); DELETE FROM EMPLOYEE;  // Get next id  $eid = $d->nextID(`EMPLOYEE`);  INSERT INT...
SQL injectie• oplossing 1: valideer altijd alle invoer van de gebruiker,  voordat je deze gebruikt (!)• oplossing 2: gebru...
documentatie• PHP Manual  http://www.php.net/manual/en/index.php• MySQL documentation  http://dev.mysql.com/doc/
VRAGEN?          82
20130308 GB les 6
20130308 GB les 6
Upcoming SlideShare
Loading in …5
×

20130308 GB les 6

4,125 views
4,096 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,125
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
50
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

20130308 GB les 6

  1. 1. programma’s verbindenmet gegevensbankenMatthijs van Leeuwenmatthijs.vanleeuwen@cs.kuleuven.be2012 - 2013 Slides grotendeels door: Katrien Verbert
  2. 2. 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
  3. 3. 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
  4. 4. programmeren met gegevensbanken gebruikers applicaties gegevensbanken C/C++, Java, PHP, Python... SQL 4
  5. 5. benaderingen1. inbedden SQL opdrachten in programmacode • SQL opdrachten worden door een precompiler opgezocht • en omgevormd tot functie-aanroepen van de programmeertaal2. gebruik van een bibliotheek met functies • die toegang verschaffen tot de gegevensbank • en resultaten beschikbaar stellen aan een programma in een API3. een (nieuwe) programmeertaal ontwikkelen • die compatibel is met het gegevensmodel en query taal • vb: PL/SQL van Oracle
  6. 6. twee aanpakken Host language 1. + Embedded SQL Preprocessor 2. Host language + Function calls Host‐languageSQL library Object-code compiler program
  7. 7. SQL/Host Language Interface SQL stmt Function call SQL Table Library While(…){ Cursor DBMS } Fetch rows  Impedancehost program from the cursor  mismatch problem [Kazuhiro Minami]
  8. 8. 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
  9. 9. typische interactie client/server model1. het client programma opent een verbinding met de gegevensbankserver – vereist meestal adres van machine met de server, – en login-naam en paswoord voor gegevensbank2. 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
  10. 10. twee aanpakken Host language 1. + Embedded SQL Preprocessor 2. Host language + Function calls Host‐languageSQL library Object-code compiler program
  11. 11. INGEBEDDE SQL
  12. 12. 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
  13. 13. ingebedde SQL – connecteren met de gegevensbank: CONNECT TO < server name > AS < connection name > AUTHORIZATION < user account name and password > ; • slechts één connectie kan actief zijn; • wijzigen van de actieve connectie: SET CONNECT < connection name > ; – verbinding beëindigen: DISCONNECT < connection name > ; 13
  14. 14. 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
  15. 15. 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;
  16. 16. ingebedde SQL: voorbeeld Herhaal een aantal maal: vraag om ssn van een werknemer en geef gegevens van die werknemerloop = 1;while (loop) { prompt(“Enter a social security number: “, ssn); EXEC SQL select Fname, Minit, Lname, Address, Salary into :fname, :minit, :lname, :address, :salary from EMPLOYEE where 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) ; }
  17. 17. 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
  18. 18. SQLJ – importeren van de nodige klassen (vb. met Oracle)import java.sql.*;import java.io.*;import sqlj.runtime.*;import sqlj.runtime.ref.*;import oracle.sqlj.runtime.*;… – connectie makenDefaultContext cntxt = oracle.getConnection(“<url name>”, “<user name>”, “<pasword>”, true);DefaultContext.setDefaultContext(cntxt);…
  19. 19. SQLJ – Voorbeeld 1: • lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van die werknemerssn = readEntry(“Enter a social security number: “);try { #sql{select Fname, Minit, Lname, Address, Salary into :fname, :minit, :lname, :address, :salary from 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
  20. 20. dname = readEntry(“Enter the department name: “);try { #sql{select Dnumber into :dnumber from 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();
  21. 21. twee aanpakken Host language + Embedded SQL Preprocessor 2. DB API Host language + Function calls Host‐languageSQL library Object-code compiler program
  22. 22. JDBC
  23. 23. JDBC• Call function interface voor toegang vanuit Java• SQL statements worden dynamisch aangemaakt en doorgegeven als string• Gebruikt API voor toegang tot DBMS 23
  24. 24. 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
  25. 25. JDBC architectuur Application JDBC Driver• Java code roept JDBC library aan• JDBC laadt een driver• driver spreekt met een gegevensbank Copyright © 1997 Alex Chaffee 25
  26. 26. stappen in JDBC gebruik1. importeer het java.sql pakket2. laad en registreer de driver3. zorg voor passende variabelen in Java4. maak een connectie met de gegevensbank5. creëer een opdracht6. voer de opdracht uit7. haal het resultaat (of de resultaten) op8. sluit de opdracht en de connectie
  27. 27. 1. importeer het java.sql pakket import java.sql.*; ofof import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.sql.Driver; import java.sql.Statement; import java.sql.ResultSet; … 27
  28. 28. 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 roepenDriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());DriverManager.registerDriver (new org.postgresql.Driver()); 28
  29. 29. JDBC gebruik3. zorg voor de passende variabelen in Javapublic 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; }}
  30. 30. 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”); Connection con = DriverManager.getConnection ("jdbc:postgresql:employee", "postgres", ”pwd"); 31
  31. 31. 4. creëer een opdracht • Statement objectStatement 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
  32. 32. 5. voer de opdracht uit • executeQuery • executeUpdatetry{ 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
  33. 33. 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
  34. 34. 6. haal het resultaat (of de resultaten) op• het resultaat wordt teruggegeven in een object van het type ResultSetResultSet 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
  35. 35. 7. afsluitensluit de opdracht en de connectie • ook eventuele resultset(s) moeten worden afgeslotenstmt.close();con.close (); 36
  36. 36. JDBC: overzicht van acties DriverManager ConnectiongetConnection Statement createStatement ResultSet execute 37
  37. 37. 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
  38. 38. java.sql.PreparedStatement– gebruikt voor de (herhaalde) uitvoering van dynamische SQL opdrachten • parameters kunnen later worden ingesteldRes PreparedStatement p = con.prepareStatement( "SELECT dname, dnumber, mgrssn, mgrstartdate " + " FROM Department" + " WHERE dnumber = ?" );p.clearParameters();p.setInt(1, 1);ResultSet rs=p.executeQuery(); 39
  39. 39. JDBC versus SQLJJDBC SQLJstmt = conn.prepareStatement( #sql [ctx] { "INSERT INTO DSN8710.EMP " + INSERT INTO DSN8710.EMP "(EMPNO, FIRSTNME, MIDINIT,  (EMPNO,  FIRSTNME,   MIDINIT,   LASTNAME, HIREDATE, SALARY) " LASTNAME,  HIREDATE,     SALARY) + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)"); VALUESstmt.setString(1, empno); (:empno, :firstname, :midinit, :lastname, stmt.setString(2, firstname); CURRENT DATE, :salary)stmt.setString(3, midinit); };stmt.setString(4, lastname);stmt.setBigDecimal(5, salary);stmt.executeUpdate();stmt.close(); 40
  40. 40. SQLJ versus JDBC SQLJ JDBC SQL statements static dynamic Strong typing yes no Checking static runtime only Syntax concise API Standard ANSI Sun Portable yes yes Object support yes* yes* Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt
  41. 41. PYTHON EN GEGEVENSBANKEN
  42. 42. 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
  43. 43. pyodbc• voor veel platformen (besturingssystemen) beschikbaar – open source• kan met veel DMBSen communiceren – want gebruikt ODBC drivers 44
  44. 44. pyodbc – verbinden• maak een verbinding• creëer een cursorcnxn = pyodbc.connect(DRIVER={SQL Server}; SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass)cursor = cnxn.cursor()
  45. 45. pyodbc – gegevens opvragencursor.execute("select user_id, user_name from users")row = cursor.fetchone()if row: print row.user_namecursor.execute("select user_id, user_name from users")rows = cursor.fetchall()for row in rows: print row.user_id, user_name
  46. 46. 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 slaancursor.execute("insert into products(id, name) values (?, ?)", pyodbc, awesome library)cnxn.commit()
  47. 47. WEBTOEGANG TOTGEGEVENSBANKEN
  48. 48. architectuur webapplicaties Web HTTP request Executebrowser Webserver Applicatie HTTP response Return File access DB access Statische HTML RDBMS
  49. 49. architectuur webapplicaties Form,  Web parameters, … Parameters, code browser Webserver Interpreter +  HTML, applicatie HTML, CSS,  JavaScript, JavaScript,  File access JSON, … JSON, … Result set SQL File Files RDBMS
  50. 50. 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
  51. 51. 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>
  52. 52. 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 vormdiv#main { background: #fff; color: #000;}h2 { color: #fff; font-weight: bold; text-align: center;}
  53. 53. 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>
  54. 54. 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
  55. 55. 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
  56. 56. 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 */
  57. 57. 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.
  58. 58. 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`) ;
  59. 59. 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 />”);
  60. 60. 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`);
  61. 61. PHP• Logische operatoren – ! and && or ||• String operatoren – . .= (bijv. $s = ‘G’; $s .= ‘B’;)• Controlestructuren – if – else – verkorte if-else – switch – for – while – do – while – foreach
  62. 62. if .. then .. else ; include <?php if($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
  63. 63. 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
  64. 64. 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
  65. 65. 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
  66. 66. 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,…) – …
  67. 67. 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
  68. 68. formulieren <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>• bij versturen van dit formulier gaan de gegevens naar het formHandler.php script, dat er b.v. als volgt kan uitzien: <html> <body> Hallo <?php echo $_POST["voornaam"]." ". $_POST["naam"]."!"; ?> </body> </html>
  69. 69. verbinding maken met eengegevensbank in PHPTwee manieren1. Database-specifieke API, bijv. voor MySQL2. Algemene bibliotheek, bijv. MDB2
  70. 70. verbinding maken met eengegevensbank• 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 ) ;
  71. 71. 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() ) ;
  72. 72. 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 }
  73. 73. afsluiten van de connectie• Gebruik mysql_close mysql_close (<connectie>) ;• Voorbeeld mysql_close($conn);
  74. 74. PEAR MDB2 • PEAR is een collectie PHP extensies • MDB2 is een abstractielaag voor gegevensbanken • kan met vele DMBSen verbinding maken • niet altijd beschikbaarrequire ‘MDB2.php‘;$d = MDB2::connect(‘oci8://acct1:pwd@sql.kul.be/db‘);if(PEAR::isError($d)) { die(‘Cannot connect: ‘. $d->GetMessage()); }
  75. 75. 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`])“);
  76. 76. 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`])“);
  77. 77. SQL injectie• name = Matthijs• dno = 2); DELETE FROM EMPLOYEE; // Get next id $eid = $d->nextID(`EMPLOYEE`); INSERT INTO EMPLOYEE VALUES (81, `Matthijs`,into DELETE FROM EMPLOYEE; ); // Insert tuple 2); Employee table $q = $d->query(“INSERT INTO EMPLOYEE VALUES ($eid, `$_POST[`name`]`, $_POST[`dno`])“);
  78. 78. 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`]));
  79. 79. documentatie• PHP Manual http://www.php.net/manual/en/index.php• MySQL documentation http://dev.mysql.com/doc/
  80. 80. VRAGEN? 82

×