SQLSTATE HY000 Lỗi chung PDO ATTR_STATEMENT_CLASS không thể được sử dụng với các phiên bản PDO liên tục

yii2使用mysql长链接报错

PHP Warning 'yii\base\ErrorException' with message 'PDO::__construct[]: SQLSTATE[HY000]: General error: PDO::ATTR_STATEMENT_CLASS cannot be used with persistent PDO instances'

配置是这样的

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],

Well, I have not seen it mentioned anywhere and thought its worth mentioning. It might help someone. If you are wondering whether you can set multiple attributes then the answer is yes.

You can do it like this:
try {
    $connection = new PDO["mysql:host=$host; dbname=$dbname", $user, $password];
    // You can begin setting all the attributes you want.
    $connection->setAttribute[PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION];
    $connection->setAttribute[PDO::ATTR_CASE, PDO::CASE_NATURAL];
    $connection->setAttribute[PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING];

    // That's how you can set multiple attributes
}
catch[PDOException $e]
{
    die["Database connection failed: " . $e->getMessage[]];
}

I hope this helps somebody. :]

Các kết nối được thiết lập bằng cách tạo các thể hiện của lớp cơ sở PDO. Bạn muốn sử dụng trình điều khiển nào không quan trọng; . Hàm tạo chấp nhận các tham số để chỉ định nguồn cơ sở dữ liệu [được gọi là DSN] và tùy chọn cho tên người dùng và mật khẩu [nếu có]

Ví dụ #1 Kết nối với MySQL

$dbh = new PDO['mysql:host=localhost;dbname=test', $user, $pass];
?>

Nếu có bất kỳ lỗi kết nối nào, một đối tượng PDOException sẽ bị ném. Bạn có thể bắt ngoại lệ nếu bạn muốn xử lý tình trạng lỗi hoặc bạn có thể chọn để nó cho một trình xử lý ngoại lệ toàn cầu của ứng dụng mà bạn đã thiết lập qua set_Exception_handler[]

Ví dụ #2 Xử lý lỗi kết nối

________số 8

Cảnh báo

Nếu ứng dụng của bạn không bắt được ngoại lệ được ném từ hàm tạo PDO, hành động mặc định được thực hiện bởi công cụ zend là chấm dứt tập lệnh và hiển thị dấu vết quay lại. Dấu vết quay lại này có thể sẽ tiết lộ toàn bộ chi tiết kết nối cơ sở dữ liệu, bao gồm tên người dùng và mật khẩu. Bạn có trách nhiệm nắm bắt ngoại lệ này, một cách rõ ràng [thông qua câu lệnh catch] hoặc hoàn toàn thông qua set_Exception_handler[]

Sau khi kết nối thành công với cơ sở dữ liệu, một phiên bản của lớp PDO được trả về tập lệnh của bạn. Kết nối vẫn hoạt động trong suốt thời gian tồn tại của đối tượng PDO đó. Để đóng kết nối, bạn cần hủy đối tượng bằng cách đảm bảo rằng tất cả các tham chiếu còn lại đến nó đều bị xóa—bạn thực hiện việc này bằng cách gán

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],
0 cho biến chứa đối tượng. Nếu bạn không làm điều này một cách rõ ràng, PHP sẽ tự động đóng kết nối khi tập lệnh của bạn kết thúc

Ghi chú. Nếu vẫn còn các tham chiếu khác đến phiên bản PDO này [chẳng hạn như từ một phiên bản PDOStatement hoặc từ các biến khác tham chiếu đến cùng một phiên bản PDO], những tham chiếu này cũng phải được loại bỏ [ví dụ: bằng cách gán

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],
0 cho biến tham chiếu PDOStatement]

Ví dụ #3 Đóng kết nối

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],
2

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],
3

Nhiều ứng dụng web sẽ được hưởng lợi từ việc tạo kết nối liên tục đến máy chủ cơ sở dữ liệu. Các kết nối liên tục không bị đóng ở cuối tập lệnh nhưng được lưu vào bộ đệm ẩn và được sử dụng lại khi một tập lệnh khác yêu cầu kết nối bằng cùng thông tin đăng nhập. Bộ đệm kết nối liên tục cho phép bạn tránh được chi phí thiết lập kết nối mới mỗi khi tập lệnh cần nói chuyện với cơ sở dữ liệu, dẫn đến ứng dụng web nhanh hơn

Ví dụ #4 Kết nối liên tục

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],
4

Giá trị của tùy chọn

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],
5 được chuyển đổi thành bool [bật/tắt kết nối liên tục], trừ khi đó là một chuỗi không phải là số, trong trường hợp đó, nó cho phép sử dụng nhiều nhóm kết nối liên tục. Điều này hữu ích nếu các kết nối khác nhau sử dụng cài đặt không tương thích, ví dụ: các giá trị khác nhau của PDOException0

Ghi chú

Nếu bạn muốn sử dụng các kết nối liên tục, bạn phải đặt

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=kj_pay',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'attributes' => array[PDO::ATTR_PERSISTENT => true]
],
5 trong mảng tùy chọn trình điều khiển được chuyển đến hàm tạo PDO. Nếu đặt thuộc tính này với PDO. setAttribute[] sau khi khởi tạo đối tượng, trình điều khiển sẽ không sử dụng các kết nối liên tục

Ghi chú

Nếu bạn đang sử dụng trình điều khiển PDO ODBC và các thư viện ODBC của bạn hỗ trợ Nhóm kết nối ODBC [unixODBC và Windows là hai hỗ trợ; có thể có nhiều hơn], thì bạn không nên sử dụng các kết nối PDO liên tục mà thay vào đó hãy rời khỏi kết nối . Nhóm kết nối ODBC được chia sẻ với các mô-đun khác trong quy trình;

Doctrine có sử dụng PDO không?

Học thuyết hỗ trợ cả PEAR DB/MDB2 như tên nguồn dữ liệu cũng như tên nguồn dữ liệu kiểu PDO .

Làm cách nào để đóng kết nối PDO trong PHP?

Kết nối vẫn hoạt động trong suốt thời gian tồn tại của đối tượng PDO đó. Để đóng kết nối, bạn cần hủy đối tượng bằng cách đảm bảo rằng tất cả các tham chiếu còn lại đến đối tượng đó đều bị xóa —bạn thực hiện việc này bằng cách gán null cho biến đó .

Làm cách nào để kết nối với cơ sở dữ liệu mysql bằng PDO trong PHP?

Kết nối cơ sở dữ liệu PDO yêu cầu bạn phải tạo đối tượng PDO mới với Tên nguồn dữ liệu [DSN], Tên người dùng và Mật khẩu . DSN xác định loại cơ sở dữ liệu, tên của cơ sở dữ liệu và bất kỳ thông tin nào khác liên quan đến cơ sở dữ liệu nếu được yêu cầu. Đây là các biến và giá trị chúng tôi đã nêu bên trong dbconfig.

Làm cách nào để tạo kết nối PDO trong PHP?

$pdo = PDO mới[$dsn, $user, $passwd]; Một đối tượng PDO mới được tạo. Chúng tôi chuyển cho hàm tạo tên nguồn dữ liệu, tên người dùng và mật khẩu. Lớp PDO đại diện cho kết nối giữa PHP và máy chủ cơ sở dữ liệu.

Chủ Đề