PDO


Для работы с СУБД MySQL в фреймворке есть два варианта. Сервисы Mysqli и PDO.

Для того чтобы работать с последним, нужно в любом конфигурационном файле организовать секцию с настройками:
1
2
3
4
5
6
7
8
9

     
'pdo' => ['dsn'    => 'mysql:dbname=abc_example;host=localhost'// Настройки коннекта 
               
'opt'    => [], // Дополнительные опции 
               
'user'   => 'root'// Пользователь MySql 
               
'pass'   => ''// Пароль 
               
'prefix' => 'abc_'// Префикс таблиц 
               
'debug'  =>  true// Режим дебаггинга 
    
],  




Пользоваться лучше расшаренным сервисом, чтобы избежать повторных коннектов к СУБД.
1
2
3

    $pdo 
Abc::sharedService(ABC::PDO); 




Сервис предоставляет все нативные возможности драйвера PDO. Основное отличие в дебаггинге. Если настройку 'debug' установить в состояние true, то при ошибке в запросе встроенный SQL дебаггер выдаст примерно такой отчет:
Component PDO: SQL error:
Query in: ...\abc-framework\App\Models\MainModel.php on line: 17
SQLSTATE[42S02]: 1146 Table 'abc_example.table' doesn't exist
(Таблица 'abc_example.table' не существует)
1
2
                    
SELECT * FROM `table`
PHP:
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace ABC\App\Models;

use 
ABC\Abc;

/** 
 * Класс MainModel
 * 
 */   
class MainModel
{
    public function 
getContent()
    {
        
$pdo Abc::sharedService('Pdo');
        
        
$pdo->query("SELECT * FROM `table`");  
    }
}
 


Кроме того, в сервисе есть метод для отладки запросов.

test() public method

Тестирует запрос.

Выводит на экран текст запросов (как простых, так и подготавливаемых). Дополнительно для запросов выборки - время исполнения и Explain

public Pdo::test ( )
return object Объект сервиса


Если вызвать его перед запросом, то будет выведен текст запроса и место локации:
Component PDO:
Query in: ...\abc-framework\App\Models\MainModel.php on line: 23
1
2
3
                    
INSERT INTO `table`
SET `text` = 'McDonald\'s'
PHP:
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 * 
 */   
class MainModel
{
    public function 
getContent()
    {
        
$pdo Abc::sharedService('Pdo');
        
        
$pdo->test(); // Тестируем запрос 
        
$stmt $pdo->prepare("INSERT INTO `table`  
                                   SET `text` = :text " 
                        
); 
     
        
$text "McDonald's";
        
$stmt->execute(['text' => $text]); 
    }
}
 
А для запросов выборки (SELECT) еще время исполнения и explain.
Component PDO:
Query in: ...\abc-framework\App\Models\MainModel.php on line: 18
1
2
                    
SELECT * FROM `table`
Query time: 0.0010 s
Explain:
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE table ALL 11
PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

use ABC\Abc;

/** 
 * Класс MainModel
 * 
 */   
class MainModel
{
    public function 
getContent()
    {
        
$pdo Abc::sharedService('Pdo');
        
        
$pdo->test(); // Тестируем запрос 
        
$pdo->query("SELECT * FROM `table`");  
    }
}
 


Если в процессе исполнения скрипта потребуется новое соединение с СУБД, можно использовать метод

newConnect() public method

Предоставляет связь с сервером MySql.

Организует коннект к СУБД с новыми настройками.

public Pdo::newConnect ( $config array )
$config array Массив настроек сервиса.
[
    'dsn' => Настройки коннекта
    'opt' => Дополнительные опции
    'user' => Пользователь MySql
    'pass' => Пароль
    'prefix' => Префикс таблиц
    'debug' => Режим дебаггинга
]
return void


И последнее. Если установлена настройка 'prefix', то будет доступно публичное свойство

$prefix public property

Префикс таблиц MySQL.

public Pdo::$prefix null


Использовать можно так:
1
2
3

        $pdo
->query("SELECT * FROM `"$pdo->prefix ."table`");




Все остальные свойства и методы аналогичны драйверу PDO.