Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Practical PHP 7, MySQL 8, and MariaDB Website Databases
Nội dung xem thử
Mô tả chi tiết
Practical PHP 7,
MySQL 8, and MariaDB
Website Databases
A Simplified Approach to Developing
Database-Driven Websites
—
Second Edition
—
Adrian W. West
Steve Prettyman
Practical PHP 7,
MySQL 8, and MariaDB
Website Databases
A Simplified Approach to Developing
Database-Driven Websites
Second Edition
Adrian W. West
Steve Prettyman
Practical PHP 7, MySQL 8, and MariaDB Website Databases: A Simplified Approach to Developing
Database-Driven Websites
Adrian W. West Steve Prettyman
Colyton, Devon, United Kingdom Key West, Florida, USA
ISBN-13 (pbk): 978-1-4842-3842-4 ISBN-13 (electronic): 978-1-4842-3843-1
https://doi.org/10.1007/978-1-4842-3843-1
Library of Congress Control Number: 2018957652
Copyright © 2018 by Adrian W. West and Steve Prettyman
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.
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, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Steve Anglin
Development Editor: Matthew Moodie
Coordinating Editor: Mark Powers
Cover designed by eStudioCalamar
Cover image designed by Freepik (www.freepik.com)
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
[email protected], 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 [email protected]; for reprint, paperback, or audio
rights, please email [email protected].
Apress titles 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 Print and eBook Bulk Sales
web page at www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub via the book's product page, located at www.apress.com/9781484238424. For more
detailed information, please visit www.apress.com/source-code.
Printed on acid-free paper
iii
Contents
About the Authors�������������������������������������������������������������������������������������������������� xiii
Acknowledgments���������������������������������������������������������������������������������������������������xv
Introduction�����������������������������������������������������������������������������������������������������������xvii
■Chapter 1: Create and Test a Database and Table ������������������������������������������������� 1
Defining Developer, Administrator, and User �������������������������������������������������������������������� 2
Defining Interactive Websites ����������������������������������������������������������������������������������������������������������������� 2
Summary������������������������������������������������������������������������������������������������������������������������ 31
■Chapter 2: Create Web Pages That Interact with Users��������������������������������������� 33
Creating the Folder for Holding the Database Pages ����������������������������������������������������� 34
Creating the Temporary Template����������������������������������������������������������������������������������� 34
Introducing the PHP include() Function ������������������������������������������������������������������������� 36
The Included Header File���������������������������������������������������������������������������������������������������������������������� 37
The Included Menu File ������������������������������������������������������������������������������������������������������������������������ 39
The Included Information Column��������������������������������������������������������������������������������������������������������� 40
The Included Footer File ����������������������������������������������������������������������������������������������������������������������� 41
The Interactive Version of the Template ������������������������������������������������������������������������� 42
Connecting to the Database ������������������������������������������������������������������������������������������� 44
The Registration Page �������������������������������������������������������������������������������������������������������������������������� 47
The PHP Keyword echo �������������������������������������������������������������������������������������������������� 58
The “Thank You” Page���������������������������������������������������������������������������������������������������� 58
Displaying Error Messages That Are Collected in an Array��������������������������������������������� 60
■ Contents
iv
Hashing the Password���������������������������������������������������������������������������������������������������� 61
Viewing Members’ Records�������������������������������������������������������������������������������������������� 61
The View Users Page������������������������������������������������������������������������������������������������������ 61
The Change Password Page������������������������������������������������������������������������������������������� 65
Confirming a Successful Password Change������������������������������������������������������������������� 72
Testing the Tutorial’s Pages ������������������������������������������������������������������������������������������������������������������ 72
More About Arrays���������������������������������������������������������������������������������������������������������� 73
Summary������������������������������������������������������������������������������������������������������������������������ 74
■Chapter 3: Create Login/Logout Functionality for Members and
an Administrator ������������������������������������������������������������������������������������������������� 75
Creating the logindb Database and users Table������������������������������������������������������������� 76
Removing or Replacing Redundant Menu Buttons in the Headers��������������������������������� 77
Adding a Login Button to the Home Page Header �������������������������������������������������������������������������������� 78
Removing Redundant Buttons from the Registration and New Password Headers ����������������������������� 79
The Revised Registration Page������������������������������������������������������������������������������������������������������������� 79
The New Header for the New Password Page�������������������������������������������������������������������������������������� 80
A New Header Menu for the Members page ���������������������������������������������������������������������������������������� 82
Amend the Header for the “Thank You” Page��������������������������������������������������������������������������������������� 82
The Registration Page and Undesirable Characters������������������������������������������������������� 84
Registering Some Members ����������������������������������������������������������������������������������������������������������������� 87
Differentiating Between Two Types of Membership ������������������������������������������������������� 88
Creating User Levels to Limit Access to Private Pages �������������������������������������������������� 88
Log In������������������������������������������������������������������������������������������������������������������������������ 91
The Header for the Login Page ������������������������������������������������������������������������������������������������������������� 91
The Login Page������������������������������������������������������������������������������������������������������������������������������������� 92
Sessions ����������������������������������������������������������������������������������������������������������������������������������������������� 99
A Members-Only Page�������������������������������������������������������������������������������������������������� 101
Planning the Administrator’s Role �������������������������������������������������������������������������������� 104
A New Header for the Administration Page ���������������������������������������������������������������������������������������� 105
■ Contents
v
Testing the Login/Logout Function ������������������������������������������������������������������������������� 109
Amending and Deleting Individual Records���������������������������������������������������������������������������������������� 109
Summary���������������������������������������������������������������������������������������������������������������������� 110
■Chapter 4: Create an Administration Interface�������������������������������������������������� 111
The Administration Database ��������������������������������������������������������������������������������������� 111
The Users Table ���������������������������������������������������������������������������������������������������������������������������������� 113
Revising the View Users Page to Include Editing and Deleting ������������������������������������ 115
Displaying Pages of Records (Pagination)�������������������������������������������������������������������� 121
Planning the Search Criteria ���������������������������������������������������������������������������������������� 128
A Temporary Search Page for Displaying Specified Members ������������������������������������� 128
The Search Form���������������������������������������������������������������������������������������������������������� 132
The Final Form Handler for Receiving Search Form Input ������������������������������������������� 135
Editing Records ������������������������������������������������������������������������������������������������������������ 139
Deleting Records �������������������������������������������������������������������������������������������������������������������������������� 145
Summary���������������������������������������������������������������������������������������������������������������������� 150
■Chapter 5: Expand and Enrich Your Website ����������������������������������������������������� 151
Creating a New Database, a Table with 15 Columns, and a Price Table����������������������� 151
Creating the File for Connecting to the Database������������������������������������������������������������������������������� 152
Creating the Tables ����������������������������������������������������������������������������������������������������������������������������� 153
Using ENUM���������������������������������������������������������������������������������������������������������������������������������������� 154
The Importance of Documentation������������������������������������������������������������������������������� 154
Extending the Registration Form and Adding a Pull-Down Menu��������������������������������� 156
Always Announce Prices and Fee Payments Up-Front����������������������������������������������������������������������� 157
Adding PayPal Debit/Credit Card Images ��������������������������������������������������������������������� 168
Including PayPal on the “Thank You” Page ������������������������������������������������������������������ 168
Registering Some Members����������������������������������������������������������������������������������������� 173
A Small Amendment to the Login Page ���������������������������������������������������������������������������������������������� 175
Amending the Administrator’s Header ������������������������������������������������������������������������� 175
Adding Class and Paid to the admin_view_users Table����������������������������������������������� 177
■ Contents
vi
Searching and Editing Records ������������������������������������������������������������������������������������ 181
Modifying the Form for Editing Records��������������������������������������������������������������������������������������������� 184
Summary���������������������������������������������������������������������������������������������������������������������� 190
■Chapter 6: Add the Finishing Touches: Security and Validation ������������������������ 191
Creating the Database�������������������������������������������������������������������������������������������������� 191
Creating the File for Connecting to the Database������������������������������������������������������������������������������� 192
Creating the users Table by Importing a SQL Dump File ���������������������������������������������� 193
Registering Some Members Manually������������������������������������������������������������������������������������������������ 195
Adding a Title Column to the users Table ��������������������������������������������������������������������� 197
Creating the Prices Table by Importing a SQL Dump File ������������������������������������������������������������������� 199
Tidying Up the Folders and Filing System�������������������������������������������������������������������� 200
Degrees of Security������������������������������������������������������������������������������������������������������ 200
Adding a Layer of Security������������������������������������������������������������������������������������������������������������������ 200
An Increased Layer of Protection�������������������������������������������������������������������������������������������������������� 202
Validation and Sanitization������������������������������������������������������������������������������������������� 202
The filter_var() Function ��������������������������������������������������������������������������������������������������������������������� 202
Validation�������������������������������������������������������������������������������������������������������������������������������������������� 202
Sanitization����������������������������������������������������������������������������������������������������������������������������������������� 204
Validating Telephone Numbers ����������������������������������������������������������������������������������������������������������� 205
A Safer Registration Page �������������������������������������������������������������������������������������������� 205
Searching for a Title, an Address, or a Telephone Number������������������������������������������� 221
Viewing the Retrieved Title, Address, and Phone Number������������������������������������������������������������������ 225
Editing the Title, Addresses, and Telephone Numbers ������������������������������������������������������������������������ 228
Summary���������������������������������������������������������������������������������������������������������������������� 236
■Chapter 7: Migrate to a Host and Back Up Your Website Database������������������� 237
Making Last-Minute Changes �������������������������������������������������������������������������������������� 237
Creating a New Database ������������������������������������������������������������������������������������������������������������������� 238
Allowing Members to Update Their Own Records ������������������������������������������������������������������������������ 240
A Secure Feedback Form ������������������������������������������������������������������������������������������������������������������� 254
■ Contents
vii
The Feedback Form���������������������������������������������������������������������������������������������������������������������������� 255
The “Thank You” Page and the Error Messages ��������������������������������������������������������������������������������� 266
A Common Header ������������������������������������������������������������������������������������������������������� 269
Logging Exceptions and Error �������������������������������������������������������������������������������������� 272
Migrating the Database and Tables to a Remote Host ������������������������������������������������� 274
A Puzzling Error Message������������������������������������������������������������������������������������������������������������������� 275
Creating and Exporting the SQL File��������������������������������������������������������������������������������������������������� 275
Using the GUIs on a Remote Host’s Server����������������������������������������������������������������������������������������� 281
Connecting to the Database on the Remote Host������������������������������������������������������������������������������� 282
Securely Uploading the mysqli_connection.php File�������������������������������������������������������������������������� 283
Uploading the Interactive Pages to the Host��������������������������������������������������������������������������������������� 285
Backing Up Your Database ������������������������������������������������������������������������������������������� 286
Summary���������������������������������������������������������������������������������������������������������������������� 286
■Chapter 8: Create a Product Catalog ����������������������������������������������������������������� 287
Preparing the Database and Administration Plan��������������������������������������������������������� 287
Creating a New Database��������������������������������������������������������������������������������������������� 288
Creating the File for Connecting to the Database��������������������������������������������������������� 289
Security ������������������������������������������������������������������������������������������������������������������������ 290
Creating a Home Page with Search Capability������������������������������������������������������������� 292
The Header for the Majority of the Pages������������������������������������������������������������������������������������������� 293
The Home Page Code ������������������������������������������������������������������������������������������������������������������������� 294
Displaying the Catalog�������������������������������������������������������������������������������������������������� 296
The Header for the Page of Search Results ����������������������������������������������������������������� 303
Creating the House Details Page���������������������������������������������������������������������������������� 304
Creating the Admin/Adding a House Page�������������������������������������������������������������������� 309
The Header for the Administrator’s Page ��������������������������������������������������������������������� 318
Administrator’s View of the Entire Stock of Houses for Sale���������������������������������������� 320
■ Contents
viii
The Administrator’s Search Page ��������������������������������������������������������������������������������� 325
The Result of a Search ����������������������������������������������������������������������������������������������������������������������� 327
The Contact Us Page ���������������������������������������������������������������������������������������������������� 328
Summary���������������������������������������������������������������������������������������������������������������������� 334
■Chapter 9: Join Multiple Tables and Other Enhancements�������������������������������� 335
Introduction to Multiple Tables ������������������������������������������������������������������������������������� 335
Normalization ������������������������������������������������������������������������������������������������������������������������������������� 336
Creating the Database and Tables ������������������������������������������������������������������������������������������������������ 337
Viewing the Connection File ��������������������������������������������������������������������������������������������������������������� 338
Preparing the Tables for Joining��������������������������������������������������������������������������������������������������������� 339
Populating the Two Tables ������������������������������������������������������������������������������������������������������������������ 340
Joining Data from the Two Tables �������������������������������������������������������������������������������� 342
Creating the Third Table���������������������������������������������������������������������������������������������������������������������� 345
Creating Pages to Display the Data from Your Joined Tables ������������������������������������������������������������� 347
The Home Page ���������������������������������������������������������������������������������������������������������������������������������� 347
The Main Menu for the Pages������������������������������������������������������������������������������������������������������������� 349
The Header for All the Pages �������������������������������������������������������������������������������������������������������������� 350
The Page for Viewing the Birds����������������������������������������������������������������������������������������������������������� 351
The Page for Viewing the Locations and Habitats of the Reserves ���������������������������������������������������� 355
Payments by Check������������������������������������������������������������������������������������������������������ 366
A Choice of Payment Method ������������������������������������������������������������������������������������������������������������� 367
Printing Online Forms��������������������������������������������������������������������������������������������������� 375
Summary���������������������������������������������������������������������������������������������������������������������� 376
■Chapter 10: Create a Message Board ���������������������������������������������������������������� 377
The Plan ����������������������������������������������������������������������������������������������������������������������� 377
Creating the Database�������������������������������������������������������������������������������������������������� 378
Creating the Tables������������������������������������������������������������������������������������������������������� 378
Creating the Second Table�������������������������������������������������������������������������������������������� 379
■ Contents
ix
Creating the Registration Form ������������������������������������������������������������������������������������ 385
The “Thank You” Page ������������������������������������������������������������������������������������������������������������������������ 393
Populating the Members Table������������������������������������������������������������������������������������� 394
The Login Page������������������������������������������������������������������������������������������������������������� 395
Logging Out������������������������������������������������������������������������������������������������������������������ 400
Creating a Gateway to a Choice of Quotes ������������������������������������������������������������������� 400
The Form for Posting Quotations���������������������������������������������������������������������������������� 402
Posting Some Quotations ��������������������������������������������������������������������������������������������� 408
The Comical Quotes Page��������������������������������������������������������������������������������������������� 409
The Wise Quotes Page ������������������������������������������������������������������������������������������������������������������������ 413
Adding Search Facilities����������������������������������������������������������������������������������������������� 417
The Header for ViewPosts.php ������������������������������������������������������������������������������������� 420
Searching for Specific Words or Phrases ��������������������������������������������������������������������� 421
The Full Text Search Form������������������������������������������������������������������������������������������������������������������ 422
Displaying the Search Results�������������������������������������������������������������������������������������� 424
The Header for the quotes_found Page���������������������������������������������������������������������������������������������� 427
Enhancing the Message Board������������������������������������������������������������������������������������� 428
Converting the Message Board to a Forum ���������������������������������������������������������������������������������������� 428
Summary���������������������������������������������������������������������������������������������������������������������� 429
■Chapter 11: E-commerce: A Brief Introduction ������������������������������������������������� 431
Security Warning ���������������������������������������������������������������������������������������������������������� 433
The Plan ����������������������������������������������������������������������������������������������������������������������� 433
Creating the PayPal Cart Site ��������������������������������������������������������������������������������������� 434
Creating the PayPal Cart Database and Tables����������������������������������������������������������������������������������� 434
Viewing the Connection File ��������������������������������������������������������������������������������������������������������������� 435
Populating the PayPal Cart Tables ������������������������������������������������������������������������������������������������������ 435
The PayPal Cart Home Page ��������������������������������������������������������������������������������������������������������������� 438
Using the PayPal Cart Home Page to Search for Paintings����������������������������������������������������������������� 441
Integrating with the PayPal Shopping Cart Buttons���������������������������������������������������������������������������� 444
■ Contents
x
Creating a Custom Cart ������������������������������������������������������������������������������������������������ 450
The Custom Cart Home Page�������������������������������������������������������������������������������������������������������������� 452
Create the Custom Cart Database and Tables ������������������������������������������������������������������������������������ 452
Retrieving a Forgotten Password ������������������������������������������������������������������������������������������������������� 460
The Custom Cart Search Page������������������������������������������������������������������������������������������������������������ 464
Adding Paintings to a Table for a Custom Shopping Cart ������������������������������������������������������������������� 465
The Checkout Page����������������������������������������������������������������������������������������������������������������������������� 477
The Additional Administrative Tasks ��������������������������������������������������������������������������������������������������� 477
Summary���������������������������������������������������������������������������������������������������������������������� 478
■Chapter 12: Take a Brief Look at Oracle MySQL 8 ��������������������������������������������� 479
Advantages of Upgrading ��������������������������������������������������������������������������������������������� 479
Installing MySQL 8 Community Server������������������������������������������������������������������������� 481
Exploring the Features of MySQL Workbench �������������������������������������������������������������� 488
Connecting PHP 7 to the MySQL 8 Community Server������������������������������������������������� 495
Migrating to MySQL 8 Community Server�������������������������������������������������������������������� 498
Using Our PHP Files with MySQL 8 Community Server������������������������������������������������ 502
Summary���������������������������������������������������������������������������������������������������������������������� 505
■Appendix A: Troubleshooting����������������������������������������������������������������������������� 507
Browser Quirks������������������������������������������������������������������������������������������������������������� 508
Tables Not Displaying��������������������������������������������������������������������������������������������������� 508
A Style Change Has No Effect �������������������������������������������������������������������������������������� 509
Included Items Missing from the Display ��������������������������������������������������������������������� 509
A Page Fails to Validate������������������������������������������������������������������������������������������������ 509
A PayPal Pull-Down Menu Does Not Work ������������������������������������������������������������������� 509
Access Denied�������������������������������������������������������������������������������������������������������������� 509
PHP Error Levels����������������������������������������������������������������������������������������������������������� 510
Call to an Undefined Function �������������������������������������������������������������������������������������� 510
Cannot Redeclare Function ������������������������������������������������������������������������������������������ 510
■ Contents
xi
Undefined Index or Undefined Variable ������������������������������������������������������������������������ 510
Empty Variable Value���������������������������������������������������������������������������������������������������� 511
Headers Already Sent��������������������������������������������������������������������������������������������������� 511
Blank Screen ���������������������������������������������������������������������������������������������������������������� 511
Unexpected End of File in Line xxx������������������������������������������������������������������������������� 511
Parse Error and Unexpected Characters ���������������������������������������������������������������������� 512
Unexpected T_STRING�������������������������������������������������������������������������������������������������� 512
Unexpected T_ELSE������������������������������������������������������������������������������������������������������ 513
Wrong Equal Sign��������������������������������������������������������������������������������������������������������� 513
Failed to Open Stream�������������������������������������������������������������������������������������������������� 513
Syntax Errors���������������������������������������������������������������������������������������������������������������� 513
Warning: Division by Zero��������������������������������������������������������������������������������������������� 514
Display Is Not What Was Expected ������������������������������������������������������������������������������� 514
Reference to a Primary Key Could Not Be Created������������������������������������������������������� 514
Element <style> Not Allowed as Child of Element <div>�������������������������������������������� 514
Problem with Prepared Statement������������������������������������������������������������������������������� 514
Logical Errors ��������������������������������������������������������������������������������������������������������������� 515
The Internet Is Your Friend ������������������������������������������������������������������������������������������� 515
Summary���������������������������������������������������������������������������������������������������������������������� 515
■Appendix B: Resources�������������������������������������������������������������������������������������� 517
PHP Quick Reference ��������������������������������������������������������������������������������������������������� 517
Arrays ������������������������������������������������������������������������������������������������������������������������������������������������� 517
Bootstrap Template ������������������������������������������������������������������������������������������������������ 533
MySQL and phpMyAdmin Quick Reference������������������������������������������������������������������ 534
date_time ������������������������������������������������������������������������������������������������������������������������������������������� 535
INSERT������������������������������������������������������������������������������������������������������������������������������������������������ 536
SELECT ����������������������������������������������������������������������������������������������������������������������������������������������� 536
UPDATE����������������������������������������������������������������������������������������������������������������������������������������������� 536
■ Contents
xii
What Next?������������������������������������������������������������������������������������������������������������������� 537
Resources��������������������������������������������������������������������������������������������������������������������� 537
Books on PHP and MySQL for Databases ������������������������������������������������������������������������������������������� 537
PHP and MySQL Internet Resources��������������������������������������������������������������������������������������������������� 538
E-commerce Resources ��������������������������������������������������������������������������������������������������������������������� 538
Summary���������������������������������������������������������������������������������������������������������������������� 539
Index��������������������������������������������������������������������������������������������������������������������� 541
xiii
About the Authors
Adrian W. West resigned as a chartered design engineer to become the UK director of a correspondence
school. He has been teaching in one form or another since 1982. He introduced computers into his
workplace in 1987 and taught the staff how to use them. For four years, he taught undergraduates computer
skills at a college in Cheshire in the United Kingdom.
Adrian lives in Colyton, a town in Devon, England, and for the last 18 years, he has designed and
produced websites for UK businesses and charities.
Adrian is the author of three books published by Apress: Practical HTML5 Projects, a book of tips and
tricks (now rather out of date); Practical PHP and MySQL Website Databases (the first edition of this book);
and Practical Web Design for Absolute Beginners (published in 2016).
Steve Prettyman earned his Bachelor of Arts degree in secondary education from Oglethorpe University
in 1979. He quickly began his teaching career as a high school mathematics instructor while continuing
his education by earning a master’s degree in business information systems from Georgia State University
(1985). Since then, Steve has spent more than 30 years in the IT industry. The last almost 20 of those he
has been an instructor and professor at Chattahoochee Technical College, Kennesaw State University, and
Southern Polytechnic State University. He is currently the Computer Science Department chairperson
for Florida Keys Community College in Key West, Florida. His primary teaching responsibilities include
programming, web design, and web application development.
xv
Acknowledgments
I thank my wife, Janice, for her love, support, and encouragement, and for taking over my share of the chores
so that I could concentrate on this edition.
My thanks go to the team at Apress and to all the people in Internet forums who helped me and replied
to my queries.
My special thanks go to my co-author, Steve Prettyman, who converted the first edition code and
instructions to the latest versions of PHP 7 and MySQL/MariaDB for this second edition.
—Adrian W. West
I thank my partner and wife for her love and support for almost 25 years. Her reminders that I needed to
get my head out of the book and take a break to enjoy life were vital in this process. My children also stared
at me when I ignored them for too long to let me know that I should stop writing and coding to take them
outside to swim in the pool. Can we say that Pixee and Buster, our four-legged children, are a little spoiled?
I especially want to thank Adrian W. West and Apress for allowing me to update his successful
first edition to provide a modern-day approach to his logical pattern to teaching interactive database
programming using PHP.
—Steve Prettyman