Class 29: Vocational Skills How to Build a Dynamic Web Site CS200: Computer Science University of Virginia Computer Science David Evans http://www.cs.virginia.edu/evans Vocational Skills Job listings at monster.com (31 March 2004): SQL PHP HTML Scheme 31 March 2004 “more than 5000” $80-$400K 3570 posted in last 14 days 785 $40-$150K “more than 5000” 203 in last 24 hours 0 $30-50K $200K? CS 200 Spring 2004 2 Today’s Aberrant Class • Covers topics primarily selected for their practical (not intellectual) value • Covers material found in “For Dummies” books (but we’ll cover it differently) • There is no “Computability Theory for Dummies”, “Complexity Theory for Dummies”, “Higher Order Procedures for Dummies”, “Recursive Definitions for Dummies”, etc. book 31 March 2004 CS 200 Spring 2004 3 HyperText Transfer Protocol Server GET /cs200/index.html HTTP/1.0 <html> <head> … Contents of file Client (Browser) HTML – hypertext markup language Way of describing hypertext documents 31 March 2004 CS 200 Spring 2004 4 HTML: HyperText Markup Language • Language for controlling presentation of web pages • Uses formatting tags – Enclosed between < and > • Not a powerful language (we will learn what this means more precisely next week) – no way to make procedures or jump 31 March 2004 CS 200 Spring 2004 5 HTML Grammar Excerpt Document ::= <html> Header Body </html> Header ::= <head> HeadElements </head> HeadElements ::= HeadElement HeadElements HeadElements ::= HeadElement ::= <title> Element </title> Body ::= <body> Elements </body> Elements ::= Element Elements Elements ::= Element ::= <p> Element </p> Make Element a paragraph. Element ::= <center> Element </center> Center Element horizontally on the page. Element ::= <b> Element </b> Display Element in bold. Element ::= Text What is a HTML interpreter? 31 March 2004 CS 200 Spring 2004 6 Dynamic Web Sites • Programs that run on the client’s machine – Java, JavaScript, Flash, etc.: language must be supported by the client’s browser (so they are usually flaky and don’t work for most visitors) – Used (almost exclusively) to make annoying animations to make advertisements more noticeable • Programs that run on the web server – Can be written in any language, just need a way to connect the web server to the program – Program generates regular HTML – works for everyone – (Almost) Every useful web site does this 31 March 2004 CS 200 Spring 2004 7 Dynamic Web Site Server GET /cs200/notes/presidents.php3 <html> <head> … Client (Web Browser) “HTML Interpreter” 31 March 2004 CS 200 Spring 2004 8 Dynamic Web Site Client GET /cs200/notes/presidents.php3 File Server Read ~evans/public_html/cs200/notes/presidents.php3 Request Processor 31 March 2004 <html> <head><title>Presidents of the United States</title></head> <body> <h1>Presidents of the United States</h1> <p> <? $hostName = "dbm1.itc.virginia.edu"; $userName = "dee2b"; $password = "quist"; CS 200 Spring 2004 $dbName = "dee2b_presidents"; 9 … Processing a GET Request <html> <head><title>Presidents of the United States</title></head> <body> <h1>Presidents of the United States</h1> <p> <? $hostName = "dbm1.itc.virginia.edu"; $userName = "dee2b"; $password = "quist"; $dbName = "dee2b_presidents"; … Regular HTML: Send through to client PHP Code: (inside <? … ?>) Evaluate using PHP evaluator, send result to client to Client PHP Evaluator 31 March 2004 CS 200 Spring 2004 10 PHP Code • A universal programming language – Everything you can compute in Scheme you can compute in PHP – Everything you can compute in PHP, you can compute in Scheme – Friday we will explain why more convincingly • Imperative Language – Designed to support a style of programming where most of the work is done using assignment 31 March 2004 CS 200 Spring 2004 11 Learning New Languages • Syntax: Where the {, ;, $, etc. all go – If you can understand a BNF grammar, this is easy • Semantics: What does it mean – Learning the evaluation rules – Harder, but most programming languages have very similar evaluation rules • Style – What are the idioms and customs of experienced programmers in that language? • Takes many years to learn • Need it to be a “professional” PHP programmer, but not to make a useful program 31 March 2004 CS 200 Spring 2004 12 PHP If Instruction ::= if (Expression) { Instructions } Evaluate Expression. If it evaluates to true, evaluate the Instructions. It is similar to (if Expression (begin Instructions)) Difference is what “true” means. In Scheme, it means anything that is not #f. In PHP it means anything that is not 0, the empty string, or a few other things. 31 March 2004 CS 200 Spring 2004 13 PHP Example Assignment: (define i 1) or (set! i 1) $i = 1; $a = 1; $i is a variable (all variables start with $) $b = 1; while ($i <= 10) { print "Fibonacci $i = $b<br>"; $next = $a + $b; $a = $b; $b = $next; $i = $i + 1; }; Instruction ::= while (Expression) { Instructions } 31 March 2004 As long as Expression evaluates to true, keep doing Instructions. CS 200 Spring 2004 14 Using a Database • HTTP is stateless – No history of information from previous requests • To do something useful, we probably need some state that changes as people visit the site • That’s what databases are for – store, manipulate, and retrieve data 31 March 2004 CS 200 Spring 2004 15 <html> <head><title>Presidents of the United States</title></head> <body> <h1>Presidents of the United States</h1> <p> <? $hostName = "dbm1.itc.virginia.edu"; $userName = "dee2b"; $password = "quist"; $dbName = "dee2b_presidents"; … Regular HTML: Send through to client PHP Code: (inside <? … ?>) Evaluate using PHP evaluator, send result to client to Client PHP Evaluator Values SQL Command Database 31 March 2004 CS 200 Spring 2004 16 SQL • Structured Query Language (SQL) – (Almost) all databases use it • Database is tables of fields containing values • All fields have a type (and may have other attributes like UNIQUE) 31 March 2004 CS 200 Spring 2004 17 Demo http://www.cs.virginia.edu/csdb/ 31 March 2004 CS 200 Spring 2004 18 SQL Commands • Create a table CREATE TABLE presidents ( primary key – used to uniquely number INT PRIMARY KEY, select and entry in the table lastname VARCHAR(100), firstname VARCHAR(100), college VARCHAR(100), all fields must have a type startdate DATE, int – integer varchar(n) – string of up to n characters enddate DATE ); presidents number lastname 31 March 2004 firstname college startdate enddate CS 200 Spring 2004 19 SQL: Add Entry INSERT INTO presidents (number, lastname, firstname, college, startdate, enddate) VALUES (3, 'Jefferson', 'Thomas', 'William and Mary', '1801-03-04', '1809-03-03'); presidents number lastname 3 31 March 2004 firstname college startdate enddate Jefferson Thomas William and Mary CS 200 Spring 2004 1801-03-04 1809-03-03 20 SQL: Select SelectQuery ::= SELECT fields FROM table joinClause [WHERE conditions] [ORDER BY field [DESC]] SELECT * FROM presidents; SELECT lastname FROM presidents; SELECT lastname, firstname FROM presidents ORDER BY lastname; SELECT lastname, firstname FROM presidents WHERE college=‘William and Mary’ ORDER BY lastname; 31 March 2004 CS 200 Spring 2004 21 Nesting Selects • SELECT evaluates to a table, so of course, we can SELECT from that table SELECT lastname, firstname FROM (SELECT * FROM presidents WHERE college=‘William and Mary’) ORDER BY lastname; 31 March 2004 CS 200 Spring 2004 22 SQL in PHP in HTML <html> <head><title>Presidents of the United States</title></head> <body> <h1>Presidents of the United States</h1> <p> <? $hostName = "dbm1.itc.virginia.edu"; $userName = "dee2b"; $password = "quist"; $dbName = "dee2b_presidents"; mysql_connect($hostName, $userName, $password) or exit("Unable to connect to host $hostName"); mysql_select_db($dbName) or exit("Database $dbName does not exist on $hostName"); $result = mysql_query("SELECT lastname, firstname FROM presidents WHERE college='William and Mary' ORDER BY lastname"); 31 March 2004 CS 200 Spring 2004 23 $numrows = mysql_num_rows($result); $numcols = mysql_num_fields($result); print "<table border=0 cellpadding=5>"; print "<tr>"; for ($k = 0; $k < $numcols; $k = $k + 1) { print "<th>" . mysql_field_name ($result, $k) . "</th>"; } print "</tr>"; for ($i = 0; $i < $numrows; $i++) { // $i++ is short for $i = $i + 1 for ($j = 0; $j < $numcols; $j++) { print "<td>" . mysql_result ($result, $i, $j) . "</td>"; } print "</tr>"; } print "</table>"; mysql_close(); // Close the database connection ?> <p><hr> <a href="mailto:evans@cs.virginia.edu"><em>evans@cs.virginia.edu</em></a> </body></html> 31 March 2004 CS 200 Spring 2004 24 The Resulting Page 31 March 2004 CS 200 Spring 2004 25 Charge • Combining PHP, SQL and HTML is Very Powerful • Query can be a string generated by your program! – Based on user input and hyperlink clicks • Code can be generated based on what is in the database 31 March 2004 CS 200 Spring 2004 26