====== Request for Comments: PDO version 1 improvements ====== * Version: pre alpha 0.1 * Date: 2008-03-06 * Author: Lukas Smith * Status: Draft (Inactive) This RFC aims to collect a set of ideas to improve PDO version 1. These ideas will hopefully end up in a set of concret feature requests and patches. ===== Introduction ===== PDO is a thin layer above native RDBMS interfaces. As such its focused on providing a unified API on the PHP level without getting too much into SQL abstraction. PDO provides a framework to make the development of RDBMS specific drivers for PDO easier. ==== Why do we need improvements to PDO? ==== PDO has become the de-facto standard for the development of PHP libraries that interact with RDBMS. As such developers have come to expect that PDO minimizes any portability differences to a minimum, while accepting that PDO will not solve most issues in the differences of the actual SQL syntax. ===== Common Misconceptions ===== A lot in PDO can be fixed without a new major version. ===== Proposal and Patch ===== * Convenience features * Add a common syntax to specify the DSN along the lines of the PEAR DSN format * Add ability to generate a properly quoted comma separated list to be embedded in a query inside an IN() clause (see [[http://pear.php.net/package/MDB2/docs/latest/MDB2/MDB2_Driver_Datatype_Common.html#methodimplodeArray|implodeArray()]]) * Higher level emulation features * Fix differences in behavior for data fetches (possibly add a compatibility mode in order to maintain BC) * Add ability to manage connection session aspects like charset/collation, locale (datetime/currency format) * Add limited sub select emulation (see [[http://pear.php.net/package/MDB2/docs/latest/MDB2/MDB2_Driver_Common.html#methodsubSelect|subSelect()]]) * A class for administrative functionality which can come in handy for projects like phpMyAdmin. (possibly partially in userland) * Nested transaction emulation via SAVEPOINTs * Emulate scrollable cursors via buffered result sets * Prepared statements * Fix differences in when bind/prepare issues an exception for an invalid bound value/parameter. * Add ability to bind short binary values * Improve the prepared statement emulation parser to better deal with quoted strings that contain things that look like a placeholder * Make it possible to disable parsing and rewriting of placeholders and require the use of the given native syntax (:name, $name, ? etc.) * Fix the problems with ODBC prepared statements when executing procedures on all platforms. * Add support for PDO::PARAM_CLOB and generally work harder on making the LOB behavior more similar across the drivers (see [[http://pecl.php.net/bugs/bug.php?id=7943|Bug 7943]]) * Add support for datatypes like float and datetime/timestamp * Do not force the use of prepared statements internally for simple queries without any parameters * Optionally only use native prepared statement for SQL injection protection, but leverage the ability of some RDBMS to pass the [http://pooteeweet.org/blog/1233 statement and the values in a single call] * Improve documentation * Add support of multiple resultsets for mssql and odbc on all platforms. * Add ability to retrieve the parameters set in the constructor (like DSN etc.) * Add ability to determine the state of the connection/transactions (as well as the ability to reconnect) * Make sure PDO classes implement interfaces so that frameworks can use it as a generic data access interface and implement native driver versions of it if needed (esp. PDOStatement). * OCI8 has some persistent connection tuning parameters like timeout, max_connections, ... Make that generic and consistent in PDO. * Improved Quoting * Consider having an attribute that sets quoting style + maybe even allow for a callback for quoting. * Making quoting function aware of encoding in PDO (add quoting for identifier & value) * Improved error handling and debugging * Add some better debugging hooks (like a [[bugid@44319|way to get the last submitted statement]], this is important especially when PDO does some rewriting like with prepared statements) * For consistency it would be good to clear errors on every call and provide facility to expose multiple notices/errors that have occurred within a transaction * Throw an exception if a fetch method is call on a statement that has not been executed at least once * Expand support for SQLSTATE error codes to ensure that all drivers return more or less compatible error codes * Full blown Metadata APIs ala JDBC (important for higher-level DB layers). (possibly partially in userland) * Test suite which DB driver authors can use for compliance testing. ==== Rejected Features ==== * Add support for "IN (?)" type prepared placeholders. <= native prepared statement mandate that all placeholders only handle a single scalar value ==== More about PDO ==== * http://php.net/pdo (userland manual) * http://php.net/internals2.pdo (internals manual) * http://wiki.php.net/rfc/pdonotices (rfc about database notices which can be handled by PDO) ==== References ==== * http://pooteeweet.org/blog/1048 ===== Changelog =====