Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
21 – Persistent data storage: relational databases and MySQL Mark Dixon Page 1 Questions: Session variables • Write a line of code to put 59 into a session variable called score. $_SESSION["score"] = 59 • Write code that adds 1 to a variable called g, when a session variable called i is over 25. if($_SESSION["i"] > 25){ $g = $g + 1 } Mark Dixon Page 2 Admin: SQL Book Gennick J (2006) SQL Pocket Guide (2nd edition). O'Reilly. ISBN: 0-596-52688-1 Mark Dixon Page 3 Session Aims & Objectives • Aims – To introduce the fundamental ideas involved in using relational databases for persistent data storage • Objectives, by end of this week’s sessions, you should be able to: – create a relational database table – create a web page that displays data from a single table in a database – use SQL in your programs to create more complex record-sets, using records and fields Mark Dixon Page 4 Persistent Data Storage • So far – programs (web-pages) lose data when closed • Not realistic – typically data stored to persistent storage device (e.g. hard disk, key drive, floppy disk, CD-RW) • Use either – flat files – database (relational, or object oriented) Mark Dixon Page 5 Example: People (analysis) SPECIFICATION • User Requirements – need to have access to people's details • Software Requirements – Functional: –Display list of people from a database – Non-functional should be viewable anywhere in the world Mark Dixon Page 6 Example: People (Database) • Information organised into – tables (e.g. person) – fields (e.g. phone) – records (e.g. 1 Dixon Mark 01752 232556 …) Person ID 1 2 3 Mark Dixon Surname Dixon Smith Jones Field Record Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 Gender Male Male Female Page 7 Questions: Music (Database) • How many fields? • How many records? 3 9 Track Mark Dixon Track Title Artist Name Country Paranoid Black Sabbath UK Falling in Love Aerosmith US Pink Aerosmith US Love in an Elevator Aerosmith US Smooth Criminal Alien Ant Farm US Meaning of Life Disturbed US The Game Disturbed US Voices Disturbed US Down with the Sickness Disturbed US Page 8 DBMS • Database Management Systems (DBMS) provide facilities for: – creating and changing databases • add/remove records • add/remove fields • add/remove data – For example: • • • • • • Mark Dixon Microsoft Access dBase Borland Paradox MySQL Microsoft SQL Server Oracle home/small business large scale Page 9 PhpMyAdmin • used to create tables, fields, etc. add port number :8080 Mark Dixon Page 10 Using Queries <?php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); ?> Connect to MySQL Select Database Get Data from Table Read Record / Row Read Field <html> <head><title></title></head> <body> <?php echo $s; ?> </body> </html> Mark Dixon Page 11 Example: People (Open) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); echo $s; Mark Dixon Page 12 Example: People People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); echo $s; Mark Dixon Page 13 Example: People (EOF) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); echo $s; Mark Dixon Page 14 Example: People People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br /> echo $s; Mark Dixon Page 15 Example: People (Loop) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br /> echo $s; Mark Dixon Page 16 Example: People (EOF) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br /> echo $s; Mark Dixon Page 17 Example: People People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br /> />Smith<br /> echo $s; Mark Dixon Page 18 Example: People (Loop) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br />Smith<br /> echo $s; Mark Dixon Page 19 Example: People (EOF) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br />Smith<br /> echo $s; Mark Dixon Page 20 Example: People People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br />Smith<br /> />Jones<br /> echo $s; Mark Dixon Page 21 Example: People (Loop) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br />Smith<br />Jones<br /> echo $s; Mark Dixon Page 22 Example: People (EOF) People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); rs ID 1 2 3 Surname Dixon Smith Jones Forenames Mark John Sally Phone 01752 232556 01752 111111 01752 888888 gender Male Male Female $s Dixon<br />Smith<br />Jones<br /> echo $s; Mark Dixon Page 23 Example: People People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q $s Dixon<br />Smith<br />Jones<br /> echo $s; Mark Dixon Page 24 Example: People People.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); $q $s Dixon<br />Smith<br />Jones<br /> echo $s; Mark Dixon Page 25 Example: Countries Countries.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('Countries'); $q = mysql_query('SELECT * FROM Country;'); mysql_close($c); html by hand put br tags between data <br /> $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Name']; } mysql_free_result($q); Need data on separate lines Mark Dixon Page 26 Example: Countries (error) Countries.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('Countries'); $q = mysql_query('SELECT * FROM Country;'); mysql_close($c); Try putting br tag here $s = <br />; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Name']; } mysql_free_result($q); php does not understand html Mark Dixon Page 27 Example: Countries Countries.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('Countries'); $q = mysql_query('SELECT * FROM Country;'); mysql_close($c); $s = "<br />"; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Name']; } mysql_free_result($q); • Need double quotes around tag • (php sees html as literal string) runs, but br in wrong place Mark Dixon Page 28 Example: Countries Countries.php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('Countries'); $q = mysql_query('SELECT * FROM Country;'); mysql_close($c); Move br tag inside loop. Which bit of code pulls data from database? $s = "<br />"; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Name']; } mysql_free_result($q); Mark Dixon Page 29 Example: Countries Countries.aspx $c = mysql_connect('localhost', 'root', ''); mysql_select_db('Countries'); $q = mysql_query('SELECT * FROM Country;'); mysql_close($c); Move br tag inside loop. after field data $s = ""; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Name'] . "<br />"; } mysql_free_result($q); View Source Mark Dixon Page 30 Embedding html in php • html must be string (inside double quotes) • follows normal pattern for expressions: data data data data $s = $s . "<b>" . $r['Name'] . "</b>"; operator Mark Dixon operator operator Page 31 Embedding html in php (errors) $s = $s . "<i>" $r['Gender'] . "</i>"; missing operator $s = $s . $r['Height'] . </i>"; missing double quote $s = $s . <ul> . $r['Height']; html tag must be inside double quotes $s = $s . "<ul>" . $r['<b>Height']; looks for field in database called <b>Height Mark Dixon Page 32 Questions: HTML in php • Are these correct (assume variables and fields exist)? $g = $g . $r['Surname<br />']; $h = $h . "<ol>" $r['Width']; $a = "<p>" . $a . "</p>"; $html = $html . "<img src=face.gif />"; $h = <table> . $h . "</table>"; Mark Dixon Page 33 Example: People v2 • Display Surname of Male people: <?php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ if($r['Gender'] == 1){ $s = $s . $r['Surname'] . '<br />'; } } mysql_free_result($q); ?> Mark Dixon Page 34 Example: People v3 • Display Surname of Male people: <?php $c = mysql_connect('localhost', 'root', ''); mysql_select_db('People'); $q = mysql_query('SELECT * FROM Person WHERE Gender=1;'); mysql_close($c); $s = ''; while ($r = mysql_fetch_array($q)){ $s = $s . $r['Surname'] . '<br />'; } mysql_free_result($q); ?> SQL statement Mark Dixon Page 35 SQL: Queries • main purpose of databases: – get information back out: searching • Structured Query Language – dedicated to interacting with databases • 3rd Generation Language (such as VB, C++) – code describes how to do task • 4th Generation Language (such as SQL) – code describes what to do (not how to do it) Mark Dixon Page 36 SQL: SELECT statement • SELECT statement – used to get data – can be embedded in php, via mysql_query: $q = mysql_query('SELECT * FROM Person'); all fields Mark Dixon Page 37 SQL: WHERE & ORDER BY • WHERE clause – used to restrict data SELECT * FROM People WHERE age>=18; • ORDER BY clause – used to change order of data SELECT * FROM People ORDER BY Surname; Mark Dixon Page 38 SQL: strings (text data) • Possible confusion: SELECT * FROM Person WHERE Surname = Smith this will look for field called Smith - gives error • need single (SQL) quotes to signify literal text SELECT * FROM Person WHERE Surname = 'Smith' Mark Dixon Page 39 Questions: SQL • Create an SQL statement to extract Track Title of records by Aerosmith Track TrackTitle ArtistName Country Paranoid Black Sabbath UK Falling in Love Aerosmith US Pink Aerosmith US Love in an Elevator Aerosmith US Smooth Criminal Alien Ant Farm US Meaning of Life Disturbed US The Game Disturbed US Voices Disturbed US Down with the Sickness Disturbed US SELECT TrackTitle FROM Track WHERE ArtistName = 'Aerosmith'; Mark Dixon Page 40 Questions: SQL • Create an SQL statement to extract all fields of songs by Disturbed, ordered by track name Track TrackTitle ArtistName Country Paranoid Black Sabbath UK Falling in Love Aerosmith US Pink Aerosmith US Love in an Elevator Aerosmith US Smooth Criminal Alien Ant Farm US Meaning of Life Disturbed US The Game Disturbed US Voices Disturbed US Down with the Sickness Disturbed US SELECT * FROM Track WHERE ArtistName = 'Disturbed' ORDER BY TrackTitle; Mark Dixon Page 41 Example: People v4 • User controls what is displayed: Mark Dixon Page 42 SQL: DISTINCT records ArtistName SELECT ArtistName FROM Track; Black Sabbath Aerosmith Aerosmith Aerosmith Alien Ant Farm Disturbed Disturbed Disturbed Disturbed SELECT DISTINCT ArtistName FROM Track; ArtistName Black Sabbath Aerosmith Alien Ant Farm Disturbed Mark Dixon Page 43 Tutorial Exercise: People • • • • • • • • • Task 1: Create your own People database: – Start WAMP Server – Open PhpMyAdmin – Create a new database – Create a new table – Create fields – Enter data Task 2: Get the People v1 example (from the lecture) working. Task 3: Modify your page so that it displays phone number as well as the person's name. Task 4: Modify your page so that it displays the data in an html table. Task 5: Modify your page so that records for males are displayed in blue, and records for females are displayed in red. Task 6: Modify your page as per version 4. You will need to: – Add a form to the page, and three submit buttons – In your code, detect when a button has been pressed (have a look at previous weeks) Task 7: Modify your page so that the user can type a letter, and only names starting with that letter are displayed. Task 8: Modify your page so that the user can type a series of numerical digits and only phone numbers containing those digits are displayed. Task 9: Modify your code so that the user can order the data by surname, or email address (You may want to use a Query String) Mark Dixon Page 44