maggsweb / maggsweb-pdo
PDO Database Wrapper for PHP
Requires
- php: ^8.2
- ext-mysqli: *
- ext-pdo: *
Requires (Dev)
- phpunit/phpunit: ^9.6
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-10-13 11:01:17 UTC
README
Maggsweb PDO
An easy-to-use PDO Database wrapper for PHP & MySQL
Table of Contents
Initialization
Query
Run a script
Insert Records
Update Records
Delete Records
Initialization
To use this class, set your database connection constants, download and include 'MyPDO.php' into your project and instantiate a database connection.
define('DBHOST', ''); //eg: 127.0.0.1 define('DBUSER', ''); //eg: root define('DBNAME', ''); //eg: admin define('DBPASS', ''); //eg: password require_once ('MyPDO.php'); $db = new MyPDO(DBHOST, DBUSER, DBPASS, DBNAME);
The connection uses SET NAMES utf8mb4 by default. To change this, or any other PDO option, pass an array of overrides as the fifth argument:
$db = new MyPDO(DBHOST, DBUSER, DBPASS, DBNAME, [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES latin1', ]);
One shared connection
Each new MyPDO(...) opens its own connection. To use one connection for the whole request, call MyPDO::initialise once at startup, then MyPDO::connection wherever a handle is needed:
MyPDO::initialise(DBHOST, DBUSER, DBPASS, DBNAME); // once, e.g. in bootstrap.php $db = MyPDO::connection(); // anywhere after that
MyPDO::connection() opens nothing itself. It returns the instance initialise() built, and throws a RuntimeException if initialise() hasn't run. Calling initialise() again returns the existing instance. In tests, MyPDO::setConnection($double) replaces the instance and MyPDO::setConnection(null) clears it.
One thing to know: the prepared statement is kept on the instance, so a shared instance means a shared statement. Always chain query()->bind()->fetch() as one expression (or as adjacent lines). If you split them so other code can run a query in between, the first caller silently gets the wrong rows. If a query has to stay open across other work, give it its own new MyPDO(...).
Query
Run a query, any query..
To execute a string of SQL, pass the complete SQL string to ->query
$sql = "INSERT INTO `names` VALUES (NULL, 'Joe', 'Bloggs'), (NULL, 'John', 'Bloggs'), (NULL, 'Jane', 'Bloggs');"; $db->query($sql); $result = $db->execute();
Call ->execute to execute the query. This returns true|false;
Run a query and return the results
To return the results from ->query for use call ->fetchAll() for multiple rows, ->fetchRow for a single row or ->fetchOne for a single value. Results are returned as an Array of Objects an Object or a value. Optionally, passing 'Array' to the fetch functions will return results as a Multi-dimensional Array.
$sql = "SELECT * FROM `names`"; $db->query($sql); $results = $db->fetchAll(); // Multiple rows //$result = $db->fetchRow(); // Single row //$result = $db->fetchRow('Array'); // Single row, returned as an array //$result = $db->fetchAll('Array'); // Multiple rows, returned as a multi-dimensional array //$result = $db->fetchOne(); // Single value
On success, $result will be an Object Array (fetchAll) or an Object (fetchRow) or a value (fetchOne)
On failure, call ->getError to display the SQL error message
Run a query using 'bound' params and return results
To bind parameters to a query, pass the column identifier and value to ->bind(). Repeat this for each bound parameter in order.
$sql = "SELECT * FROM `names` WHERE firstname = :firstname"; $db->query($sql); $db->bind(':firstname', 'Chris'); $results = $db->fetchAll(); or $results = $db->query($sql)->bind(':firstname', 'Chris')->fetchAll();
Query Results
On failure, call ->getError to display the SQL error message
if($results){ foreach($results as $result){ echo $result->{$column}; } } else { echo $db->getError(); }
Run a script of several statements
->query prepares its SQL, which only reliably runs the first statement of a multi-statement string. To run a whole file of statements (a migration or a seed file), pass it to ->runScript. It runs every statement and returns true|false. If any statement fails, it returns false and ->getError has the reason. Statements before the failing one will already have run. Nothing can be bound and no rows are returned. MySQL only.
$sql = file_get_contents('migrations/1.2.0.sql'); if (!$db->runScript($sql)) { echo $db->getError(); }
Insert Records
Insert a record using 'bind' params
$table = 'names'; $columns = array('firstname' => 'Fred', 'surname' => 'Bloggs'); $result = $db->insert($table,$columns);
Insert Results
if($result){ echo $db->numRows() . ' records affected'; } else { echo $db->getError(); }
Last Insert ID
$id = $db->insertID();
Update Records
Update (all) records using 'bind' params
$table = 'names'; $columns = array('firstname' => 'Fred', 'surname' => 'Bloggs'); $result = $db->update($table,$columns);
Update records using 'bind' params and 'where' string
$table = 'names'; $columns = array('firstname' => 'Fred 2', 'surname' => 'Bloggs 2'); $where = "firstname = 'Fred' AND surname = 'Bloggs'"; //'WHERE' is not needed, or spaces $result = $db->update($table,$columns,$where);
Update specific records using 'bind' params and 'where'
$table = 'names'; $columns = array('firstname' => 'Fred 2', 'surname' => 'Bloggs 2'); $where = array('firstname' => 'Fred', 'surname' => 'Bloggs'); $result = $db->update($table,$columns,$where);
Update Results
if($result){ echo $db->numRows() . ' records affected'; } else { echo $db->getError(); }
Delete Records
Delete records using a 'where' string
$table = 'names'; $where = "surname = 'Doe'"; $result = $db->delete($table,$where);
Delete records using a 'where' array
$table = 'names'; $where = array('surname' => 'Doe'); $result = $db->delete($table,$where);
Delete Results
if($result){ echo $db->numRows() . ' records affected'; } else { echo $db->getError(); }More examples are provided in 'examples.php'