Zend Framework Database Access



Similar documents
Q&A for Zend Framework Database Access

Facebook Twitter YouTube Google Plus Website

Certified PHP/MySQL Web Developer Course

Oracle Database: SQL and PL/SQL Fundamentals

Connecting to a Database Using PHP. Prof. Jim Whitehead CMPS 183, Spring 2006 May 15, 2006

database abstraction layer database abstraction layers in PHP Lukas Smith BackendMedia

Oracle Database: SQL and PL/SQL Fundamentals NEW

SQL Injection. SQL Injection. CSCI 4971 Secure Software Principles. Rensselaer Polytechnic Institute. Spring

Financial Data Access with SQL, Excel & VBA

A table is a collection of related data entries and it consists of columns and rows.

Oracle SQL. Course Summary. Duration. Objectives

Oracle Database 12c: Introduction to SQL Ed 1.1

INFORMATION BROCHURE Certificate Course in Web Design Using PHP/MySQL

Advanced Object Oriented Database access using PDO. Marcus Börger

Oracle Database: SQL and PL/SQL Fundamentals

DIPLOMA IN WEBDEVELOPMENT

Web Development using PHP (WD_PHP) Duration 1.5 months

1. What is SQL Injection?

Concepts Design Basics Command-line MySQL Security Loophole

SQL - QUICK GUIDE. Allows users to access data in relational database management systems.

LAMP [Linux. Apache. MySQL. PHP] Industrial Implementations Module Description

A SQL Injection : Internal Investigation of Injection, Detection and Prevention of SQL Injection Attacks

Beginning C# 5.0. Databases. Vidya Vrat Agarwal. Second Edition

A Brief Introduction to MySQL

Oracle Database 10g: Introduction to SQL

MYSQL DATABASE ACCESS WITH PHP

MySQL for Beginners Ed 3

INSTALLING, CONFIGURING, AND DEVELOPING WITH XAMPP

Querying Microsoft SQL Server

Oracle Database: SQL and PL/SQL Fundamentals NEW

3.GETTING STARTED WITH ORACLE8i

Instant SQL Programming

Automation of Library (Codes) Development for Content Management System (CMS)

Real SQL Programming 1

Web development... the server side (of the force)

The release notes provide details of enhancements and features in Cloudera ODBC Driver for Impala , as well as the version history.

Duration Vendor Audience 5 Days Oracle End Users, Developers, Technical Consultants and Support Staff

Online Multimedia Winter semester 2015/16

Course ID#: W 35 Hrs. Course Content

Skills for Employment Investment Project (SEIP)

7 Web Databases. Access to Web Databases: Servlets, Applets. Java Server Pages PHP, PEAR. Languages: Java, PHP, Python,...

D61830GC30. MySQL for Developers. Summary. Introduction. Prerequisites. At Course completion After completing this course, students will be able to:

Conquer the 5 Most Common Magento Coding Issues to Optimize Your Site for Performance

MOC 20461C: Querying Microsoft SQL Server. Course Overview

Introducing Microsoft SQL Server 2012 Getting Started with SQL Server Management Studio

Intro to Databases. ACM Webmonkeys 2011

All MySQL and PHP training students receive a copy of Apress' Beginning PHP and MySQL 5: From Novice to Professional and other related courseware.

Writing Scripts with PHP s PEAR DB Module

SQL Injection Vulnerabilities in Desktop Applications

!"#"$%&'(()!!!"#$%&'())*"&+%

Querying Microsoft SQL Server Course M Day(s) 30:00 Hours

Oracle EBS Interface Connector User Guide V1.4

SAP Business Objects Business Intelligence platform Document Version: 4.1 Support Package Data Federation Administration Tool Guide

Database Programming. Week *Some of the slides in this lecture are created by Prof. Ian Horrocks from University of Oxford

Database Administration with MySQL

Querying Microsoft SQL Server 2012

MOC QUERYING MICROSOFT SQL SERVER

ICT. PHP coding. Universityy. in any

Course 20461C: Querying Microsoft SQL Server Duration: 35 hours

Advanced PostgreSQL SQL Injection and Filter Bypass Techniques

PHP Data Objects Layer (PDO) Ilia Alshanetsky

Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is

Course 10774A: Querying Microsoft SQL Server 2012

Course 10774A: Querying Microsoft SQL Server 2012 Length: 5 Days Published: May 25, 2012 Language(s): English Audience(s): IT Professionals

Relational Databases. Christopher Simpkins

Querying Microsoft SQL Server 20461C; 5 days

Using IRDB in a Dot Net Project

Serious Threat. Targets for Attack. Characterization of Attack. SQL Injection 4/9/2010 COMP On August 17, 2009, the United States Justice

Database 10g Edition: All possible 10g features, either bundled or available at additional cost.

Oracle Database: Introduction to SQL

Structured Query Language. Telemark University College Department of Electrical Engineering, Information Technology and Cybernetics

Information Technology NVEQ Level 2 Class X IT207-NQ2012-Database Development (Basic) Student s Handbook

Ruby on Rails. Object Oriented Analysis & Design CSCI-5448 University of Colorado, Boulder. -Dheeraj Potlapally

Oracle 10g PL/SQL Training

PL/SQL Overview. Basic Structure and Syntax of PL/SQL

Object Oriented Databases. OOAD Fall 2012 Arjun Gopalakrishna Bhavya Udayashankar

Oracle Database: Introduction to SQL

The full setup includes the server itself, the server control panel, Firebird Database Server, and three sample applications with source code.

SnapLogic Salesforce Snap Reference

Java EE Web Development Course Program

FileMaker 12. ODBC and JDBC Guide

ODBC Chapter,First Edition

J j enterpririse. Oracle Application Express 3. Develop Native Oracle database-centric web applications quickly and easily with Oracle APEX

Maksym Iaroshenko Co-Founder and Senior Software Engineer at Eltrino. Magento non-mysql implementations

CSCI110 Exercise 4: Database - MySQL

Magento Extension Developer s Guide

Package sjdbc. R topics documented: February 20, 2015

Visual Basic. murach's TRAINING & REFERENCE

Course Number: IAC-SOFT-WDAD Web Design and Application Development

Database Security. Principle of Least Privilege. DBMS Security. IT420: Database Management and Organization. Database Security.

Mul$media im Netz (Online Mul$media) Wintersemester 2014/15. Übung 03 (Nebenfach)

Here is a quick diagram of the ULV SSO/Sync Application. Number 3 is what we deal with in this document.

Log Analyzer Reference

Online shopping store

Accessing Your Database with JMP 10 JMP Discovery Conference 2012 Brian Corcoran SAS Institute

relational database tables row column SQL

DBMS / Business Intelligence, SQL Server

Transcription:

Zend Framework Database Access Bill Karwin Copyright 2007, Zend Technologies Inc.

Introduction What s in the Zend_Db component? Examples of using each class Using Zend_Db in MVC applications Zend Framework Database Quick Start 2007-10-09 Page 2

Introduction to Zend Framework PHP class library Open source Emphasis on quality Extreme simplicity Popular Provides common web application functionality so you don t have to Use-at-will library of object-oriented PHP classes 154,000+ lines of code 100% PHP works on standard PHP as well as Zend Core Requires PHP 5.1.4+ Zend Framework Database Quick Start 2007-10-09 Page 3

Introduction to Zend Framework PHP class library Open source Emphasis on quality Extreme simplicity Popular Free software for development and deployment New BSD license (similar to PHP itself) Friendly to commercial projects Code is free of legal claims, by virtue of the Contributor License Agreement Zend Framework Database Quick Start 2007-10-09 Page 4

Introduction to Zend Framework PHP class library Open source Emphasis on quality Extreme simplicity Popular Agile development model Frequent evaluation by large user community Goal of 90% coverage in automated tests Tests consist of 105,000+ lines of code (40% of total code) Thorough documentation Zend Framework Database Quick Start 2007-10-09 Page 5

Introduction to Zend Framework PHP class library Open source Emphasis on quality Extreme simplicity Popular Designed to make development easy Solves 80% most needed use cases Extensible; developers implement custom behavior from the remaining 20% (think of the long tail ) Zend Framework Database Quick Start 2007-10-09 Page 6

Introduction to Zend Framework PHP class library Open source Emphasis on quality Extreme simplicity Popular Over 2.3 M downloads accelerating! Over 300 contributors Powers many high-profile web sites IBM QEDWiki Right Media Advertising Exchange Varien Magento bwin International In-Ticketing fav.or.it Zend Framework Database Quick Start 2007-10-09 Page 7

What s in the Zend_Db component? Database Adapters CRUD functions Quoting SQL values and identifiers Query profiler Query builder Table and Row OO patterns Common interface to multiple databases Supports both PDO and native database extensions: Mysqli Oracle OCI8 IBM DB2 PDO IBM PDO Mysql PDO Mssql PDO OCI PDO Pgsql PDO Sqlite Zend Framework Database Quick Start 2007-10-09 Page 8

What s in the Zend_Db component? Database Adapters CRUD functions Quoting SQL values and identifiers Query profiler Query builder Table and Row OO patterns Basic database operations insert() update() delete() query() fetchall() etc. Zend Framework Database Quick Start 2007-10-09 Page 9

What s in the Zend_Db component? Database Adapters CRUD functions Quoting SQL values and identifiers Query profiler Query builder Table and Row OO patterns Encourages safer interpolation of values into SQL strings Both values and SQL identifiers are supported Not the same thing as SQL parameters but those are supported too Both quoting and SQL parameters help you to defend against SQL injection issues Zend Framework Database Quick Start 2007-10-09 Page 10

What s in the Zend_Db component? Database Adapters CRUD functions Quoting SQL values and identifiers Query profiler Query builder Table and Row OO patterns Measures duration of SQL queries Filters by SQL statement type or by minimum duration Reports recorded SQL statements and bound parameter values Zend Framework Database Quick Start 2007-10-09 Page 11

What s in the Zend_Db component? Database Adapters CRUD functions Quoting SQL values and identifiers Query profiler Query builder Table and Row OO patterns Procedural interface to create SELECT queries Convenient when you need to build SQL with application logic Helps you to produce valid SQL SELECT syntax Zend Framework Database Quick Start 2007-10-09 Page 12

What s in the Zend_Db component? Database Adapters CRUD functions Quoting SQL values and identifiers Query profiler Query builder Table and Row OO patterns Similar to ActiveRecord pattern in other frameworks Flexible and extensible base classes for Tables, Rowsets, and Rows Emphasis on supporting existing database schema; no restrictive conventions Often used in Model classes in MVC apps Zend Framework Database Quick Start 2007-10-09 Page 13

Database Adapters Zend Framework Database Quick Start 2007-10-09 Page 14

Connecting to a database Use the static factory() method of Zend_Db: require_once Zend/Db.php ; $db = Zend_Db::factory( Mysqli, array( host ); => localhost, dbname => test, username => webappuser, password => xxxxxxxx ) Returns an object of Zend_Db_Adapter_Mysqli, which extends Zend_Db_Adapter_Abstract Zend Framework Database Quick Start 2007-10-09 Page 15

Using a configuration file Write a configuration file, e.g. myconfig.ini: [staging] database.adapter database.params.host database.params.dbname database.params.username database.params.password = mysqli = localhost = test = webappuser = xxxxxxxx Use Zend_Config to read config file: $config = new Zend_Config_Ini('myconfig.ini', 'staging'); Pass config object instead of plain values $db = Zend_Db::factory($config->database); Zend Framework Database Quick Start 2007-10-09 Page 16

Running an SQL query & fetching results Tthe fetchall() method returns an array of rows. $data = $db->fetchall( SELECT * FROM bugs ); Each row is an associative array: foreach ($data as $row) { echo $row[ bug_description ]; } You can fetch rows one-by-one in a loop You can fetch rows as other structures Zend Framework Database Quick Start 2007-10-09 Page 17

Preparing an SQL query Use the prepare() or query() methods to create a Zend_Db_Statement object: $stmt = $db->prepare( SELECT * FROM bugs WHERE bug_status =? ); Execute once, giving a parameter value: $stmt->execute(array( OPEN )); $openbugs = $stmt->fetchall(); Execute a second time, giving another value: $stmt->execute(array( CLOSED )); $closedbugs = $stmt->fetchall(); Zend Framework Database Quick Start 2007-10-09 Page 18

Inserting data Use the insert() method. Pass the table name, and an associative array mapping columns to values: $db->insert( bugs, array( bug_description => help me, bug_status => NEW ) ); Get an auto primary key value (if applicable): $bugid = $db->lastinsertid(); Zend Framework Database Quick Start 2007-10-09 Page 19

Updating data Use the update() method. Pass the table name, an associative array mapping columns to new values, and an expression for the WHERE clause: $n = $db->update( bugs, array( bug_status => NEW ), bug_id = 123 ); Returns the number of rows affected. Zend Framework Database Quick Start 2007-10-09 Page 20

Deleting data Use the delete() method. Pass the table name, and an expression for the WHERE clause: $n = $db->delete( bugs, bug_id = 321 ); Returns the number of rows affected. Zend Framework Database Quick Start 2007-10-09 Page 21

Retrieving table metadata Use the describetable() method: $bugsmetadata = $db->describetable( bugs ); Returns an array indexed by column name: array( bug_id => array( ), bug_description => array( ), bug_status => array( ), created_on => array( ), updated_on => array( ), reported_by => array( ), assigned_to => array( ), verified_by => array( ), ) Zend Framework Database Quick Start 2007-10-09 Page 22

Retrieving table metadata Each value is an associative array of metadata for the respective column: bug_id => array( TABLE_NAME => bugs COLUMN_NAME => bug_id COLUMN_POSITION => 1 DATA_TYPE => INTEGER DEFAULT => null NULLABLE => false LENGTH => null SCALE => null PRECISION => null UNSIGNED => null PRIMARY => true PRIMARY_POSITION => 1 IDENTITY => true ), entries for other columns follow Zend Framework Database Quick Start 2007-10-09 Page 23

Quoting SQL Zend Framework Database Quick Start 2007-10-09 Page 24

Quoting SQL Important when interpolating strings and PHP variables into SQL Not the same thing as query parameters Interpolated values add to a SQL query before prepare-time Query parameters supply values to a prepared query at execute-time Zend Framework Database Quick Start 2007-10-09 Page 25

Quoting SQL values Use the quote() method to turn a string or variable into a quoted SQL string: $expr = $db->quote( O Reilly ); $stmt = $db->query( SELECT * FROM bugs WHERE bug_reporter = $expr ); Note: unlike mysql_real_escape_string(), the quote() method returns a string with quotes. mysql_real_escape_string( O Reilly ) returns: $db->quote( O Reilly ) returns: O\ Reilly O\ Reilly Zend Framework Database Quick Start 2007-10-09 Page 26

Quoting SQL values in expressions Use the quoteinto() method to substitute a scalar into a SQL expression: $whereexpr = $db->quoteinto( bug_reporter =?, O Reilly ); $stmt = $db->query( SELECT * FROM bugs WHERE $whereexpr ); Results in the following query: SELECT * FROM bugs WHERE bug_reporter = O\ Reilly Zend Framework Database Quick Start 2007-10-09 Page 27

Quoting SQL identifiers Identifiers are table names, column names, etc. Use the quoteidentifier() method : $table = $db->quoteidentifier( My Table ); $stmt = $db->query( SELECT * FROM $table WHERE ); Results in the following query: SELECT * FROM My Table WHERE Helps if your identifiers contain whitespace, special characters, SQL keywords, or is casesensitive. Zend Framework Database Quick Start 2007-10-09 Page 28

Query Profiler Zend Framework Database Quick Start 2007-10-09 Page 29

Profiling SQL queries Measures time to execute SQL queries Useful during development/debugging The Adapter has a Zend_Db_Profiler object, which is disabled by default $db->getprofiler()->setenabled(true); While the profiler is enabled, SQL queries are recorded, with the time it takes them to run. Zend Framework Database Quick Start 2007-10-09 Page 30

Profiling SQL queries: find longest query $prof = $db->getprofiler(); $prof->setenabled(true); // run one or more queries with profiler enabled $db->query( ); $db->insert( ); $db->update( ); $max = 0; foreach ($prof->getqueryprofiles() as $q) { if ($q->getelapsedsecs() > $max) { $max = $q->getelapsedsecs(); $longestquery = $q->getquery(); } } echo The longest query ran $max seconds\n ; echo SQL = $longestquery\n ; Zend Framework Database Quick Start 2007-10-09 Page 31

Profiling SQL queries: filtering Filtering queries to be recorded // By minimum duration: $prof->setfilterelapsedsecs(5); // By query type: $prof->setfilterquerytype(zend_db_profiler::select Zend_Db_Profiler::UPDATE); Filtering queries to be reported $prof->getqueryprofiles(zend_db_profiler::select); Zend Framework Database Quick Start 2007-10-09 Page 32

Query Builder Zend Framework Database Quick Start 2007-10-09 Page 33

Building a SELECT query Use the select() method of the Adapter to get an object of Zend_Db_Select: $select = $db->select(); $select->from( bugs ); $select->where( bug_status =?, NEW ); Execute the query using the Zend_Db_Select object instead of a SQL string: $data = $db->fetchall($select); Zend Framework Database Quick Start 2007-10-09 Page 34

Building a SELECT query The fluent usage can be convenient: $select = $db->select()->from( bugs ) ->where( bug_status =?, NEW ); You can mix fluent and traditional usage. You can add SQL clauses in any order. $select = $db->select()->from( bugs )->order( bug_id ); if ($condition == true) { $select->joinnatural( other_table ); } Zend Framework Database Quick Start 2007-10-09 Page 35

Building a SELECT query: other clauses Additional functions: DISTINCT modifier Specify columns Table correlation names Specify SQL expressions Column aliases Joins to other tables GROUP BY clause HAVING clause ORDER BY clause LIMIT clause $select = $db->select() ->distinct() ->from(array( a => accounts ), array( account_name, num_bugs => COUNT(*) )) ->joinleft(array( b => bugs ), b.reported_by = a.account_name ) ->group( a.account_name ) ->having( num_bugs < 5 ) ->order( a.account_name ASC ) ->limit(10, 20); Zend Framework Database Quick Start 2007-10-09 Page 36

Table and Row Object-Oriented Patterns Zend Framework Database Quick Start 2007-10-09 Page 37

Table Data Gateway Like the ActiveRecord pattern, this provides a simple OO interface for a database table. Table Data Gateway and Row Data Gateway patterns are based on Martin Fowler s Patterns of Enterprise Architecture. Base classes for Table, Row, and Rowset are extensible, to allow you to define business logic. You may use Table objects in your MVC Model classes, or as your MVC Models. Zend Framework Database Quick Start 2007-10-09 Page 38

Table Data Gateway: define a table Start by defining a class for each table: class Bugs extends Zend_Db_Table_Abstract { protected $_name = bugs ; } Default code is inherited from the base Zend_Db_Table_Abstract class. You don t need to define $_name if the class name matches the name of the table in the database. Zend Framework Database Quick Start 2007-10-09 Page 39

Table Data Gateway: instantiate a table Option #1: pass the database Adapter object to the Table constructor: $bugstable = new Bugs( $db ); Option #2: set a default Adapter for all Tables: Zend_Db_Table_Abstract::setDefaultAdapter($db); $bugstable = new Bugs(); Option #3: save the Adapter object in Zend_Registry and reference it later by key: Zend_Registry::set( mydb, $db); $bugstable = new Bugs( mydb ); Zend Framework Database Quick Start 2007-10-09 Page 40

Table Data Gateway: query a table Use the fetchall() method to get a Rowset with all rows matching a condition you specify: $rowset = $bugstable->fetchall( bug_status = OPEN ); A Rowset object is iterable and countable. A Rowset is a collection of Row objects. A Row has an accessor for each column. foreach ($rowset as $row) { echo $row->bug_id: $row->bug_description\n ; } Zend Framework Database Quick Start 2007-10-09 Page 41

Table Data Gateway: find by key Use the find() method with a primary key value or an array of values: $bugstable = new Bugs(); $rowset1 = $bugstable->find(123); $rowset2 = $bugstable->find( array(123, 321) ); $rowset1 contains 0 or 1 Row, $rowset2 contains up to 2 Rows Tip: use the current() method to get the first row in a rowset: $row = $rowset1->current(); Zend Framework Database Quick Start 2007-10-09 Page 42

Table Data Gateway: UPDATE Get the Row you want to update: $bugstable = new Bugs(); $rowset = $bugstable->find(123); $row = $rowset->current(); Set a column value using the accessor: $row->bug_description = New description ; Use the save() method of the Row object to post the change to the database: $row->save(); Zend Framework Database Quick Start 2007-10-09 Page 43

Table Data Gateway: INSERT Use the createrow() method of the Table object to get a blank Row: $bugstable = new Bugs(); $newrow = $bugstable->createrow(); Set Row fields: $newrow->bug_description = help me ; $newrow->bug_status = NEW ; Use the save() method of new Row object to post it to the database: $newrow->save(); Zend Framework Database Quick Start 2007-10-09 Page 44

Table Data Gateway: DELETE Get a Row you want to delete: $bugstable = new Bugs(); $row = $bugstable->find(123)->current(); Use the delete() method of the Row object: $row->delete(); Zend Framework Database Quick Start 2007-10-09 Page 45

Table Data Gateway: relationships Assume an Entity-Relationship like this: bugs reported by accounts Get a Row from the Accounts table: $accountstable = new Accounts(); $account = $accountstable->find( bill )->current(); Find a Rowset in related table Bugs: $reportedbugs = $account->findbugs(); Zend Framework Database Quick Start 2007-10-09 Page 46

Table Data Gateway: relationships You also can get the parent row. Start with the dependent row in Bugs: $bugstable = new Bugs(); $bug = $bugstable->find(123)->current(); Find the parent Row in related table Accounts: $reporter = $bug->findparentaccounts(); Zend Framework Database Quick Start 2007-10-09 Page 47

Table Data Gateway: relationships Declare table relationships in the table class: class Accounts extends Zend_Db_Table_Abstract { protected $_name = accounts ; } class Bugs extends Zend_Db_Table_Abstract { protected $_name = bugs ; } protected $_referencemap = array( Reporter => array( columns => array( reported_by ), reftableclass => Accounts )); } Zend Framework Database Quick Start 2007-10-09 Page 48

Table Data Gateway: customization You can add custom logic to a Table class: class Bugs extends Zend_Db_Table_Abstract { protected $_name = bugs ; } public function insert(array $data) { if (empty($data['created_on'])) { $data['created_on'] = time(); } return parent::insert($data); } Zend Framework Database Quick Start 2007-10-09 Page 49

Using Zend_Db in MVC Applications Zend Framework Database Quick Start 2007-10-09 Page 50

Using Zend_Db in MVC Applications Each Model class in the MVC architecture encapsulates data and operations on data for a logical domain within your application. You can use either Zend_Db_Table objects or direct SQL queries to implement persistence for Model data. Common to define Models using an is-a relationship to Zend_Db_Table, but it can be more flexible to use a has-a relationship instead. Zend Framework Database Quick Start 2007-10-09 Page 51

Using Zend_Db in MVC Applications Simple Models can extend directly from Zend_Db_Table_Abstract: class Countries extends Zend_Db_Table_Abstract { protected $_name = countries ; } Good if this Model corresponds one-to-one with a single physical database table. Zend Framework Database Quick Start 2007-10-09 Page 52

Using Zend_Db in MVC Applications More complex Models use multiple Tables, or else Db Adapter methods to execute SQL. class QuarterlyReport // extends no base class { protected $_salestable; protected $_productstable; protected $_dbadapter; // for direct SQL queries public function getreport($quarter) { } } Good if you want this Model s interface to be decoupled from the physical database structure. Zend Framework Database Quick Start 2007-10-09 Page 53

Recap of Zend_Db Adapters to PHP database extensions Quoting SQL identifiers and values Query profiler SELECT query builder Table Data Gateway & Row Data Gateway Zend Framework Database Quick Start 2007-10-09 Page 54

Thanks http://framework.zend.com/ Copyright 2007, Zend Technologies Inc.