Creating databases for web applications Database datatypes. Creating database Homework: Create...
-
Upload
brian-houston -
Category
Documents
-
view
241 -
download
1
Transcript of Creating databases for web applications Database datatypes. Creating database Homework: Create...
Creating databases for web applications
Database datatypes. Creating databaseHomework: Create tables in database. Add
records to database.
Database design
• Not easy!• Formal methods exist.• Review: databases are made up of
– Tables: tables made up of • Records: records made up of fields
• Speaking of rows and columns is misleading• Critical issue: fixed number of fields, though a
specific field may be optional (aka not required)– NOT NULL in MySQL jargon– MySQL does support variable length strings.
Critical requirement
• Want information present only one place in database– Don’t need to change your address multiple
times.
• Reference integrity– Reference in one record point to existing record
• E.g., Orders point to actual customer
• Order detail point to actual orders
Data types
• Terminology varies for different DBMS products
• Performance (speed) of operations varies with different datatypes
• Size varies with different datatypes
• Performance and size limits are points of competition among the different DBMS products
MySQL datatypes: numbers
• INT (aka INTEGER), can be UNSIGNED (Size 4 bytes = 32 bits)
• TINYINT, SMALLINT, MEDIUMINT, BIGINT– Different sizes
• FLOAT (4 bytes), DOUBLE (8 bytes), can specify precision within these limits
• more
MySQL datatypes, strings
• CHAR(specified length)• VARCHAR(maximum length)
– trade off time to handle variable length versus space to not always store max. length
• TINYBLOB short, variable length string, up to 255 characters
• BLOB, TEXT variable length string• MEDIUMBLOB, MEDIUMTEXT,
LONGBLOB, LONGTEXT
MySQL datatypes: enum
• ENUM– Specify one of a set of values– Stored as an integer, with 0 indicated unset or
not in the specified set– Doing this may be more efficient because
built-in MySQL routines do the searching
MySQL datatypes: date/time
• DATE
• TIME
• DATETIME
• YEAR
• TIMESTAMP
Tables
• Specify one field as the primary key• Primary keys are unique IN THAT TABLE
– Let the DBMS create the primary key OR– Depend on intrinsic value that is guaranteed to be
unique• Email addresses• ISBN numbers• ?
• A field in one table may be a foreign key. This is a reference to a primary key in another table. MORE ON THIS LATER.
Database
• Assume database itself is created for us AND we have permissions to create new tables.
• NOTE: permissions can be set by MySQL commands, including queries sent by php.
• Start off talking general SQL and then specific php and MySQL
phpMyAdmin• Can use this to create tables in your one database.• The next slides show SQL Create statements to do this.• https://socialsoftware.purchase.edu/phpmyadmin • NOTE THE https!!!!!• Next sign in with your equivalent of
[email protected] and email passwordTHEN use the special MySQL user name and password.This was in the Readme file. You can change the
password.Click on password name (jmeyer_db) on the left and then
you can create a new table.EVERYONE get to this point!
Create table example
• CREATE TABLE movies (mid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,mname CHAR(30),
mdesc TEXT,
myear YEAR
)
Create table example
CREATE TABLE players ( pid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,pname CHAR(30),
score INT NOT NULL,
lastplayed DATE
)
Create example
CREATE TABLE games (gid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,pid INT,
gtime TIMESTAMP,
score INT
)
The pid field will refer to / have the value of the pid field (the primary key) of a specific player. Here in this table, it is called a foreign key.
Foreign keys• Some versions of MySQL (and other DBMS) have
ways to specify that the pid value is a foreign key pid INT REFERENCE players• The DBMS then will check to make sure it is a
valid value.• Since my JavaScript & php coding should
guarantee this in various places, I omit specifying this from my examples.– Extra credit opportunity for posting on this.– It may be that letting MySQL catch errors and trapping
the errors in the php is a better approach
Class Exercises
Write the CREATE TABLE statement for a table• MySQL generated id, course 'number'
(MAT3530.45), name, cap, credits, teacher, time slot, building
• Published book: the ISBN number can serve as primary key, title, year of publication
• Your own idea
Inherent challenges for implementation
… in developing database applications
• database persists. That is, data in database lasts (that is the whole point) so my/your/our testing needs to be aware of that.
• I forgot the passwords for larry, curly and moe.
2 table example
Bookmarks application: finders and sites• http://socialsoftware.purchase.edu/jeanine.meye
r/research/register.html
• http://socialsoftware.purchase.edu/jeanine.meyer/research/addsite.html
• http://socialsoftware.purchase.edu/jeanine.meyer/research/showsites.php
• http://socialsoftware.purchase.edu/jeanine.meyer/research/showsitesbycategory1.php
Create the tables<?phpfunction createtable($tname,$fields) {global $DBname, $link;$query = "DROP TABLE $tname";mysqli_query($link,$query);$query="CREATE TABLE ".$tname."(".$fields.")";if (mysqli_query($link,$query)) { print ("The table, $tname, was created successfully.<br>\n");
}else { print ("The table, $tname, was not created. <br>\n"); }}?>
<html><head><title>Creating bookmark tables </title> </head>
<body><?phprequire("opendbo.php");$tname = "sitesfinders";$fields="sid INT UNSIGNED NOT NULL
AUTO_INCREMENT PRIMARY KEY, stitle char(50), sdate DATE, surl char(100), sdescription TEXT, scategory char(30),
finderid INT ";createtable($tname, $fields);
$tname = "finders";$fields = "finderid INT UNSIGNED NOT
NULL AUTO_INCREMENT PRIMARY KEY, username char(50), epw char(64)";
createtable($tname,$fields);mysql_close($link);?></body></html>
adding a site
addsite.html
Use two scripts (files)
Make input fields new types.This should/will provide some checking, aka
form validation.
addsite.php
Simplified addsite.html
<!DOCTYPE html><html> <head> <title>Add site</title> </head><body><form action="addsite.php">Your name for site: <input name="stitle"/><br/>Date: <input name="sdate" type="date" /> <br/>Site description:<input name="sdesc" width="300"/><br/>Web address: <input name="surl" type="url"/><br/>Category: <input name="scat" type="text"/><br/><input type="submit" value="Submit Site"/></form></body></html>
Simplified addsite.php<html> <head> <title>Add song to database</title> </head> <body>
<?phprequire("opendbo.php");$tname = "sites";$stitle=addslashes($_GET["stitle"]);$sdate=addslashes($_GET["sdate"]);$sdesc=addslashes($_GET["sdesc"]);$surl=addslashes($_GET["surl"]);$scat = addslashes($_GET["scat"]);$query = "INSERT INTO $tname values
('0','$stitle','$sdate','$surl','$sdesc','$scat')";$result = mysqli_query($link,$query);if ($result) {
print("The site was successfully added.<br>\n"); }else { print ("The site was NOT successfully added. <br>\n"); }?></body> </html>
Actual addsite application
• Uses localStorage for id and pw
• Encodes password using clientside coding– SHA256 algorithm
• Checks id and password using finders table
• Only then adds to sitesfinders table
NOTE
• Should do checking on Date and URL fields.– This can be enhancement for the group
project.
• The addslashes 'escapes' any special characters. We see that again in next example.– May not be necessary all the time.
Show bookmark/sites
• all the sites (and all the fields for each record)• select one of the categories
– use php to get list of DISTINCT category entries– use php to select exactly those
• In both cases, the query returns an array of associative (by name) arrays. The names are the field names of the table.
• My php code creates a table, one row for each record.
• I chose to display the URLs as the href of an a tag AND as the contents of the a element.
showsites.php<html> <head> <title>List contents of sites table</title> </head> <body>
<?phprequire("opendbo.php");$query="SELECT * FROM sites ORDER BY sdate DESC";$result=mysqli_query($link, $query);print("<table border='1'>");print("<tr><th>Title</th><th>URL</th><th>Date </th><th>Description
</th><th>Category </th></tr>");while ($row=mysqli_fetch_array($result)) {print("<tr>"); print("<td> ".$row['stitle']."</td>"); print ("<td><a href='".$row['surl'] ."' target='_new'>".$row['surl']."</a></td>"); print ("<td>".$row['sdate']."</td>"); print ("<td>".$row['sdescription']."</td>"); print ("<td>".$row['scategory']."</td>"); print ("</tr>"); }mysqli_close($link);?>
</table></body> </html>
show by category
• Two php files, one calling the other as the action of a form
• Form has select
showsitesbycategory1.php showsitesbycategory2.php
showsitesbycategory1.php<html><head><title>List sites in category</title></head><body>
Pick the category you want:<br/><form action="showsitesbycategory2.php" method="get">Choices: <select name="pickedcategory">
<?phprequire("opendbo.php");
$query="SELECT DISTINCT scategory FROM sites";$categories = mysqli_query($link, $query);while ($row=mysqli_fetch_array($categories)){ $cat=$row['scategory']; print ("<option value='$cat'>$cat</option><br>\n"); }mysqli_close($link);print ("</select>");print ("<input type=submit name=submit value=\"Choose!\">
<br>\n");print ("</form>");mysqli_close($link);?></table> </body> </html>
from showsitesbycategory2.php<?php$scat = $_GET['pickedcategory'];print "Sites in $scat category <br/>";require("opendbo.php");$query="SELECT * FROM sites WHERE scategory ='$scat' ORDER
BY sdate DESC";$result=mysqli_query($link, $query);
$NoR=mysql_num_rows($result);if ($NoR==0) {
print ("No sites in that category"); } //should not happenelse {print("<table border='1'>");print("<tr><th>Title</th><th>URL</th><th>Date
</th><th>Description </th></tr>");while ($row=mysqli_fetch_array($result)) {print("<tr>"); print("<td> ".$row['stitle']."</td>"); print ("<td><a href='".$row['surl'] ."' target='_new'>".
$row['surl']."</a></td>"); print ("<td>".$row['sdate']."</td>"); print ("<td>".$row['sdescription']."</td>"); print ("</tr>"); } print ("</table>"); }mysqli_close($link);?>
new example: stories• A story is a sequence of
– scenes, each holding text and html image tags, with title and author.
• There may be choices at certain points.
• http://socialsoftware.purchase.edu/jeanine.meyer/newstories/tellStory.php
• Room for improvement– This is one of the projects to enhance.
3 tables
• stories2: holds title, author, scene, permflag plus a primary key auto-increment field generated by MySQL
• parentchild: holds one record for each (forward) link: parent to child (scene to a successor) plus a primary key …
• starts: holds one record for each scene designated as start of a story: first (pointer into stories2 table) plus a primary key …
Entity Relationship Diagram
stories2 sid title scene author permflag
parentchild pcid parent child
starts
stid
first
each parent, child, first is exactly 1 record in stories2
0
0
0
A record in stories2 may not be represented as a parent or child or first
Comment
• Could this be done other ways? Yes.– My first attempt used one table with prev and
next fields
Example of SQL SELECTThe php variable $next holds the current scene. Code gathers
information on all child (successor) scenes to present choice to viewer.
• in SQL (as much as possible with $next holding a value)SELECT s.sid, s.title, s.author FROM parentchild as p JOIN stories2 as s
WHERE p.parent= $next AND s.sid= p.child
• php: $query=
"SELECT s.sid, s.title, s.author FROM parentchild as p JOIN stories2 as s ";
$query.=" WHERE p.parent=$next AND s.sid=p.child";
Explanation
• Look at the parentchild table and pick up all the records with the parent field being a specified value. Call this group A.
• Look at stories2 table and pick up all records with sid being equal to a child value in group A.
• Think of this as a new table, consisting of portions of the old tabled joined together.
• for this new table, extract the sid, title and author values.– this will be used to create the form (radio buttons and
text next to the radio buttons)
phpmyadmin
• Go to https://socialsoftware.purchase.edu/phpmyadmin– First logon: use your email id and password– Second logon: use what was sent to you in
the email
• NOTE: for our applications, we will be using php scripts, not phpmyadmin. BUT phpmyadmin may be useful for debugging.
opendbo.php file<?php
global $DBname, $link;
$host = '127.0.0.1’;
$user=" ";
$password=" ";
$DBname=" ”;
$link = new mysqli($host,$user,$password);
if ($link->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
mysqli_select_db($link,$DBname);
?>
Homework
• [Confirm that you can access phpmyadmin]• Use phpmyadmin to create table • Use code to create a table
– need to drop table to create a (new) table with the same name
• Write html and php to INSERT records• Write php to display whole table• Use code in charts and posted on-line sources!
– Post comments– Improve appearance– Extra credit: insert default values. Do validation.
• USE SOURCES!!!
Preview• Will divide into teams, each teams taking one of the
examples and– study it & enhance it– present to the class– Bookmark project, with userid/password system:
http://faculty.purchase.edu/jeanine.meyer/db/bookmarkfiles.zip– Tell a story:
http://faculty.purchase.edu/jeanine.meyer/db/newstory.zip– Others:
http://faculty.purchase.edu/jeanine.meyer/db/examples.html
• THEN do an original project (can copy parts of sample projects)