Php pdo query example

Примеры использования 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 Php pdo query example => PRI [Default] => [Extra] => auto_increment ) [1] => Array ( [Field] => parent [Type] => int(11) unsigned [Null] => NO Php pdo query example => [Default] => 0 [Extra] => ) [2] => Array ( [Field] => name [Type] => varchar(255) [Null] => NO Php pdo query example => [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

О

Читайте также:  Styling page with css

Функция 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). Это может быть полезно для проверки того, что в запросе используются правильные значения, или для выявления проблем с запросом или заполнителями.
Надеюсь, это поможет! Дайте знать, если у вас появятся вопросы.

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

Источник

PHP Data Objects

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,
)

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 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 ++;

Читайте также:  Str to txt file python

$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.

When using prepared statements there is no official PDO feature to show you the final query string that is submitted to a database complete with the parameters you passed.

Читайте также:  Php получить имя класса

Use this simple function for debugging. The values you are passing may not be what you expect.

//Sample query string
$query = «UPDATE users SET name = :user_name WHERE > ;

//Sample parameters
$params = [ ‘:user_name’ => ‘foobear’ , ‘:user_id’ => 1001 ];

function build_pdo_query ( $string , $array ) //Get the key lengths for each of the array elements.
$keys = array_map ( ‘strlen’ , array_keys ( $array ));

//Sort the array by string length so the longest strings are replaced first.
array_multisort ( $keys , SORT_DESC , $array );

foreach( $array as $k => $v ) //Quote non-numeric values.
$replacement = is_numeric ( $v ) ? $v : «‘ < $v >‘» ;

//Replace the needle.
$string = str_replace ( $k , $replacement , $string );
>

echo build_pdo_query ( $query , $params ); //UPDATE users SET name = ‘foobear’ WHERE/> ?>

Источник

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