on 7 June 2008
Overview: Learning PHP Data Objects, by Dennis Popel, is an introduction to PDO, which walks through the building of a believable test example - a library manager for your home library. Each chapter introduces a new facet of PDO and shows how to rewrite the appropriate parts of the application to slot the new ideas in. Very clear and easy to read. Non-PDO subjects are appropriately kept to the appendices.
I really couldn't find very much about this book that I didn't like. Ignoring the appendices, the book is 154 pages purely devoted to teaching PDO through examples, including error handling, working with BLOBs, even the creation of the M in MVC (Models).
I mentioned MVC there. One of my gripes with most tutorials of MVC is that they introduce the concept simply, then provide pages and pages of code with the end product which is "hello world". Why I should go to all that trouble instead of simply writing to the screen usually escapes me. Dennis, however, concentrates solely on the Model and shows exactly why it's a great idea. I think some more separation of concerns would have been better (don't mix Author and Book SQL in the same object, for example), but the ideas were all good.
I think that if Dennis was going to show how the Model works, he should also have gone a little further and showed an example of an Active Record pattern as well. But I guess the point of showing MVC was more to show /an/ example of abstraction of the DB code, and that was sufficient.
The book covers a Library manager application all the way through from conception to implementation, demonstrating at all points that the code works with SQLite and MySQL (and by implication, all other DBMS's) with a change of only the connection string.
Possible problems are explained clearly and solutions are provided. For example, Dennis explains why, after you compile the query select * from books, PDO (and indeed the database itself) does not know how many rows it will return. A solution, in the form of a very smart getRowCount() function shows a query-agnostic method for counting results of an arbitrary line of SQL.
Other areas that are covered in the book include error-handling, prepared statements and transaction-handling.
PDO can handle Prepared Statements even if the underlying DBMS cannot handle it, so it is possible to write your code in a cross-platform way. Examples of why you should use this are provided. One of the examples shows an efficient way to handle insertion or updating of a table using the same parameters for both cases, with the row-handling function deciding whether to use update or insert based on whether an ID was provided.
I feel the Transactions section could have been expanded a bit further. It is not explained how PDO handles this for DBMS's that don't internally support transactions, and I wouldn't like to assume that they work all the time, only to find after deleting critical data that it's not supported.
Overall, I enjoyed reading this book. Dennis is a good writer and I think he explained his thoughts very clearly.
On an aside, my four-year-old son Jareth loves Packt Publishing's books. Sometimes when I go to read another chapter, I need to covertly steal the book I'm reading back from him. For a while, he made it a bed-time ritual to grab all the Packt books he could find around and bring them up with him to read in bed. I think he loved the screen-shots and the frequent code samples. He's high-functioning autistic and likes literary constructs, and programming books are perfect for him in that regard. Thanks Packt, you've made my son (and therefore me) happy.
on 20 October 2007
This book works well for the intermediate PHP programmer who has researched application structure, and is beginning to focus on improving the database layer by standardising on PDO.
Commendably it keeps a tight focus, providing the minimum context in which to show PDO features: in this case a basic library program with simple PHP methods providing HTML. However in a later chapter it provides a useful example that shows the advantage of the model, updating previous code accordingly. It also saves time by assuming you have your environment set up correctly.
Design patterns vary, I believe the idea is that the reader should research MVC separation and other patterns, decide how to use them, then incorporate the PDO features from the book; it doesn't enforce a particular methodology you may not want to use. Conversely this is a disadvantage to less experienced PHP programmers, as they won't be served by the least-common-denominator code examples, which don't enforce separation of HTML and PHP.
I would recommend the book on the subjects of security and database correctness. Using prepared statements the book provides you with a robust way to avoid SQL injection. When something goes wrong, it explains how to handle the error correctly with exceptions, without exposing potentially harmful information. Even beginners should familiarise themselves with these new features. For mission-critical database operations, it elaborates on transactions, which weren't a feature of the PHP 4 extensions, and are either handled natively or emulated with PDO. Again it doesn't let focus drift into validation, which isn't provided by PDO, so only cursory hard-coded examples are given.
If you prefer the task-oriented approach to learning, you'll like this book. It provides code and screen-shots to guide you through each step. If you're an advanced PHP programmer, there are a few things you may find interesting, such as the lesser known PDO configuration options, and BLOB support, but really I find this book aimed more at the intermediate procedural programmer. Indicative of this is the succinct "Introduction to OOP in PHP 5" appendix. If you supplement this with other application design literature and integrate the PDO techniques in the book, you'll certainly be another step towards making your systems more flexible and maintainable.