Advanced SQL Charles Severance www.php-intro.com.

Slides:



Advertisements
Similar presentations
Dr. Alexandra I. Cristea CS 252: Fundamentals of Relational Databases: SQL5.
Advertisements

Keys, Referential Integrity and PHP One to Many on the Web.
SQL Subqueries Objectives of the Lecture : To consider the general nature of subqueries. To consider simple versus correlated subqueries. To consider the.
Introduction to Structured Query Language (SQL)
My CD Database THE BEST Shoemaker, Ray, Gleisberg.
A Guide to Oracle9i1 Advanced SQL And PL/SQL Topics Chapter 9.
Using Relational Databases and SQL Steven Emory Department of Computer Science California State University, Los Angeles Lecture 7: Aggregates.
Database Systems More SQL Database Design -- More SQL1.
Accessing MySQL Using PDO
A Guide to MySQL 7. 2 Objectives Understand, define, and drop views Recognize the benefits of using views Use a view to update data Grant and revoke users’
View and Materialized view. What is a view? Logically represents subset of data from one or more table. In sql, a view is a virtual relation based on.
Relational Database Design and MySQL
Using Relational Databases and SQL Department of Computer Science California State University, Los Angeles Lecture 7:
Using Relational Databases and SQL Steven Emory Department of Computer Science California State University, Los Angeles Lecture 2: Single-Table Selections.
Database Systems: Design, Implementation, and Management Eighth Edition Chapter 7 Introduction to Structured Query Language (SQL)
Inner join, self join and Outer join Sen Zhang. Joining data together is one of the most significant strengths of a relational database. A join is a query.
DAY 21: MICROSOFT ACCESS – CHAPTER 5 MICROSOFT ACCESS – CHAPTER 6 MICROSOFT ACCESS – CHAPTER 7 Akhila Kondai October 30, 2013.
Check That Input Preventing SQL Injection Attacks By Andrew Morton For CS 410.
PHP1-1 PHP & SQL Xingquan (Hill) Zhu
Bags, foreign keys, selects, joins, and yes, btw, SVN 2/18/2014.
PHP meets MySQL.
CHAPTER:14 Simple Queries in SQL Prepared By Prepared By : VINAY ALEXANDER ( विनय अलेक्सजेंड़र ) PGT(CS),KV JHAGRAKHAND.
CS 174: Web Programming September 23 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak
1 Intro to JOINs SQL INNER JOIN SQL OUTER JOIN SQL FULL JOIN SQL CROSS JOIN Intro to VIEWs Simple VIEWs Considerations about VIEWs VIEWs as filters ALTER.
Structured Query Language Chris Nelson CS 157B Spring 2008.
Copyright © 2013 Curt Hill Database Security An Overview with some SQL.
INTRODUCTION TO DATABASE MANAGEMENT SYSTEMS Dr. Adam P. Anthony.
U:/msu/course/cse/103 Day 06, Slide 1 CSE students: Do not log in yet. Review Day 6 in your textbook. Think about.
Database Systems Microsoft Access Practical #3 Queries Nos 215.
CHAPTER 9 PHP AND MYSQL. A POSSIBLE SITE CONFIGURATION Application Folder index.php includes (folder)header.phpfooter.phpstyle.cssmodel (folder)mysqli_connect.php.
Views Lesson 7.
Database Systems Design, Implementation, and Management Coronel | Morris 11e ©2015 Cengage Learning. All Rights Reserved. May not be scanned, copied or.
Copyright © Curt Hill Queries in SQL More options.
Security Considerations Steve Perry
AL-MAAREFA COLLEGE FOR SCIENCE AND TECHNOLOGY INFO 232: DATABASE SYSTEMS CHAPTER 7 (Part II) INTRODUCTION TO STRUCTURED QUERY LANGUAGE (SQL) Instructor.
Chapter 13 Views Oracle 10g: SQL. Oracle 10g: SQL2 Objectives Create a view, using CREATE VIEW command or the CREATE OR REPLACE VIEW command Employ the.
Relational Databases Charles Severance. Unless otherwise noted, the content of this course material is licensed under a Creative Commons Attribution 3.0.
Chapter 5 : Integrity And Security  Domain Constraints  Referential Integrity  Security  Triggers  Authorization  Authorization in SQL  Views 
>> Introduction to MySQL. Introduction Structured Query Language (SQL) – Standard Database Language – Manage Data in a DBMS (Database Management System)
CHAPTER 10 PHP MySQL Database
Relational Databases and SQLite
Accessing MySQL Using PDO Charles Severance
ASSIGNMENT 2 Salim Malakouti. Ticketing Website  User submits tickets  Admins answer tickets or take appropriate actions.
Accessing MySQL Using PDO Charles Severance
Relational Database Design and MySQL Charles Severance
IS2803 Developing Multimedia Applications for Business (Part 2) Lecture 5: SQL I Rob Gleasure robgleasure.com.
U:/msu/course/cse/103 Day 08, Slide 1 Debrief Homework What problems arose in trying to import the data from Classical_Music.xls?
7 1 Database Systems: Design, Implementation, & Management, 7 th Edition, Rob & Coronel 7.6 Advanced Select Queries SQL provides useful functions that.
LM 5 Introduction to SQL MISM 4135 Instructor: Dr. Lei Li.
MICROSOFT ACCESS – CHAPTER 5 MICROSOFT ACCESS – CHAPTER 6 MICROSOFT ACCESS – CHAPTER 7 Sravanthi Lakkimsety Mar 14,2016.
SQL: Interactive Queries (2) Prof. Weining Zhang Cs.utsa.edu.
Using Handlebars Dr. Charles Severance
Relational Databases Charles Severance Relational Databases Relational databases model data by storing.
TSUGI Framework Data Model
More SQL: Complex Queries, Triggers, Views, and Schema Modification
C.R.U.D. Charles Severance
More SQL: Complex Queries,
MySQL Subquery Source: Dev.MySql.com
Advanced SQL Charles Severance
Prepared by : Moshira M. Ali CS490 Coordinator Arab Open University
Relational Databases and SQLite
SQL – Subqueries.
Chapter # 7 Introduction to Structured Query Language (SQL) Part II.
SQL – Entire Select.
More SQL: Complex Queries, Triggers, Views, and Schema Modification
Access: SQL Participation Project
Views.
CSC 453 Database Systems Lecture
Database Systems: Design, Implementation, and Management Tenth Edition
Presentation transcript:

Advanced SQL Charles Severance

Error Checking So Far We get away with ignoring because errors are rare and usually "big" Bad database connection Bad SQL syntax in a query Missing table, missing column – schema / query mismatch Missing required parameter Violation of a constraint

Start Simple We just configure PDO to throw an error if anything goes wrong php-intro/code/pdo/pdo.php <?php $pdo = new PDO('mysql:host=localhost;port=8889;dbname=misc', 'fred', 'zap'); // See the "errors" folder for details... $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("SELECT * FROM users where id = :xyz"); $stmt->execute(array(":pizza" => $_GET['id'])); $row = $stmt->fetch(PDO::FETCH_ASSOC); if ( $row === false ) { $_SESSION['error'] = 'Bad value for id'; header( 'Location: index.php' ) ; return; } php- intro/code/pdoerrors/error2.php

In Production Environments We do not want to have trace-backs in the user interface - may reveal sensitive data We want extensive error logging of any error anywhere in our application – users will not report errors Some errors are subtle and can be affected by user-entered data – length of VARCHAR field for example People attacking your system "Fuzz Testing" POST weird data

$sql = "INSERT INTO {$p}sample_map (context_id, user_id, lat, lng, updated_at) VALUES ( :CID, :UID, :LAT, :LNG, NOW() ) ON DUPLICATE KEY UPDATE lat = :LAT, lng = :LNG, updated_at = NOW()"; $stmt = $PDOX->prepare($sql); $stmt->execute(array( ':CID' => $CONTEXT->id, ':UID' => $USER->id, ':LAT' => $_POST['lat'], ':LNG' => $_POST['lng'])); $_SESSION['success'] = 'Location updated...'; header( 'Location: '.addSession('index.php') ) ; return; tsugi/exercises/map/index.php What could go wrong?

tsugi/lib/vendor/Tsugi/Util/PDOX.php queryReturnError() function queryDie($sql, $arr=FALSE, $error_log=TRUE) { $q = FALSE; $success = FALSE; $message = ''; try { $q = $this->prepare($sql); if ( $arr === FALSE ) { $success = $q->execute(); } else { $success = $q->execute($arr); } } catch(\Exception $e) { $success = FALSE; $message = $e->getMessage(); if ( $error_log ) error_log($message); } if ( ! $success ) die('Internal database error'); return $q; } $rows = $PDOX->queryDie( "DELETE FROM {$p}attend WHERE link_id = :LI", array(':LI' => $LINK->id) ); tsugi/mod/attend/index.php

$sql = "INSERT INTO {$p}sample_map (context_id, user_id, lat, lng, updated_at) VALUES ( :CID, :UID, :LAT, :LNG, NOW() ) ON DUPLICATE KEY UPDATE lat = :LAT, lng = :LNG, updated_at = NOW()"; $stmt = $PDOX->prepare($sql); $stmt->execute(array( ':CID' => $CONTEXT->id, ':UID' => $USER->id, ':LAT' => $_POST['lat'], ':LNG' => $_POST['lng'])); $_SESSION['success'] = 'Location updated...'; header( 'Location: '.addSession('index.php') ) ; return; tsugi/exercises/map/index.php

$stmt = $PDOX->queryDie("INSERT INTO {$p}sample_map (context_id, user_id, lat, lng, updated_at) VALUES ( :CID, :UID, :LAT, :LNG, NOW() ) ON DUPLICATE KEY UPDATE lat = :LAT, lng = :LNG, updated_at = NOW()", array( ':CID' => $CONTEXT->id, ':UID' => $USER->id, ':LAT' => $_POST['lat'], ':LNG' => $_POST['lng']) ); $_SESSION['success'] = 'Location updated...'; header( 'Location: '.addSession('index.php') ) ; return; tsugi/lib/vendor/Tsugi/Util/PDOX.php

Advanced Queries

LEFT JOIN For a normal JOIN, a row is only included in the result of the SELECT if and only if both sides of the on clause are present The ON clause functions as a WHERE clause The order of the tables in the JOIN clause does not matter A LEFT JOIN removes this restriction All the rows from the "left" table that match the WHERE clause are included whether or not the ON clause finds a row in the "right" table

select Album.title, Album.artist_id, Artist.artist_id,Artist.name from Album join Artist on Album.artist_id = Artist.artist_id Album.title Album.artist_id Artist.atrist_id Artist.name

Users Profile SELECT Users.name,Users.user_id, Profile.user_id,Profile.laptop FROM Users JOIN Profile ON Users.user_id = Profile.user_id

Users Profile SELECT Users.name,Users.user_id, Profile.user_id,Profile.laptop FROM Users LEFT JOIN Profile ON Users.user_id = Profile.user_id

Example of LEFT JOIN In the OAUTH 1.x protocols in order to defeat replay attacks, each launch includes a "Cryptographic Nonce" In security engineering, a nonce is an arbitrary number used only once in a cryptographic communication. It is similar in spirit to a nonce word, hence the name. It is often a random or pseudo-random number issued in an authentication protocol to ensure that old communications cannot be reused in replay attacks.

LTI Sample Launch Data lti_version=LTI-1p0 lti_message_type=basic-lti-launch-request context_id= context_title=SI301 – PHP resource_link_id=120988f user_id= roles=Instructor lis_person_name_full=Charles R. Severance lis_person_contact_ _primary = tool_consumer_instance_description=University of School oauth_consumer_key=lmsng.school.edu oauth_nonce=0ff19a c33233dfb8ecd0c9c...

tsugi/docs/lectures/02-Data-Model-Workbench.mwb

lti_nonce SELECT k.key_id, k.key_key, k.secret, n.nonce FROM lti_key AS k LEFT JOIN lti_nonce AS n ON k.key_id = n.key_id AND n.nonce = :nonce WHERE k.key_sha256 = :key LIMIT 1 lti_nonce

SELECT k.key_id, k.key_key, k.secret, k.new_secret, c.settings_url AS key_settings_url, n.nonce, c.context_id, c.title AS context_title, context_sha256, c.settings_url AS context_settings_url, l.link_id, l.title AS link_title, l.settings AS link_settings, l.settings_url AS link_settings_url, u.user_id, u.displayname AS user_displayname, u. AS user_ , u.subscribe AS subscribe, u.user_sha256 AS user_sha256, m.membership_id, m.role, m.role_override, p.profile_id, p.displayname AS profile_displayname, p. AS profile_ , p.subscribe AS profile_subscribe, s.service_id, s.service_key AS service, r.result_id, r.sourcedid, r.grade, r.result_url FROM lti_key AS k LEFT JOIN lti_nonce AS n ON k.key_id = n.key_id AND n.nonce = :nonce LEFT JOIN lti_context AS c ON k.key_id = c.key_id AND c.context_sha256 = :context LEFT JOIN lti_link AS l ON c.context_id = l.context_id AND l.link_sha256 = :link LEFT JOIN lti_user AS u ON k.key_id = u.key_id AND u.user_sha256 = :user LEFT JOIN lti_membership AS m ON u.user_id = m.user_id AND c.context_id = m.context_id LEFT JOIN profile AS p ON u.profile_id = p.profile_id LEFT JOIN lti_service AS s ON k.key_id = s.key_id AND s.service_sha256 = :service LEFT JOIN lti_result AS r ON u.user_id = r.user_id AND l.link_id = r.link_id WHERE k.key_sha256 = :key LIMIT 1 tsugi/lib/vendor/Tsugi/Core/LTIX.php loadAllData() The "big JOIN"

GROUP BY Sometimes instead of wanting all of the rows from a table we want to count the distinct values of a column This is done with a GROUP BY and aggregation function SELECT album_id, COUNT(track_id) FROM Track GROUP BY album_id

Subqueries (use wisely) Sometimes in a WHERE clause you want to choose records based on another query SELECT Track.title FROM Track WHERE album_id IN (SELECT album_id FROM Album WHERE title LIKE '%I%')

An Example from Tsugi tsugi/mod/peer-grade

SELECT S.submit_id, S.user_id, S.created_at, count(G.user_id) AS grade_count FROM {$CFG->dbprefix}peer_submit AS S LEFT JOIN {$CFG->dbprefix}peer_grade AS G ON S.submit_id = G.submit_id WHERE S.assn_id = :AID AND S.user_id != :UID AND S.submit_id NOT IN ( SELECT DISTINCT submit_id from {$CFG->dbprefix}peer_grade WHERE user_id = :UID) GROUP BY S.submit_id, S.created_at ORDER BY grade_count ASC, S.created_at ASC LIMIT 10 tsugi/mod/peer-grade/peer_util.php loadUngraded() handling.html

tsugi/mod/peer-grade/admin.php

SELECT S.user_id AS user_id, displayname, , S.submit_id as _submit_id, MAX(G.points) as max_score, MIN(G.points) AS min_score, COUNT(G.points) as scores, COUNT(DISTINCT F.flag_id) as flagged, MAX(S.updated_at) AS updated_at, user_key FROM {$p}peer_assn AS A JOIN {$p}peer_submit as S ON A.assn_id = S.assn_id JOIN {$p}lti_user AS U ON S.user_id = U.user_id LEFT JOIN {$p}peer_grade AS G ON S.submit_id = G.submit_id LEFT JOIN {$p}peer_flag AS F ON S.submit_id = F.submit_id WHERE A.link_id = :LID GROUP BY S.submit_id tsugi/mod/peer-grade/admin.php

SELECT S.assn_id, S.user_id AS user_id, , displayname, S.submit_id as submit_id, MAX(points) as max_points, COUNT(points) as count_points, C.grade_count as grade_count FROM {$CFG->dbprefix}peer_submit as S JOIN {$CFG->dbprefix}peer_grade AS G ON S.submit_id = G.submit_id JOIN {$CFG->dbprefix}lti_user AS U ON S.user_id = U.user_id LEFT JOIN ( SELECT G.user_id AS user_id, count(G.user_id) as grade_count FROM {$CFG->dbprefix}peer_submit as S JOIN {$CFG->dbprefix}peer_grade AS G ON S.submit_id = G.submit_id WHERE S.assn_id = :AID AND G.user_id = :UID ) AS C ON U.user_id = C.user_id WHERE S.assn_id = :AID AND S.user_id = :UID tsugi/mod/peer-grade/peer_util.php computeGrade()

Summary More advanced error checking in PDO (its complex) LEFT JOIN GROUP BY Subqueries AS There is still much more...