Please note this:
Won't work:
$sth = $dbh->prepare('SELECT name, colour, calories FROM ? WHERE calories < ?');
THIS WORKS!
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ?');
The parameter cannot be applied on table names!!PDO
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
PDO
Референца за `book.pdo.php` со подобрена типографија и навигација.
PHP Објекти за податоци
Вовед
На PHP Data Objects (PDO) екстензијата дефинира лесен, конзистентен интерфејс за пристап до бази на податоци во PHP. Секој драјвер за база на податоци што го имплементира PDO интерфејсот може да изложи специфични карактеристики на базата на податоци како обични екстензија функции. Имајте предвид дека не можете да извршувате никакви функции на базата на податоци користејќи ја само PDO екстензијата; мора да користите драјвер за PDO специфичен за базата на податоци за пристап до сервер за база на податоци.
PDO обезбедува data-access слој за апстракција, што значи дека, без оглед на тоа која база на податоци ја користите, ги користите истите функции за издавање прашања и добивање податоци. PDO не not обезбедува database апстракција; не препишува SQL или емулира недостасувачки карактеристики. Треба да користите целосен слој за апстракција ако ви е потребна таа можност.
PDO доаѓа со PHP.
- Installing/Configuring
- Претходно дефинирани константи
- ODBC Функции
- Конекции и управување со конекции
- Трансакции и автоматско запишување
- Грешки и ракување со грешки
- Подготвени изјави и процедури за складирање
- PDO Големи објекти (LOBs)
- PDO::beginTransaction — Започнува трансакција
- PDO::commit — Потврдува трансакција
- PDO::connect — Поврзете се со база на податоци и вратете PDO подкласа за драјвери што ја поддржуваат
- PDO::__construct — Креира PDO инстанца што претставува врска со база на податоци
- PDO::errorCode — Преземете го SQLSTATE поврзан со последната операција на рачката на базата на податоци
- PDO::errorInfo — Преземете проширени информации за грешки поврзани со последната операција на рачката на базата на податоци
- PDO::exec — Извршете SQL изјава и вратете го бројот на погодени редови
- PDO::getAttribute — Преземете атрибут за поврзување со база на податоци
- PDO::getAvailableDrivers — Вратете низа од достапни PDO драјвери
- PDO::inTransaction — Проверува дали е во трансакција
- PDO::lastInsertId — Враќа ID на последниот вметнат ред или вредност на секвенца
- PDO::prepare — Подготвува изјава за извршување и враќа објект за изјава
- PDO::query — Подготвува и извршува SQL изјава без заменски знаци
- PDO::quote — Цитира низа за употреба во прашалник
- PDO::rollBack — Враќа трансакција
- PDO::setAttribute — Постави атрибут
- PDOStatement — Класата PDO
- PDOStatement::bindColumn — Поврзете колона со PHP променлива
- PDOStatement::bindParam — Поврзува параметар со наведеното име на променлива
- PDOStatement::bindValue — Поврзува вредност со параметар
- PDOStatement::closeCursor — Го затвора курсорот, овозможувајќи изјавата да се изврши повторно
- PDOStatement::columnCount — Враќа број на колони во множеството резултати
- PDOStatement::debugDumpParams — Исфрла подготвена SQL команда
- PDOStatement::errorCode — Презема SQLSTATE поврзан со последната операција на рачката на изјавата
- PDOStatement::errorInfo — Презема проширени информации за грешки поврзани со последната операција на рачката на изјавата
- PDOStatement::execute — Извршува подготвена изјава
- PDOStatement::fetch — Презема следниот ред од множеството резултати
- PDOStatement::fetchAll — Презема преостанатите редови од множеството резултати
- PDOStatement::fetchColumn — Враќа една колона од следниот ред на множеството резултати
- PDOStatement::fetchObject — Презема следниот ред и го враќа како објект
- PDOStatement::getAttribute — Презема атрибут на изјавата
- PDOStatement::getColumnMeta — Враќа метаподатоци за колона во множеството резултати
- PDOStatement::getIterator — Добива итератор на множество резултати
- PDOStatement::nextRowset сега наместо
- PDOStatement::rowCount — Напредува до следниот сет на редови во рачка за изјава со повеќе множества редови
- PDOStatement::setAttribute — Враќа број на редови погодени од последната SQL изјава
- PDOStatement::setFetchMode — Постави атрибут на изјавата
- PDORow — Класата PDOStatement
- PDOException — Класата PDORow
- — Класата PDOException
- — Постави го стандардниот режим на преземање за оваа изјава — CUBRID PDO драјвер (PDO_CUBRID)
- MS SQL Server PDO драјвер — Microsoft SQL Server и Sybase PDO драјвер (PDO_DBLIB)
- Pdo\Dblib — Класата Pdo\Dblib
- Firebird PDO драјвер — Firebird PDO драјвер (PDO_FIREBIRD)
- Pdo\Firebird — Класата Pdo\Firebird
- IBM PDO драјвер — IBM PDO драјвер (PDO_IBM)
- Informix PDO драјвер — Informix PDO драјвер (PDO_INFORMIX)
- MySQL PDO драјвер — MySQL PDO драјвер (PDO_MYSQL)
- Pdo\Mysql — Класата Pdo\Mysql
- MS SQL Server PDO драјвер — Microsoft SQL Server PDO драјвер (PDO_SQLSRV)
- Oracle PDO драјвер — Oracle PDO драјвер (PDO_OCI)
- ODBC и DB2 PDO драјвер — ODBC и DB2 PDO драјвер (PDO_ODBC)
- Pdo\Odbc — Класата Pdo\Odbc
- PostgreSQL PDO драјвер — PostgreSQL PDO драјвер (PDO_PGSQL)
- Pdo\Pgsql — Класата Pdo\Pgsql
- SQLite PDO драјвер — SQLite PDO драјвер (PDO_SQLITE)
- Pdo\Sqlite — Класата Pdo\Sqlite
Белешки од корисници 5 белешки
I wanted to extend PDO class to store statistics of DB usage, and I faced some problems. I wanted to count number of created statements and number of their executings. So PDOStatement should have link to PDO that created it and stores the statistical info. The problem was that I didn't knew how PDO creates PDOStatement (constructor parameters and so on), so I have created these two classes:
<?php
/**
* PHP Document Object plus
*
* PHP Document Object plus is library with functionality of PDO, entirely written
* in PHP, so that developer can easily extend it's classes with specific functionality,
* such as providing database usage statistics implemented in v1.0b
*
* @author Peter Pokojny
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
class PDOp {
protected $PDO;
public $numExecutes;
public $numStatements;
public function __construct($dsn, $user=NULL, $pass=NULL, $driver_options=NULL) {
$this->PDO = new PDO($dsn, $user, $pass, $driver_options);
$this->numExecutes = 0;
$this->numStatements = 0;
}
public function __call($func, $args) {
return call_user_func_array(array(&$this->PDO, $func), $args);
}
public function prepare() {
$this->numStatements++;
$args = func_get_args();
$PDOS = call_user_func_array(array(&$this->PDO, 'prepare'), $args);
return new PDOpStatement($this, $PDOS);
}
public function query() {
$this->numExecutes++;
$this->numStatements++;
$args = func_get_args();
$PDOS = call_user_func_array(array(&$this->PDO, 'query'), $args);
return new PDOpStatement($this, $PDOS);
}
public function exec() {
$this->numExecutes++;
$args = func_get_args();
return call_user_func_array(array(&$this->PDO, 'exec'), $args);
}
}
class PDOpStatement implements IteratorAggregate {
protected $PDOS;
protected $PDOp;
public function __construct($PDOp, $PDOS) {
$this->PDOp = $PDOp;
$this->PDOS = $PDOS;
}
public function __call($func, $args) {
return call_user_func_array(array(&$this->PDOS, $func), $args);
}
public function bindColumn($column, &$param, $type=NULL) {
if ($type === NULL)
$this->PDOS->bindColumn($column, $param);
else
$this->PDOS->bindColumn($column, $param, $type);
}
public function bindParam($column, &$param, $type=NULL) {
if ($type === NULL)
$this->PDOS->bindParam($column, $param);
else
$this->PDOS->bindParam($column, $param, $type);
}
public function execute() {
$this->PDOp->numExecutes++;
$args = func_get_args();
return call_user_func_array(array(&$this->PDOS, 'execute'), $args);
}
public function __get($property) {
return $this->PDOS->$property;
}
public function getIterator() {
return $this->PDOS;
}
}
?>
Classes have properties with original PDO and PDOStatement objects, which are providing the functionality to PDOp and PDOpStatement.
From outside, PDOp and PDOpStatement look like PDO and PDOStatement, but also are providing wanted info.<?php
// Database credentials
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";
try {
// 1. Create database connection (DSN includes the charset)
$dsn = "mysql:host=$servername;dbname=$dbname;charset=utf8mb4";
$conn = new PDO($dsn, $username, $password);
// 2. Set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully.<br><br>";
// ==========================================
// EXAMPLE 1: Inserting data into the database (INSERT)
// ==========================================
// Assuming you have a 'users' table with 'first_name', 'last_name', and 'email' columns
$sql_insert = "INSERT INTO users (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]')";
// exec() is used for queries that don't return a result set
$conn->exec($sql_insert);
// Get the ID of the last inserted row
$last_id = $conn->lastInsertId();
echo "✅ New record created successfully. The ID of the new user is: " . $last_id . "<br><br>";
echo "<hr>";
// ==========================================
// EXAMPLE 2: Reading data from the database (SELECT)
// ==========================================
$sql_select = "SELECT id, first_name, last_name FROM users";
// query() is used for running standard SELECT statements
$stmt = $conn->query($sql_select);
// Check if the query returned any rows
if ($stmt->rowCount() > 0) {
echo "<strong>User List:</strong><br>";
// Loop through the results row by row using FETCH_ASSOC
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: " . $row["id"] . " | Name: " . $row["first_name"] . " " . $row["last_name"] . "<br>";
}
} else {
echo "No records found in the database.";
}
} catch (PDOException $e) {
// Catch any database errors and display them safely
echo "❌ Database Error: " . $e->getMessage();
}
// 3. Close the connection
// In PDO, closing the connection is done by setting the variable to null
$conn = null;
?>This is a little late... but I'm old and slow.......
Regarding Extending PDOStatement and PDO I found that sending the PDOExtended class by reference helps:
In the constructor after parent::__construct() :
$this->setAttribute(\PDO::ATTR_STATEMENT_CLASS,array('PDOStatementExtended', [&$this]));}
And in
class PDOStatementExtended extends \PDOStatement
{
protected function __construct
(
\PDO &$PDO,
)Below is an example of extending PDO & PDOStatement classes:
<?php
class Database extends PDO
{
function __construct()
{
parent::__construct('mysql:dbname=test;host=localhost', 'root', '');
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
}
}
class DBStatement extends PDOStatement
{
public $dbh;
protected function __construct($dbh)
{
$this->dbh = $dbh;
$this->setFetchMode(PDO::FETCH_OBJ);
}
public function foundRows()
{
$rows = $this->dbh->prepare('SELECT found_rows() AS rows', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));
$rows->execute();
$rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;
$rows->closeCursor();
return $rowsCount;
}
}
?>