ceus-media/database

PHP database access

0.6.2 2023-12-17 04:09 UTC

This package is auto-updated.

Last update: 2024-04-20 02:27:32 UTC


README

Branch Release PHP version PHPStan level

PHP database access

Installation

Composer

Install this library using composer:

composer require ceus-media/Database

Within your code, load library:

require_once 'vendor/autoload.php';

Code Examples using PDO

Database Connection

$dbDriver	= 'mysql';
$dbName		= 'myDatabase';
$dbUsername	= 'myDatabaseUser';
$dbPassword	= 'myDatabasePassword';

$dbc	= new \CeusMedia\Database\PDO\Connection(
	new \CeusMedia\Database\PDO\DataSourceName( $dbDriver, $dbName ),
	$dbUsername, $dbPassword
);

Tables

Existing database tables can be declared as tables:

Table class

class MyFirstTable extends \CeusMedia\Database\PDO\Table
{
	protected string $name			= "my_first_table";
	protected array $columns		= [
		'id',
		'maybeSomeForeignId',
		'content',
	];
	protected string $primaryKey	= 'id';
	protected array $indices		= [
		'maybeSomeForeignId',
	];
	protected int $fetchMode		= \PDO::FETCH_OBJ;
}

Table instance

Having this defined structure, you can use a table instance for reading from and writing into the database table. Hence that you need to create a database connection beforehand.

$table	= new MyFirstTable( $dbc );

Reading an entry

Example for getting an entry by its primary key:

$entry	= $table->get( 1 );

The result will be an object of table columns and their values, since the fetch mode is set to object-wise by table structure:

object stdObject(
	'id'					=> 1,
	'maybeSomeForeignId'	=> 123,
	'content'				=> 'Content of first entry.'
)

Not having the fetch mode set would result in an associated array, which is set as default fetch mode in underlaying table reader. To change the fetch see below.

Hint: There are more methods to retrive a single entry:

  • getByIndex
  • getByIndices

which allow to focus on foreign indices instead of the primary key.

Finding entries

A group of entries, filtered by a foreign key:

$someEntries	= $table->getAllByIndex( 'maybeSomeForeignId', 123 );

A group of entries, filtered by several foreign keys:

$indices		= [
	'maybeSomeForeignId'	=> 123,
	'notExistingKey'		=> 'will result in an exception',
];
$someEntries	= $table->getAllByIndices( $indices );

To get all entries, call:

$allEntries	= $table->getAll();

which may be bad in scaling, so reduce the result set by defining limits and conditions:

$conditions	= ['content' => '%test%'];
$orders		= [];
$limits		= [$offset = 0, $limit = 10];

$allEntries	= $table->getAll( $conditions, $orders, $limits );

Conditions can be indices or any other column.

Orders are pairs of columns and directions, like:

$orders	= [
	'maybeSomeForeignId'	=> 'DESC',
	'content'		=> 'ASC',
];

There are more parameters possible for each of this indexing methods, which allow:

  • fields: restricting columns in result set
  • grouping: apply GROUP BY
  • having: apply HAVING

Counting

To count entries by a foreign key:

$number	= $table->countByIndex( 'maybeSomeForeignId', 123 );

To count entries, filtered by several foreign keys:

$number	= $table->countByIndices( [
	'maybeSomeForeignId'	=> 123,
	'notExistingKey'		=> 'will result in an exception',
] );

To get all entries, call:

$number	= $table->count();

which may be bad in scaling, so reduce the result set by defining conditions:

$Conditions	= [
	'maybeSomeForeignId'	=> 123,
	'content'		=> '%test%',
];
$number	= $table->count( $conditions );

Hint: Counting having really large MySQL tables may be slow. There is a method to count in large tables in a faster way. You will find it.

Adding an entry

$data		= [
	'maybeSomeForeignId'	=> 123,
	'content'				=> 'Second entry.',
];
$entryId	= $table->add( $data );

Attention: For security reasons, all HTML tags will be striped. Set second parameter to FALSE to avoid that, if needed. Make sure to strip HTML tags of none-HTML columns manually!

Updating an entry

$primaryKey	= 2;
$data		= [
	'maybeSomeForeignId'	=> 124,
	'content'				=> 'Second entry - changed.',
];
$result	= $table->edit( $primaryKey, $data );

where the result will be the number of changed entries.

Attention: For security reasons, all HTML tags will be striped. Set third parameter to FALSE to avoid that, if needed. Make sure to strip HTML tags of none-HTML columns manually!

Updating several entries

$indices	= [
	'maybeSomeForeignId'	=> 123,
];
$data		= [
	'maybeSomeForeignId'	=> 124,
];
$result	= $table->editByIndices( $indices, $data );

where the result will be the number of changed entries.

Attention: For security reasons, all HTML tags will be striped. Set third parameter to FALSE to avoid that, if needed. Make sure to strip HTML tags of none-HTML columns manually!

Removing an entry

$primaryKey	= 2;
$result	= $table->remove( $primaryKey );

where the result will be the number of removed entries.

Removing several entry

$indices	= [
	'maybeSomeForeignId'	=> 123,
];
$result	= $table->removeByIndices( $indices );

where the result will be the number of removed entries.

Change fetch mode

In your table structure class, set:

	protected int $fetchMode		= \PDO::[YOUR_FETCH_MODE];

where YOUR_FETCH_MODE is one of these standard PDO fetch modes:

  • FETCH_ASSOC
  • FETCH_NAMED
  • FETCH_NUM
  • FETCH_BOTH
  • FETCH_OBJ

Code Examples using OSQL

Having a config file like this:

driver		= 'mysql';
host		= 'myHost';
port		= 'myPort';
database	= 'myDatabase';
username	= 'myDatabaseUser';
password	= 'myDatabasePassword';

and assuming that you load things up like this:

require_once 'vendor/autoload.php';

use CeusMedia\Database\PDO\DataSourceName;
use CeusMedia\Database\OSQL\Client;
use CeusMedia\Database\OSQL\Connection;
use CeusMedia\Database\OSQL\Condition;
use CeusMedia\Database\OSQL\Table;
use CeusMedia\Database\OSQL\Query\Select;

$config	= (object) parse_ini_file( 'myConfigFile.ini' );

you can connect to a database like this:

$client	= new Client( new Connection( DataSourceName::renderStatic(
	$config->driver,
	$config->database,
	$config->host,
	$config->port,
	$config->username,
	$config->password
), $config->username, $config->password ) );

Now you can query the database like this:

$result	= Select::create( $client )
	->from( new Table( 'galleries', 'g' ) )
	->where( new Condition( 'galleryId', 1, Condition::OP_EQ ) )
	->execute();

The result will contain the requested rows (only one in this example):

new UI_DevOutput();
print_m( $result );

will produce:

[O] 0 -> stdClass
   [S] galleryId => 1
   [S] status => 0
   [S] rank => 1
   [S] path => test
   [S] title => Test
   [S] description => Das ist ein Test.
   [S] timestamp => 1402008611