© PHP Solutions
On a PHP–enabled web server, the code between the tags is automatically processed and displays the year like this: This is only a trivial example, but it illustrates some of the advantages of using PHP: • Anyone accessing your site after the stroke of midnight on New Year’s Day sees the correct year • The date is calculated by the web server so it’s not affected if the clock in the user’s computer is set incorrectly Although it’s convenient to embed PHP code in HTML like this, it’s repetitive and can lead to mistakes It can also make your webpages difficult to maintain, particularly once you start using more complex PHP code Consequently, it’s common practice to store a lot of dynamic code in separate files and then use PHP to build your pages from the different components The separate files—or include files, as they’re usually called—can contain only PHP, only HTML, or a mixture of both www.it-ebooks.info Chapter ■ What Is PHP—And Why Should I Care? As a simple example, you can put your website’s navigation menu in an include file and use PHP to include it in each page Whenever you need to make any changes to the menu, you edit just one file, the include file, and the changes are automatically reflected in every page that includes the menu Just imagine how much time that saves on a website with dozens of pages! With an ordinary HTML page, the content is fixed by the web developer at design time and uploaded to the web server When somebody visits the page, the web server simply sends the HTML and other assets, such as images and the style sheet It’s a simple transaction—the request comes from the browser, and the fixed content is sent back by the server When you build webpages with PHP, much more goes on Figure 1-1 shows what happens Figure 1-1. The web server builds each PHP page dynamically in response to a request When a PHP–driven website is visited, it sets in motion the following sequence of events: The browser sends a request to the web server The web server hands the request to the PHP engine, which is embedded in the server The PHP engine processes the code In many cases, it might also query a database before building the page The server sends the completed page back to the browser This process usually takes only a fraction of a second, so the visitor to a PHP website is unlikely to notice any delay Because each page is built individually, PHP sites can respond to user input, displaying different content when a user logs in or showing the results of a database search Creating Pages That Think for Themselves PHP is a server-side language The PHP code remains on the web server After it has been processed, the server sends only the output of the script Normally, this is HTML, but PHP can also be used to generate other web languages, such as JSON (JavaScript Object Notation) PHP enables you to introduce logic into your webpages that is based on alternatives Some decisions are made using information that PHP gleans from the server: the date, the time, the day of the week, information in the page’s URL, and so on If it’s Wednesday, it will show Wednesday’s TV schedules At other times, decisions are based on user input, which PHP extracts from online forms If you have registered with a site, it will display personalized information—that sort of thing www.it-ebooks.info Chapter ■ What Is PHP—And Why Should I Care? How Hard Is PHP to Use and Learn? PHP isn’t rocket science, but don’t expect to become an expert in five minutes Perhaps the biggest shock to newcomers is that PHP is far less tolerant of mistakes than browsers are with HTML If you omit a closing tag in HTML, most browsers will still render the page If you omit a closing quote, semicolon, or brace in PHP, you’ll get an uncompromising error message like the one shown in Figure 1-2 This affects all programming languages, such as JavaScript and C#, not just PHP Figure 1-2. Server-side languages like PHP are intolerant of most coding errors If you’re the sort of web designer or developer who uses a visual design tool like Adobe Dreamweaver and never looks at the underlying code, it’s time to rethink your approach Mixing PHP with poorly structured HTML is likely to lead to problems PHP uses loops to perform repetitive tasks, such as displaying the results of a database search A loop repeats the same section of code—usually a mixture of PHP and HTML—until all results have been displayed If you put the loop in the wrong place or if your HTML is badly structured, your page is likely to collapse like a house of cards If you’re not already in the habit of doing so, it’s a good idea to check your pages using the World Wide Web Consortium’s (W3C) Markup Validation Service (http://validator.w3.org/unicorn) ■■Note The W3C is the international body that develops standardssuch as HTML and CSS to ensure the long-term growth of the web It’s led by the inventor of the World Wide Web, Tim Berners-Lee To learn about the W3C’s mission, see www.w3.org/Consortium/mission www.it-ebooks.info PHP Solutions Dynamic Web Design Made Easy Third Edition David Powers www.it-ebooks.info PHP Solutions: Dynamic Web Design Made Easy, Third Edition Copyright © 2014 by David Powers This work is subject to copyright All rights are reserved by the Publisher, whether the whole or part of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now known or hereafter developed Exempted from this legal reservation are brief excerpts in connection with reviews or scholarly analysis or material supplied specifically for the purpose of being entered and executed on a computer system, for exclusive use by the purchaser of the work Duplication of this publication or parts thereof is permitted only under the provisions of the Copyright Law of the Publisher’s location, in its current version, and permission for use must always be obtained from Springer Permissions for use may be obtained through RightsLink at the Copyright Clearance Center Violations are liable to prosecution under the respective Copyright Law ISBN-13 (pbk): 978-1-4842-0636-2 ISBN-13 (electronic): 978-1-4842-0635-5 Trademarked names, logos, and images may appear in this book Rather than use a trademark symbol with every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to proprietary rights While the advice and information in this book are believed to be true and accurate at the date of publication, neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or omissions that may be made The publisher makes no warranty, express or implied, with respect to the material contained herein Managing Director: Welmoed Spahr Lead Editor: Ben Renow-Clarke Technical Reviewer: Paul Milbourne Editorial Board: Steve Anglin, Mark Beckner, Ewan Buckingham, Gary Cornell, Louise Corrigan, Jim DeWolf, Jonathan Gennick, Robert Hutchinson, Michelle Lowman, James Markham, Matthew Moodie, Jeff Olson, Jeffrey Pepper, Douglas Pundick, Ben Renow-Clarke, Dominic Shakeshaft, Gwenan Spearing, Matt Wade, Steve Weiss Coordinating Editor: Christine Ricketts Copy Editor: April Rondeau Compositor: SPi Global Indexer: SPi Global Artist: SPi Global Cover Designer: Anna Ishchenko Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street, 6th Floor, New York, NY 10013 Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer-sbm.com, or visit www.springeronline.com Apress Media, LLC is a California LLC and the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc) SSBM Finance Inc is a Delaware corporation For information on translations, please e-mail rights@apress.com, or visit www.apress.com Apress and friends of ED books may be purchased in bulk for academic, corporate, or promotional use eBook versions and licenses are also available for most titles For more information, reference our Special Bulk Sales–eBook Licensing web page at www.apress.com/bulk-sales Any source code or other supplementary material referenced by the author in this text is available to readers at www.apress.com For detailed information about how to locate your book’s source code, go to www.apress.com/source-code www.it-ebooks.info Contents About the Author���������������������������������������������������������������������������������������������������������������� xv About the Technical Reviewer������������������������������������������������������������������������������������������ xvii Acknowledgments������������������������������������������������������������������������������������������������������������� xix Introduction����������������������������������������������������������������������������������������������������������������������� xxi ■■Chapter 1: What Is PHP—And Why Should I Care?�����������������������������������������������������������1 How PHP Has Grown���������������������������������������������������������������������������������������������������������������������1 How PHP Makes Pages Dynamic��������������������������������������������������������������������������������������������������2 Creating Pages That Think for Themselves������������������������������������������������������������������������������������������������������������ How Hard Is PHP to Use and Learn?���������������������������������������������������������������������������������������������4 Can I Just Copy and Paste the Code?�������������������������������������������������������������������������������������������������������������������� How Safe Is PHP?�������������������������������������������������������������������������������������������������������������������������������������������������� What Software Do I Need to Write PHP?���������������������������������������������������������������������������������������5 What to Look for When Choosing a PHP Editor������������������������������������������������������������������������������������������������������ So, Let’s Get on with It ������������������������������������������������������������������������������������������������������������6 ■■Chapter 2: Getting Ready to Work with PHP ���������������������������������������������������������������������7 Checking Whether Your Website Supports PHP�����������������������������������������������������������������������������7 Deciding Where to Test Your Pages����������������������������������������������������������������������������������������������������������������������� What You Need for a Local Test Environment��������������������������������������������������������������������������������9 Individual Programs or an All-in-one Package?���������������������������������������������������������������������������������������������������� Setting Up on Windows���������������������������������������������������������������������������������������������������������������10 Getting Windows to Display Filename Extensions����������������������������������������������������������������������������������������������� 10 Choosing a Web Server���������������������������������������������������������������������������������������������������������������������������������������� 10 Installing an All-in-one Package on Windows����������������������������������������������������������������������������������������������������� 10 v www.it-ebooks.info ■ Contents Setting Up on Mac OS X��������������������������������������������������������������������������������������������������������������11 Installing MAMP��������������������������������������������������������������������������������������������������������������������������������������������������� 11 Testing and configuring MAMP���������������������������������������������������������������������������������������������������������������������������� 11 Where to Locate Your PHP Files (Windows & Mac)����������������������������������������������������������������������13 Using Virtual Hosts���������������������������������������������������������������������������������������������������������������������������������������������� 14 Checking Your PHP Settings��������������������������������������������������������������������������������������������������������14 Displaying the Server Configuration with phpinfo()��������������������������������������������������������������������������������������������� 14 Editing php.ini������������������������������������������������������������������������������������������������������������������������������������������������������ 16 What’s Next?�������������������������������������������������������������������������������������������������������������������������������18 ■■Chapter 3: How to Write PHP Scripts�������������������������������������������������������������������������������19 PHP: The Big Picture��������������������������������������������������������������������������������������������������������������������19 Telling the Server to Process PHP����������������������������������������������������������������������������������������������������������������������� 20 Embedding PHP in a Webpage����������������������������������������������������������������������������������������������������������������������������� 20 Storing PHP in an External File���������������������������������������������������������������������������������������������������������������������������� 21 Using Variables to Represent Changing Values��������������������������������������������������������������������������������������������������� 21 Ending Commands With a Semicolon������������������������������������������������������������������������������������������������������������������ 24 Commenting Scripts�������������������������������������������������������������������������������������������������������������������������������������������� 24 Using Arrays to Store Multiple Values������������������������������������������������������������������������������������������������������������������ 25 PHP’s Built-in Superglobal Arrays������������������������������������������������������������������������������������������������������������������������ 26 Understanding When to Use Quotes�������������������������������������������������������������������������������������������������������������������� 27 Making Decisions������������������������������������������������������������������������������������������������������������������������������������������������ 29 Making Comparisons������������������������������������������������������������������������������������������������������������������������������������������� 31 Using Indenting and Whitespace for Clarity��������������������������������������������������������������������������������������������������������� 32 Using Loops for Repetitive Tasks������������������������������������������������������������������������������������������������������������������������� 32 Using Functions for Preset Tasks������������������������������������������������������������������������������������������������������������������������� 32 Understanding PHP Classes and Objects������������������������������������������������������������������������������������������������������������� 33 Displaying PHP Output����������������������������������������������������������������������������������������������������������������������������������������� 34 Understanding PHP Error Messages�������������������������������������������������������������������������������������������������������������������� 36 PHP: A Quick Reference���������������������������������������������������������������������������������������������������������������38 Using PHP in an Existing Website������������������������������������������������������������������������������������������������������������������������ 38 Data Types in PHP������������������������������������������������������������������������������������������������������������������������������������������������ 39 vi www.it-ebooks.info ■ Contents Doing Calculations with PHP������������������������������������������������������������������������������������������������������������������������������� 40 Adding to an existing string��������������������������������������������������������������������������������������������������������������������������������� 42 All You Ever Wanted to Know About Quotes—and More�������������������������������������������������������������������������������������� 42 Creating Arrays���������������������������������������������������������������������������������������������������������������������������������������������������� 46 The Truth According to PHP��������������������������������������������������������������������������������������������������������������������������������� 50 Creating Loops����������������������������������������������������������������������������������������������������������������������������������������������������� 54 Modularizing Code with Functions���������������������������������������������������������������������������������������������������������������������� 57 Creating New Variables Dynamically������������������������������������������������������������������������������������������������������������������� 61 PHP Quick Checklist��������������������������������������������������������������������������������������������������������������������62 ■■Chapter 4: Lightening Your Workload with Includes�������������������������������������������������������63 Including Code from External Files���������������������������������������������������������������������������������������������64 Introducing the PHP Include Commands������������������������������������������������������������������������������������������������������������� 64 Where PHP Looks for Include Files���������������������������������������������������������������������������������������������������������������������� 65 Choosing the Right Filename Extension for Includes������������������������������������������������������������������������������������������ 68 Creating Pages with Changing Content��������������������������������������������������������������������������������������������������������������� 77 Preventing Errors with Include Files�������������������������������������������������������������������������������������������������������������������� 85 Suppressing Error Messages on a Live Website�������������������������������������������������������������������������������������������������� 86 Choosing where to Locate your Include Files������������������������������������������������������������������������������������������������������ 91 Adjusting your include_path�������������������������������������������������������������������������������������������������������������������������������� 91 Why can’t I Use Site-root-relative Links with PHP Includes?������������������������������������������������������������������������������ 93 Security Considerations with Includes���������������������������������������������������������������������������������������������������������������� 95 Chapter Review���������������������������������������������������������������������������������������������������������������������������95 ■■Chapter 5: Bringing Forms to Life�����������������������������������������������������������������������������������97 How PHP Gathers Information from a Form��������������������������������������������������������������������������������97 Understanding the Difference Between Post and get������������������������������������������������������������������������������������������ 99 Getting form Data with PHP Superglobals��������������������������������������������������������������������������������������������������������� 102 Processing and Validating User Input����������������������������������������������������������������������������������������102 Creating a Reusable Script�������������������������������������������������������������������������������������������������������������������������������� 102 Preserving User Input when a Form is Incomplete�������������������������������������������������������������������������������������������� 108 Filtering Out Potential Attacks��������������������������������������������������������������������������������������������������������������������������� 110 vii www.it-ebooks.info ■ Contents Sending Email���������������������������������������������������������������������������������������������������������������������������113 Using Additional Email Headers Safely�������������������������������������������������������������������������������������������������������������� 114 Handling Multiple-Choice Form Elements���������������������������������������������������������������������������������122 Chapter Review�������������������������������������������������������������������������������������������������������������������������131 ■■Chapter 6: Uploading Files��������������������������������������������������������������������������������������������133 How PHP Handles File Uploads�������������������������������������������������������������������������������������������������133 Checking whether your server supports uploads���������������������������������������������������������������������������������������������� 134 Adding a file upload field to a form������������������������������������������������������������������������������������������������������������������� 135 Understanding the $_FILES array���������������������������������������������������������������������������������������������������������������������� 135 Establishing an upload directory����������������������������������������������������������������������������������������������������������������������� 138 Uploading Files��������������������������������������������������������������������������������������������������������������������������139 Moving the temporary file to the upload folder������������������������������������������������������������������������������������������������� 139 Creating a PHP File Upload Class����������������������������������������������������������������������������������������������143 Defining a PHP class������������������������������������������������������������������������������������������������������������������������������������������ 143 Checking upload errors������������������������������������������������������������������������������������������������������������������������������������� 150 Changing protected properties�������������������������������������������������������������������������������������������������������������������������� 154 Explicitly changing a data type�������������������������������������������������������������������������������������������������������������������������� 158 Neutralizing potentially dangerous files������������������������������������������������������������������������������������������������������������ 159 Preventing files from being overwritten������������������������������������������������������������������������������������������������������������ 163 Uploading Multiple Files������������������������������������������������������������������������������������������������������������166 How the $_FILES array handles multiple files��������������������������������������������������������������������������������������������������� 166 Using the Upload Class��������������������������������������������������������������������������������������������������������������170 Points to Watch with File Uploads���������������������������������������������������������������������������������������������171 Chapter Review�������������������������������������������������������������������������������������������������������������������������171 ■■Chapter 7: Using PHP to Manage Files��������������������������������������������������������������������������173 Checking that PHP Can Open a File�������������������������������������������������������������������������������������������173 Configuration Settings that Affect File Access��������������������������������������������������������������������������������������������������� 174 Creating a File Storage Folder for Local Testing������������������������������������������������������������������������������������������������ 174 viii www.it-ebooks.info ■ Contents Reading and Writing Files���������������������������������������������������������������������������������������������������������174 Reading Files in a Single Operation������������������������������������������������������������������������������������������������������������������� 175 Opening and Closing Files for Read/Write Operations��������������������������������������������������������������������������������������� 179 Exploring the File System����������������������������������������������������������������������������������������������������������188 Inspecting a Folder with Scandir( )�������������������������������������������������������������������������������������������������������������������� 188 Inspecting the Contents of a Folder with FilesystemIterator����������������������������������������������������������������������������� 188 Restricting File Types with the RegexIterator���������������������������������������������������������������������������������������������������� 191 Accessing Remote Files������������������������������������������������������������������������������������������������������������196 Consuming News and Other RSS Feeds������������������������������������������������������������������������������������������������������������ 196 Using SimpleXML����������������������������������������������������������������������������������������������������������������������������������������������� 197 Creating a Download Link���������������������������������������������������������������������������������������������������������203 PHP Solution 7-6: Prompting a User to Download an Image����������������������������������������������������������������������������� 203 Chapter Review�������������������������������������������������������������������������������������������������������������������������205 ■■Chapter 8: Generating Thumbnail Images���������������������������������������������������������������������207 Checking Your Server’s Capabilities������������������������������������������������������������������������������������������207 Manipulating Images Dynamically��������������������������������������������������������������������������������������������208 Making a Smaller Copy of an Image������������������������������������������������������������������������������������������������������������������ 209 Resizing an Image Automatically on Upload�����������������������������������������������������������������������������226 Extending a Class���������������������������������������������������������������������������������������������������������������������������������������������� 226 Using the ThumbnailUpload Class��������������������������������������������������������������������������������������������������������������������� 233 Chapter Review�������������������������������������������������������������������������������������������������������������������������233 ■■Chapter 9: Pages That Remember: Simple Login and Multipage Forms �����������������������235 What Sessions Are and How They Work������������������������������������������������������������������������������������235 Creating PHP Sessions�������������������������������������������������������������������������������������������������������������������������������������� 238 Creating and Destroying Session Variables������������������������������������������������������������������������������������������������������� 238 Destroying a Session����������������������������������������������������������������������������������������������������������������������������������������� 239 Regenerating the Session ID����������������������������������������������������������������������������������������������������������������������������� 239 The “Headers Already Sent” Error��������������������������������������������������������������������������������������������������������������������� 239 ix www.it-ebooks.info ■ Contents Using Sessions to Restrict Access��������������������������������������������������������������������������������������������240 PHP Solution 9-1: A Simple Session Example��������������������������������������������������������������������������������������������������� 240 Using File-based Authentication������������������������������������������������������������������������������������������������������������������������ 244 Making Passwords More Secure����������������������������������������������������������������������������������������������������������������������� 251 PHP Solution 9-6: Creating a Password-strength Checker ������������������������������������������������������������������������������� 252 Setting a Time Limit on Sessions����������������������������������������������������������������������������������������������264 PHP Solution 9-9: Ending a Session after a Period of Inactivity������������������������������������������������������������������������ 265 Passing Information Through Multipage Forms������������������������������������������������������������������������267 Chapter Review�������������������������������������������������������������������������������������������������������������������������272 ■■Chapter 10: Getting Started with a Database����������������������������������������������������������������273 Which Database Should You Choose?���������������������������������������������������������������������������������������273 Compatibility of MariaDB and MySQL���������������������������������������������������������������������������������������������������������������� 274 How a Database Stores Information������������������������������������������������������������������������������������������274 How primary keys work������������������������������������������������������������������������������������������������������������������������������������� 275 Linking tables with primary and foreign keys��������������������������������������������������������������������������������������������������� 276 Breaking down information into small chunks�������������������������������������������������������������������������������������������������� 277 Checkpoints for good database design������������������������������������������������������������������������������������������������������������� 278 Using a Graphical Interface�������������������������������������������������������������������������������������������������������278 Launching phpMyAdmin������������������������������������������������������������������������������������������������������������������������������������ 280 Setting Up the phpsols Database����������������������������������������������������������������������������������������������280 MySQL naming rules����������������������������������������������������������������������������������������������������������������������������������������� 280 Using phpMyAdmin to create a new database�������������������������������������������������������������������������������������������������� 281 Creating database-specific user accounts�������������������������������������������������������������������������������������������������������� 282 Creating a database table���������������������������������������������������������������������������������������������������������������������������������� 285 Inserting records into a table����������������������������������������������������������������������������������������������������������������������������� 287 Creating an SQL file for backup and data transfer�������������������������������������������������������������������������������������������� 291 Choosing the Right Data Type in MySQL�����������������������������������������������������������������������������������295 Storing text�������������������������������������������������������������������������������������������������������������������������������������������������������� 295 Storing numbers������������������������������������������������������������������������������������������������������������������������������������������������ 295 x www.it-ebooks.info ■ Contents Storing dates and times������������������������������������������������������������������������������������������������������������������������������������ 296 Storing predefined lists������������������������������������������������������������������������������������������������������������������������������������� 296 Storing binary data�������������������������������������������������������������������������������������������������������������������������������������������� 297 Chapter Review�������������������������������������������������������������������������������������������������������������������������297 ■■Chapter 11: Connecting to a Database with PHP and SQL���������������������������������������������299 Checking Your Remote Server Setup�����������������������������������������������������������������������������������������299 How PHP Communicates with a Database��������������������������������������������������������������������������������301 Connecting with the MySQL Improved extension���������������������������������������������������������������������������������������������� 302 Connecting with PDO����������������������������������������������������������������������������������������������������������������������������������������� 302 PHP Solution 11-1: Making a reusable database connector������������������������������������������������������������������������������ 303 Querying the database and displaying the results�������������������������������������������������������������������������������������������� 306 Using SQL to Interact with a Database��������������������������������������������������������������������������������������313 Writing SQL queries������������������������������������������������������������������������������������������������������������������������������������������� 313 Refining the data retrieved by a SELECT query������������������������������������������������������������������������������������������������� 314 Understanding the Danger of SQL Injection������������������������������������������������������������������������������318 Using Prepared Statements for User Input��������������������������������������������������������������������������������324 Embedding variables in MySQLi prepared statements�������������������������������������������������������������������������������������� 325 Embedding variables in PDO prepared statements������������������������������������������������������������������������������������������� 329 Chapter Review�������������������������������������������������������������������������������������������������������������������������335 ■■Chapter 12: Creating a Dynamic Photo Gallery�������������������������������������������������������������337 Why Not Store Images in a Database?��������������������������������������������������������������������������������������338 Planning the Gallery������������������������������������������������������������������������������������������������������������������338 Converting the Gallery Elements to PHP�����������������������������������������������������������������������������������340 Building the Dynamic Elements������������������������������������������������������������������������������������������������343 Passing Information Through a Query String����������������������������������������������������������������������������������������������������� 343 Creating a Multicolumn table���������������������������������������������������������������������������������������������������������������������������� 347 Paging Through a Long set of Records�������������������������������������������������������������������������������������������������������������� 349 Chapter Review�������������������������������������������������������������������������������������������������������������������������356 xi www.it-ebooks.info ■ Contents ■■Chapter 13: Managing Content��������������������������������������������������������������������������������������357 Setting Up a Content Management System������������������������������������������������������������������������������357 Creating the Blog Database Table���������������������������������������������������������������������������������������������������������������������� 358 Creating the Basic Insert and Update Form������������������������������������������������������������������������������������������������������� 359 Inserting New Records�������������������������������������������������������������������������������������������������������������������������������������� 360 Linking to the Update and Delete Pages������������������������������������������������������������������������������������������������������������ 365 Updating Records���������������������������������������������������������������������������������������������������������������������������������������������� 368 Deleting Records����������������������������������������������������������������������������������������������������������������������������������������������� 376 Reviewing the Four Essential SQL Commands��������������������������������������������������������������������������378 SELECT�������������������������������������������������������������������������������������������������������������������������������������������������������������� 378 INSERT��������������������������������������������������������������������������������������������������������������������������������������������������������������� 380 UPDATE�������������������������������������������������������������������������������������������������������������������������������������������������������������� 380 DELETE�������������������������������������������������������������������������������������������������������������������������������������������������������������� 381 Security and Error Messages����������������������������������������������������������������������������������������������������381 Chapter Review�������������������������������������������������������������������������������������������������������������������������381 ■■Chapter 14: Formatting Text and Dates�������������������������������������������������������������������������383 Displaying a Text Extract�����������������������������������������������������������������������������������������������������������383 Extracting a Fixed Number of Characters���������������������������������������������������������������������������������������������������������� 383 Ending an Extract on a Complete Word������������������������������������������������������������������������������������������������������������� 385 Extracting the First Paragraph��������������������������������������������������������������������������������������������������������������������������� 385 Displaying Paragraphs��������������������������������������������������������������������������������������������������������������������������������������� 386 Extracting Complete Sentences������������������������������������������������������������������������������������������������������������������������� 387 Let’s Make a Date����������������������������������������������������������������������������������������������������������������������390 How MySQL Handles Dates������������������������������������������������������������������������������������������������������������������������������� 390 Inserting Dates into MySQL������������������������������������������������������������������������������������������������������������������������������� 394 Working with Dates in PHP�������������������������������������������������������������������������������������������������������������������������������� 400 Chapter Review�������������������������������������������������������������������������������������������������������������������������415 xii www.it-ebooks.info ■ Contents ■■Chapter 15: Pulling Data from Multiple Tables��������������������������������������������������������������417 Understanding Table Relationships�������������������������������������������������������������������������������������������417 Linking an Image to an Article���������������������������������������������������������������������������������������������������419 Altering the Structure of an Existing Table�������������������������������������������������������������������������������������������������������� 419 Inserting a Foreign Key in a Table���������������������������������������������������������������������������������������������������������������������� 421 Selecting Records from Multiple Tables������������������������������������������������������������������������������������������������������������ 427 Finding Records that don’t have a Matching Foreign Key��������������������������������������������������������������������������������� 432 Creating an Intelligent Link�������������������������������������������������������������������������������������������������������������������������������� 433 Chapter Review�������������������������������������������������������������������������������������������������������������������������434 ■■Chapter 16: Managing Multiple Database Tables����������������������������������������������������������435 Maintaining Referential Integrity�����������������������������������������������������������������������������������������������435 Support for foreign-key constraints������������������������������������������������������������������������������������������������������������������ 436 Inserting records into multiple tables���������������������������������������������������������������������������������������������������������������� 439 Creating a cross-reference table����������������������������������������������������������������������������������������������������������������������� 441 Getting the filename of an uploaded image������������������������������������������������������������������������������������������������������ 442 Adapting the insert form to deal with multiple tables��������������������������������������������������������������������������������������� 443 Updating and Deleting Records in Multiple Tables��������������������������������������������������������������������454 Updating records in a cross-reference table����������������������������������������������������������������������������������������������������� 454 Preserving referential integrity on deletion������������������������������������������������������������������������������������������������������� 457 Creating delete scripts with foreign-key constraints���������������������������������������������������������������������������������������� 461 Creating delete scripts without foreign-key constraints����������������������������������������������������������������������������������� 462 Chapter Review�������������������������������������������������������������������������������������������������������������������������463 ■■Chapter 17: Authenticating Users with a Database�������������������������������������������������������465 Choosing an Encryption Method�����������������������������������������������������������������������������������������������465 Using One-Way Encryption��������������������������������������������������������������������������������������������������������466 Creating a Table to Store Users’ Details������������������������������������������������������������������������������������������������������������ 466 Registering New Usersin the Database������������������������������������������������������������������������������������������������������������� 466 xiii www.it-ebooks.info ■ Contents Using Two-Way Encryption��������������������������������������������������������������������������������������������������������473 Creating the table to store users’ details���������������������������������������������������������������������������������������������������������� 474 Registering new users��������������������������������������������������������������������������������������������������������������������������������������� 474 User authentication with two-way encryption��������������������������������������������������������������������������������������������������� 475 Decrypting a password�������������������������������������������������������������������������������������������������������������������������������������� 477 Updating User Details����������������������������������������������������������������������������������������������������������������477 Where Next?������������������������������������������������������������������������������������������������������������������������������477 Index���������������������������������������������������������������������������������������������������������������������������������479 xiv www.it-ebooks.info About the Author David Powers is the author of a series of highly successful books and video training courses on web development, with a particular emphasis on PHP and web standards, including Introducing PHP and PHP Code Clinic in the lynda com Online Training Library As a professional writer, he has been involved in electronic media for more than 40 years, first with BBC radio and television and more recently with the Internet His clear writing style is valued not only in the English-speaking world, as several of his books have been translated into Spanish, Polish, Chinese, and other languages What started as a mild interest in computing was transformed almost overnight into a passion, when David was posted to Japan in 1987 as BBC correspondent in Tokyo With no corporate IT department just down the hallway, he was forced to learn how to fix everything himself When not tinkering with the innards of his computer, he was reporting for BBC television and radio on the rise and collapse of the Japanese bubble economy Since leaving the BBC to work independently, he has worked on many projects, including the development of an online bilingual database of economic and political analysis for Japanese clients of an international consultancy He also teaches a postgraduate Web Media course at Oxford Brookes University When not pounding the keyboard writing books or dreaming of new ways of using PHP and other programming languages, David enjoys nothing better than visiting his favorite sushi restaurant He has translated several plays from Japanese xv www.it-ebooks.info About the Technical Reviewer Paul Milbourne has been a software developer in the Washington–Baltimore metropolitan area for over decade His journey has allowed him to work with such clients as the Washington Redskins, Baltimore Ravens, Zynga Games, and many others For the most part, Paul has made a handsome career putting out fires and dealing with edge cases This experience has exposed him to most aspects of development through a multitude of industries and platforms Paul is also a former chef, an avid musician, and a practicing fine artist xvii www.it-ebooks.info Acknowledgments The original idea to write PHP Solutions came from Chris Mills, my editor for many years at Apress/friends of ED, who’s now a Senior Technical Writer at Mozilla Corporation and a passionate advocate of web standards Chris wanted to move away from the cookbook formula of isolated solutions that left the reader with little or no idea about the practical use of a particular technique The fact that this book is now in its third edition proves what a great idea it was Thanks, Chris Chris’s successor as editor of the second and third editions, Ben Renow-Clarke, followed his example by giving me free rein to shape the book according to my own ideas, but always putting himself in the position of the reader, nudging me in the right direction when an explanation wasn’t clear enough or a chapter was badly organized I’m also grateful to my technical reviewers: Samuel Wright for the first edition, Kristian Besley and Jason Nadon for the second edition, and Paul Milbourne for this edition Each edition has built on the previous one, so ideas and suggestions made by reviewers of previous editions live on in this one Producing a book like this would be impossible without the diligent help of everyone in the production chain at Apress My thanks go to them all Most of all, my thanks go to the readers who have made this book such a success Welcome to the club I hope you enjoy this book and find it useful in building dynamic websites with PHP xix www.it-ebooks.info ... blank page: < ?php echo phpversion(); ?> Save the file as phpversion .php It’s important to make sure that your operating system doesn’t add a txt filename extension after the php Mac users... http://foundationphp.com/tutorials/apache_vhosts .php • MAMP: http://foundationphp.com/tutorials/vhosts_mamp .php ■■Tip Remember to start the web server in your testing environment to view PHP pages... a script editor: < ?php phpinfo(); ?> 14 www.it-ebooks.info Chapter ■ Getting Ready to Work with PHP There should be nothing else in the file Save the file as phpinfo .php in the server’s