Примеры использования pdo php

The PDO class

Represents a connection between PHP and a database server.

Class synopsis

public __construct (
string $dsn ,
? string $username = null ,
? string $password = null ,
? array $options = null
)

public query ( string $query , ? int $fetchMode = PDO::FETCH_COLUMN , int $colno ): PDOStatement | false

public query (
string $query ,
? int $fetchMode = PDO::FETCH_CLASS ,
string $classname ,
array $constructorArgs
): PDOStatement | false

public query ( string $query , ? int $fetchMode = PDO::FETCH_INTO , object $object ): PDOStatement | false

Table of Contents

  • PDO::beginTransaction — Initiates a transaction
  • PDO::commit — Commits a transaction
  • PDO::__construct — Creates a PDO instance representing a connection to a database
  • PDO::errorCode — Fetch the SQLSTATE associated with the last operation on the database handle
  • PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle
  • PDO::exec — Execute an SQL statement and return the number of affected rows
  • PDO::getAttribute — Retrieve a database connection attribute
  • PDO::getAvailableDrivers — Return an array of available PDO drivers
  • PDO::inTransaction — Checks if inside a transaction
  • PDO::lastInsertId — Returns the ID of the last inserted row or sequence value
  • PDO::prepare — Prepares a statement for execution and returns a statement object
  • PDO::query — Prepares and executes an SQL statement without placeholders
  • PDO::quote — Quotes a string for use in a query
  • PDO::rollBack — Rolls back a transaction
  • PDO::setAttribute — Set an attribute
Читайте также:  Files in python json files with python

User Contributed Notes 8 notes

«And storing username/password inside class is not a very good idea for production code.»

Good idea is to store database connection settings in *.ini files but you have to restrict access to them. For example this way:

my_setting.ini:
[database]driver = mysql
host = localhost
;port = 3306
schema = db_schema
username = user
password = secret

Database connection:
class MyPDO extends PDO
public function __construct ( $file = ‘my_setting.ini’ )
if (! $settings = parse_ini_file ( $file , TRUE )) throw new exception ( ‘Unable to open ‘ . $file . ‘.’ );

$dns = $settings [ ‘database’ ][ ‘driver’ ] .
‘:host=’ . $settings [ ‘database’ ][ ‘host’ ] .
((!empty( $settings [ ‘database’ ][ ‘port’ ])) ? ( ‘;port=’ . $settings [ ‘database’ ][ ‘port’ ]) : » ) .
‘;dbname=’ . $settings [ ‘database’ ][ ‘schema’ ];

parent :: __construct ( $dns , $settings [ ‘database’ ][ ‘username’ ], $settings [ ‘database’ ][ ‘password’ ]);
>
>
?>

Database connection parameters are accessible via human readable ini file for those who screams even if they see one PHP/HTML/any_other command.

PDO and Dependency Injection

Dependency injection is good for testing. But for anyone wanting various data mapper objects to have a database connection, dependency injection can make other model code very messy because database objects have to be instantiated all over the place and given to the data mapper objects.

The code below is a good way to maintain dependency injection while keeping clean and minimal model code.

class DataMapper
public static $db ;

public static function init ( $db )
self :: $db = $db ;
>
>

class VendorMapper extends DataMapper
public static function add ( $vendor )
$st = self :: $db -> prepare (
«insert into vendors set
first_name = :first_name,
last_name = :last_name»
);
$st -> execute (array(
‘:first_name’ => $vendor -> first_name ,
‘:last_name’ => $vendor -> last_name
));
>
>

// In your bootstrap
$db = new PDO (. );
DataMapper :: init ( $db );

// In your model logic
$vendor = new Vendor ( ‘John’ , ‘Doe’ );
VendorMapper :: add ( $vendor );

Keep in mind, you MUST NOT use ‘root’ user in your applications, unless your application designed to do a database maintenance.

And storing username/password inside class is not a very good idea for production code. You would need to edit the actual working code to change settings, which is bad.

I personnaly create a new instance of PDO like this :

$dbDatas = parse_ini_file( DB_FILE );
$dbOptions = [
\PDO::ATTR_DEFAULT_FECTH_MODE => \PDO::FETCH_OBJ,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
];

$dsn = sprintf( ‘mysql:dbname=%s;host=%s’, $dbDatas[‘dbname’],
$dbDatas[‘host’] );

$this->cn = new \PDO( $dsn, $dbDatas[‘user’], $dbDatas[‘password’],
$dbOptions );
$this->cn->exec( ‘SET CHARACTER SET UTF8’ );

Starting with PHP 5.4 you are unable to use persistent connections when you have your own database class derived from the native PDO class. If your code uses this combination, you will encounter segmentation faults during the cleanup of the PHP process.
You can still use _either_ a derived PDO class _or_ persistent connections.

For more information, please see this bug report: https://bugs.php.net/bug.php?id=63176

For some Database Environment, such as Aliyun DRDS (Distributed Relational Database Service), cannot process preparing for SQL.
For such cases, the option `\PDO::ATTR_EMULATE_PREPARES` should be set to true. If you always got reports about «Failed to prepare SQL» while this option were set to false, you might try to turn on this option to emulate prepares for SQL.

Here is an singleton PDO example:

[db_options]PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8

private static function getLink ( ) if ( self :: $link ) return self :: $link ;
>

$ini = _BASE_DIR . «config.ini» ;
$parse = parse_ini_file ( $ini , true ) ;

$driver = $parse [ «db_driver» ] ;
$dsn = » $ < driver >:» ;
$user = $parse [ «db_user» ] ;
$password = $parse [ «db_password» ] ;
$options = $parse [ «db_options» ] ;
$attributes = $parse [ «db_attributes» ] ;

self :: $link = new PDO ( $dsn , $user , $password , $options ) ;

foreach ( $attributes as $k => $v ) self :: $link -> setAttribute ( constant ( «PDO:: < $k >» )
, constant ( «PDO:: < $v >» ) ) ;
>

public static function __callStatic ( $name , $args ) $callback = array ( self :: getLink ( ), $name ) ;
return call_user_func_array ( $callback , $args ) ;
>
> ?>

$stmt = Database :: prepare ( «SELECT ‘something’ ;» ) ;
$stmt -> execute ( ) ;
var_dump ( $stmt -> fetchAll ( ) ) ;
$stmt -> closeCursor ( ) ;
?>

1) Do not use your ddbb info in the same file

2) DO NOT NEVER USE «All privileges user» for everything, always create an alternative user with restricted permissions (basic: SELECT, INSERT and so on)

  • PDO
    • Introduction
    • Installing/Configuring
    • Predefined Constants
    • Connections and Connection management
    • Transactions and auto-​commit
    • Prepared statements and stored procedures
    • Errors and error handling
    • Large Objects (LOBs)
    • PDO
    • PDOStatement
    • PDOException
    • PDO Drivers

    Источник

    Примеры использования PDO MySQL

    Ниже приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и удаление данных. Подробнее о методах PDO можно узнать на php.net.

    Для примеров используется таблица `category` с полями `id` , `name` и `parent` .

    Подключение к серверу MySQL

    $dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

    Четвертым параметром конструктора PDO можно указать параметры подключения, например SQL запрос который будет выполнен сразу после подключения:

    $dbh = new PDO(' mysql:dbname=db_name;host=localhost', 'логин', 'пароль', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'") );

    Чтобы отследить ошибку подключения к БД используется исключение:

    try < $dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль'); >catch (PDOException $e) < die($e->getMessage()); >
    SQLSTATE[HY000] [1045] Access denied for user 'логин'@'localhost' (using password: YES)

    Выборка из БД

    Выборка одной записи

    PDO позволяет использовать в запросах псевдопеременные чтобы исключить SQL инъекции. В самом запросе в место данных указывается ? или :id , а в методе execute() указываются реальные значения этих переменных.

    $sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = ?"); $sth->execute(array('21')); $array = $sth->fetch(PDO::FETCH_ASSOC); print_r($array);
    $sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = :id"); $sth->execute(array('id' => '21')); $array = $sth->fetch(PDO::FETCH_ASSOC); print_r($array);
    Array ( [id] => 21 [parent] => 3 [name] => Хурма ) 

    Выборка всех записей таблицы

    Данный пример получает всю таблицу в виде ассоциативного массива:

    $sth = $dbh->prepare("SELECT * FROM `category` ORDER BY `name`"); $sth->execute(); $array = $sth->fetchAll(PDO::FETCH_ASSOC); print_r($array);
    Array ( [0] => Array ( [id] => 16 [parent] => 3 [name] => Абрикос ) [1] => Array ( [id] => 28 [parent] => 3 [name] => Авокадо ) . )

    Получить значение поля одной записи

    $sth = $dbh->prepare("SELECT `name` FROM `category` WHERE `id` = ?"); $sth->execute(array('21')); $value = $sth->fetch(PDO::FETCH_COLUMN); echo $value; // Выведет "Хурма"

    Получение всех значений одного столбца таблицы

    Пример получает все значения поля `name` из таблицы `category` .

    $sth = $dbh->prepare("SELECT `name` FROM `category`"); $sth->execute(); $array = $sth->fetchAll(PDO::FETCH_COLUMN); print_r($array);
    Array ( [0] => Мороженое [1] => Овощи [2] => Фрукты [3] => Ягоды [4] => Грибы [5] => Морепродукты [6] => Смеси . )

    Получение структуры таблицы

    $sth = $dbh->prepare("SHOW COLUMNS FROM `category`"); $sth->execute(); $array = $sth->fetchAll(PDO::FETCH_ASSOC); print_r($array);
    Array ( [0] => Array ( [Field] => id [Type] => int(10) unsigned [Null] => NO Примеры использования pdo php => PRI [Default] => [Extra] => auto_increment ) [1] => Array ( [Field] => parent [Type] => int(11) unsigned [Null] => NO Примеры использования pdo php => [Default] => 0 [Extra] => ) [2] => Array ( [Field] => name [Type] => varchar(255) [Null] => NO Примеры использования pdo php => [Default] => [Extra] => ) )

    Добавление записей в БД

    $sth = $dbh->prepare("INSERT INTO `category` SET `parent` = :parent, `name` = :name"); $sth->execute(array('parent' => 1, 'name' => 'Виноград')); // Получаем id вставленной записи $insert_id = $dbh->lastInsertId();

    Изменение записей

    $sth = $dbh->prepare("UPDATE `category` SET `name` = :name WHERE `id` = :id"); $sth->execute(array('name' => 'Виноград', 'id' => 22));

    Удаление из БД

    $count = $dbh->exec("DELETE FROM `category` WHERE `parent` = 1"); echo 'Удалено ' . $count . ' строк.';

    Или метод c псевдопеременными:

    $sth = $dbh->prepare("DELETE FROM `category` WHERE `parent` = :parent"); $sth->execute(array('parent' => 1));

    Обработка ошибок

    В PDO есть метод errorInfo() который возвращает сведенья об ошибке последнего запроса.

    // Таблицы `category_new` нет в БД. $sth = $dbh->prepare("INSERT INTO `category_new` SET `parent` = :parent, `name` = :name"); $sth->execute(array('parent' => 1, 'name' => 'Виноград')); $info = $sth->errorInfo(); print_r($info);
    Array ( [0] => 42S02 [1] => 1146 [2] => Table 'database.category_new' doesn't exist )

    Комментарии 1

    О

    Функция debugDumpParams объекта PDOStatement используется для вывода параметров подготовленного оператора. Это может быть полезно для отладки и устранения неполадок, поскольку позволяет увидеть точный SQL-запрос, который будет выполнен, а также значения любых установленных заполнителей.
    Например, рассмотрим следующий код:

    $sth = $dbh->prepare(‘SELECT * FROM users WHERE name = :name AND age = :age’);
    $sth->bindParam(‘:name’, $name);
    $sth->bindParam(‘:age’, $age);
    $name = ‘John’;
    $age = 35;
    $sth->debugDumpParams();

    SQL: [114] SELECT * FROM users WHERE name = :name AND age = :age
    Params: 2
    Key: Name: [5] :name
    paramno=-1
    name=[5] «:name»
    is_param=1
    param_type=2
    Key: Name: [4] :age
    paramno=-1
    name=[4] «:age»
    is_param=1
    param_type=2

    Вывод показывает SQL-запрос с заполнителями и значениями заполнителей (в данном случае :name — «John», а :age — 35). Это может быть полезно для проверки того, что в запросе используются правильные значения, или для выявления проблем с запросом или заполнителями.
    Надеюсь, это поможет! Дайте знать, если у вас появятся вопросы.

    Авторизуйтесь, чтобы добавить комментарий.

    Источник

Оцените статью