Làm cách nào để chạy truy vấn PDO?

PDO [Đối tượng dữ liệu PHP] là một lớp trừu tượng cho các truy vấn cơ sở dữ liệu của bạn và là một giải pháp thay thế tuyệt vời cho MySQLi, vì nó hỗ trợ. Đây là một lợi ích to lớn cho những người và công ty cần nó. Tuy nhiên, hãy nhớ rằng MySQL cho đến nay vẫn là. Nó cũng được kết hợp cực kỳ chặt chẽ với PHP, đó là lý do tại sao con số đó cao hơn đáng kể trong thế giới PHP, vì PHP và MYSQL giống như bơ đậu phộng và thạch. NoSQL là một câu chuyện khác, và Firebase và MongoDB là những lựa chọn tuyệt vời, đặc biệt là cái trước, vì nó là cơ sở dữ liệu trực tiếp — rõ ràng là cả hai đều không được hỗ trợ trong PDO

Ghi chú. Đối với hướng dẫn này, tôi sẽ hiển thị các câu lệnh được chuẩn bị PDO không mô phỏng [gốc] hoàn toàn với MySQL, vì vậy có thể có một số khác biệt trên một trình điều khiển khác

Nếu bạn biết chắc chắn rằng cơ sở dữ liệu SQL duy nhất bạn sẽ sử dụng là MySQL hoặc MariaDB, thì bạn có thể chọn giữa PDO hoặc MySQLi. Hãy xem hướng dẫn sau, Nếu bạn muốn học MySQLi. Một trong hai cách này hoàn toàn có thể chấp nhận được để sử dụng, mặc dù PDO là lựa chọn tốt hơn cho hầu hết người dùng, vì nó đơn giản và linh hoạt hơn, trong khi MySQLi đôi khi phù hợp hơn với người dùng nâng cao do một số tính năng dành riêng cho MySQL của nó

Rất nhiều người nhắc lại rằng ưu điểm chính của PDO là nó có thể di động từ cơ sở dữ liệu này sang cơ sở dữ liệu khác. Đây là một lợi ích cực kỳ phóng đại và về cơ bản là vô nghĩa. SQL không được chuyển theo cách này, vì mỗi trình điều khiển cơ sở dữ liệu có sắc thái riêng;

Ưu điểm thực sự của PDO là bạn đang sử dụng một API gần như tương tự cho bất kỳ cơ sở dữ liệu nào trong số vô số cơ sở dữ liệu mà nó hỗ trợ, vì vậy bạn không cần phải tìm hiểu cơ sở dữ liệu mới cho từng cơ sở dữ liệu. Các tham số được đặt tên chắc chắn cũng là một chiến thắng lớn cho PDO, vì bạn có thể sử dụng lại các giá trị giống nhau ở những vị trí khác nhau trong các truy vấn. Thật không may, bạn không thể sử dụng cùng một tham số được đặt tên nhiều lần khi tắt chế độ mô phỏng, do đó, nó trở nên vô dụng vì mục đích của hướng dẫn này

Một lợi thế gây tranh cãi của PDO là bạn không cần sử dụng

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
4 hay
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
5, vì bạn có thể chỉ cần chuyển trực tiếp các giá trị dưới dạng mảng vào thực thi. Một số người có thể lập luận rằng đây được coi là cách làm không tốt, vì bạn không thể chỉ định loại [string, int, double, blob]; . Trong thực tế, điều này sẽ không ảnh hưởng đến ints hoặc double của bạn và an toàn trước SQL injection. Bài viết này sẽ ràng buộc các giá trị trực tiếp vào thực thi. Tương tự như
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
5, bạn có thể sử dụng cả giá trị và biến. Chúng tôi sẽ không đề cập đến hai phương pháp liên kết, nhưng nếu bạn muốn biết sự khác biệt tinh tế giữa hai phương pháp này, hãy đọc bài viết

Nếu bạn muốn tìm hiểu cách hoạt động của SQL injection, bạn có thể

Cách thức hoạt động của báo cáo chuẩn bị PDO

Theo thuật ngữ của giáo dân, các câu lệnh chuẩn bị PDO hoạt động như thế này

  1. Chuẩn bị một truy vấn SQL với các giá trị trống dưới dạng trình giữ chỗ có dấu chấm hỏi hoặc tên biến có dấu hai chấm trước nó cho mỗi giá trị
  2. Liên kết các giá trị hoặc biến với trình giữ chỗ
  3. Thực hiện truy vấn đồng thời

Tạo kết nối PDO mới

Tôi khuyên bạn nên tạo một tệp có tên

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
7 và đặt nó bên ngoài thư mục gốc của bạn [ví dụ:. html, công khai_html]

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO[$dsn, "username", "password", $options];
} catch [Exception $e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}

Vì vậy, những gì đang xảy ra ở đây? . Đây là cách được đề xuất để thực hiện và rõ ràng bạn có thể đặt bộ ký tự của mình thành bất kỳ thứ gì mà ứng dụng của bạn cần [mặc dù utf8mb4 khá chuẩn]. Bây giờ bạn có thể chuyển thông tin DSN, tên người dùng, mật khẩu và các tùy chọn của mình

Ngoài ra, bạn có thể bỏ qua việc sử dụng khối

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
8 bằng cách tạo trình xử lý ngoại lệ tùy chỉnh toàn cầu. Nếu điều này được bao gồm trên tất cả các trang của bạn, thì nó sẽ sử dụng trình xử lý tùy chỉnh này, trừ khi bạn thực hiện khôi phục_ngoại lệ_handler[] để hoàn nguyên về trình xử lý ngoại lệ PHP tích hợp hoặc gọi set_Exception_handler[] với chức năng mới và thông báo tùy chỉnh

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];

Điều này cực kỳ gây tranh cãi, nhưng một điều tôi thích ở MySQLi là báo cáo lỗi bị tắt theo mặc định. Điều này thật thông minh, vì vậy người mới bắt đầu sẽ không vô tình in ra mật khẩu của mình. Trong PDO, mặc dù bạn có quyền kiểm soát để tắt các lỗi, nhưng bạn không thể làm điều này cho. Vì vậy, rõ ràng trước tiên bạn nên thiết lập php của mình. ini cho sản xuất

Để ngăn rò rỉ mật khẩu của bạn, đây là những gì php của bạn. ini sẽ giống như trong sản xuất. làm cả

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
9 và
$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
0. Sau đó khởi động lại Apache hoặc Nginx

Bây giờ tất cả các lỗi trên trang web của bạn sẽ chỉ tích lũy trong nhật ký lỗi của bạn, thay vì in chúng ra

Tuy nhiên, tôi không thấy có lý do gì để in mật khẩu của bạn trong nhật ký lỗi, vì vậy tôi khuyên bạn nên thực hiện

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
8 hoặc
$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
2, trong khi thực hiện
$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
3 , không phải
$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
4, vốn vẫn chứa thông tin nhạy cảm của bạn. Điều này rõ ràng chỉ áp dụng khi bạn tạo một kết nối mới

Tham số được đặt tên

Tôi thực sự yêu thích tính năng này và đó là một lợi thế rất lớn cho PDO. Bạn chỉ định một biến có tên là

$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
5 và đặt giá trị cho nó khi thực thi. Mặc dù như đã nêu trước đó, lợi thế duy nhất của nó là được sử dụng nhiều lần sẽ trở nên vô dụng nếu chế độ mô phỏng bị tắt

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
4

Về mặt kỹ thuật, bạn không cần dấu hai chấm ở đầu trên

$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
6 cho phần thực thi, như đã nêu ở đây. Tuy nhiên, điều này không được nêu rõ ràng ở bất kỳ đâu trong tài liệu, vì vậy mặc dù nó sẽ hoạt động như một số người dùng đã kết luận một cách sắc sảo bằng cách xem mã C, nhưng về mặt kỹ thuật, nó không được khuyến nghị. Linh cảm của tôi là PHP cuối cùng sẽ ghi lại điều này, vì có vẻ như có đủ người bỏ qua dấu hai chấm ở đầu

Tôi dành riêng một phần để sử dụng các tham số được đặt tên, vì phần còn lại của bài đăng sẽ sử dụng

$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
7 để thay thế. Hãy nhớ rằng bạn không thể kết hợp cả hai với nhau khi ràng buộc các giá trị

Chèn, cập nhật và xóa

Tất cả những thứ này cực kỳ giống nhau, vì vậy chúng sẽ được kết hợp

Chèn

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
7

Cập nhật

Bạn thậm chí có thể xâu chuỗi

$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
8 và
$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
9. Mặc dù bạn sẽ không thể sử dụng bất kỳ chức năng nào, chẳng hạn như
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
00, vì vậy nó gần như vô dụng trong thực tế

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
1

Xóa bỏ

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;

Nhận số hàng bị ảnh hưởng

Lấy số hàng bị ảnh hưởng cực kỳ đơn giản, vì tất cả những gì bạn cần làm là

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
01. Thông thường nếu bạn cập nhật bảng của mình với cùng các giá trị, nó sẽ trả về 0. Nếu bạn muốn thay đổi hành vi này, thì cách duy nhất để làm điều này là thêm tùy chọn này trên toàn cầu khi bạn
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
02

________số 8

-1 - Truy vấn trả về lỗi. Dự phòng nếu đã xử lý lỗi cho exec[]

0 - Không có bản ghi nào được cập nhật khi CẬP NHẬT, không có hàng nào khớp với mệnh đề WHERE hoặc không có truy vấn nào được thực thi;

Lớn hơn 0 - Trả về số hàng bị ảnh hưởng; . Có thể được sử dụng để lấy số hàng trong CHỌN nếu trình điều khiển cơ sở dữ liệu hỗ trợ nó, điều mà MySQL làm

Nhận khóa chính mới nhất được chèn

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
0

Kiểm tra xem mục trùng lặp

Đôi khi, bạn có thể cần thực thi một giá trị duy nhất cho một hoặc nhiều cột. Rõ ràng là bạn có thể chỉ cần sử dụng câu lệnh SELECT để kiểm tra xem đã có một hàng có các giá trị được cố gắng chèn vào chưa. Làm điều này không nhất thiết là sai, nhưng sẽ không hợp lý khi thực hiện thêm một truy vấn cơ sở dữ liệu, khi bạn có thể dễ dàng kiểm tra thông báo lỗi

Bạn có thể kiểm tra SQLSTATE hoặc lỗi dành riêng cho nhà cung cấp. Đối với một mục trùng lặp trên một ràng buộc duy nhất, SQLSTATE là 23000, trong khi mã lỗi MySQL là 1062. Đây là một danh sách các lỗi. Để lấy SQLSTATE, bạn có thể sử dụng

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
05 hoặc
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
06; . Lưu ý, hành vi của
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
05 ngược lại với MySQLi, sẽ in mã lỗi dành riêng cho MySQL. Ngoài ra, không sử dụng
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
09 hoặc
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
40. Gắn bó với lớp PDOException, vì một số lý do, các phương thức lỗi của lớp PDO chỉ in ra 00000

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
4

Trong trường hợp bạn đang thắc mắc, bạn có thể tạo một ràng buộc duy nhất bằng cách thực hiện

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
6

Lựa chọn

Để tìm nạp kết quả trong PDO, bạn có tùy chọn

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
41 hoặc
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
42. Cái trước linh hoạt hơn, vì nó có thể được sử dụng để tìm nạp một hàng hoặc tất cả nếu được sử dụng trong một vòng lặp. Cái sau về cơ bản là đường cú pháp, vì nó cho phép tìm nạp toàn bộ kết quả của bạn được đặt trong một mảng bằng một lệnh đó. Bạn nên sử dụng
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
41 trong một vòng lặp nếu bạn đang sửa đổi mảng đó, vì nó giúp bạn không phải "lặp lại" nó. Bạn cũng có thể sử dụng
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
44 để thay đổi chế độ tìm nạp mặc định, thay vì chuyển nó sang
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
45 hoặc
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
46. Nhưng đây chỉ là một dòng bổ sung lãng phí và chỉ nên được thực hiện trong trường hợp cần thiết

Các chế độ tìm nạp trong PDO dễ dàng là khía cạnh yêu thích của tôi. Tôi sẽ trộn chúng vào các ví dụ của mình, nhưng đây là một số hằng số mà tôi thấy là hữu ích nhất

Ghi chú. một số chế độ tìm nạp này sử dụng toán tử bitwise, như. Trong trường hợp của PDO, về cơ bản bạn có thể coi nó là sự kết hợp các chế độ tìm nạp. Điều này được gọi là bao hàm hoặc và là toán tử bitwise duy nhất mà bạn cần quan tâm

Chế độ tìm nạp

Cả tìm nạp [] và tìm nạp Tất cả []

  • $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    47 - Tìm nạp một mảng số
  • $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    48 - Tìm nạp một mảng kết hợp
  • $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    49 - Chỉ tìm nạp một cột. Vô hướng nếu sử dụng
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    45; . Nếu
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    45, thì bạn có thể sử dụng
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    63 cho đường cú pháp để thay thế
  • $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    64 - Tìm nạp một đối tượng có tên lớp theo giá trị cơ sở dữ liệu. Nếu lớp không tồn tại, sẽ mặc định là stdClass

Chỉ cần tìm nạp []

  • $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    65 - Tìm nạp dưới dạng Đối tượng stdClass chung. Thay vào đó, bạn nên sử dụng đường cú pháp
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    66 vì nó cho phép bạn tìm nạp một lớp ẩn danh và được chỉ định. Bạn vẫn có thể sử dụng
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    67, nhưng bạn phải đặt nó bằng
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    68, sau đó là
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    45. Có thể được sử dụng với
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    46, nhưng không được ưu tiên vì nó kém linh hoạt hơn
  • set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    01 - Tìm nạp một tham chiếu PDORow có khả năng là một đối tượng, mảng kết hợp hoặc số. Hiệu quả về bộ nhớ, vì nó sẽ tìm nạp kết quả một cách nghiêm ngặt khi một đối tượng, chỉ mục kết hợp hoặc số được gọi
  • set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    02 - Tìm nạp vào một lớp hiện có. Phải sử dụng
    set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    03, tiếp theo là
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    45

Chỉ cần tìm nạp Tất cả []

  • $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    67 - Tìm nạp dưới dạng Đối tượng stdClass chung hoặc vào một lớp hiện có nếu được chỉ định; . Cũng có thể được sử dụng với
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    45, nhưng không được ưu tiên
  • set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    08 - Tìm nạp cặp khóa/giá trị với cột đầu tiên là khóa duy nhất và cột thứ hai là giá trị đơn
  • set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    09 - Giống như
    set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    08, chỉ có phần giá trị là mảng
  • set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    11 - Tìm nạp theo tên cột chung và nhóm tất cả các hàng vào khóa đó dưới dạng một mảng gồm các mảng kết hợp
  • set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    12 - Giống như
    set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    11, chỉ có phần giá trị là một mảng gồm các mảng số 1d
  • set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    14 - Giống như
    set_exception_handler[function[$e] {
      error_log[$e->getMessage[]];
      exit['Something weird happened']; //something a user can understand
    }];
    $dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
    $options = [
      PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
    ];
    $pdo = new PDO[$dsn, "username", "password", $options];
    
    11, nhưng thay vào đó là một mảng các mảng đối tượng

Tìm nạp mảng liên kết

Vì chúng tôi đặt loại tìm nạp mặc định là một mảng kết hợp, nên chúng tôi không chỉ định bất cứ điều gì khi tìm nạp kết quả

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
0

Ngoài ra còn có phiên bản vòng lặp while dài hơn một chút, đôi khi thuận tiện cho các thao tác

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
1

đầu ra

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
2

Tìm nạp mảng số

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
3

đầu ra

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
4

Tìm nạp mảng đối tượng

Tương tự như tìm nạp một mảng kết hợp, nhưng với các đối tượng, vì vậy bạn có thể truy cập nó như, chẳng hạn như

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
16

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
5

đầu ra

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
6

Bạn thậm chí có thể nối các giá trị thuộc tính vào một lớp đã tồn tại, như vậy

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
7

đầu ra

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
8

Hãy nhớ rằng điều này có hành vi không thể đoán trước khi đưa giá trị thuộc tính trước khi đặt nó vào hàm tạo [nếu bạn có]. Điều này có nghĩa là nếu bạn đã sử dụng một trong các tên biến trong hàm tạo, thì giá trị tìm nạp sẽ bị ghi đè bởi giá trị mặc định. hành vi này. Để đảm bảo các giá trị được chỉ định sau khi hàm tạo được gọi, bạn phải thực hiện ____

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
17

Một hành vi bất ngờ nhưng có khả năng hữu ích khác là bạn có thể sửa đổi các biến riêng tư. Tôi thực sự không chắc mình cảm thấy thế nào về điều này, vì điều này dường như vi phạm các nguyên tắc đóng gói

Tìm nạp một hàng

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
9

Bây giờ bạn truy cập từng biến, chẳng hạn như

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
18

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
40

Tìm nạp một hàng như MySQLi bind_result[]

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
41

Điều này là để bắt chước hành vi [chỉ có lợi] của

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
19 trong MySQLi, đó là có thể liên kết các giá trị với một tên biến. Bây giờ bạn có thể truy cập từng biến như vậy.
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
20

Tìm nạp vô hướng [Một giá trị]

Một trường hợp sử dụng phổ biến cho điều này là nếu bạn chỉ muốn lấy số lượng hàng và lưu trữ nó trong một biến. Có vấn đề với việc sử dụng

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
21 với giá trị boolean, vì không có cách nào để phân biệt giữa không có hàng và giá trị sai. Ví dụ sau sử dụng hàm MySQL
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
22, rõ ràng sẽ ổn nếu chỉ kiểm tra tính trung thực. Tuy nhiên, đối với mọi trường hợp khác, nếu bản thân cột là một giá trị boolean, chẳng hạn như 0, thì bạn phải sử dụng
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
23 hoặc
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
24 để kiểm tra xem có hàng nào không

Để rõ ràng, hành vi này không xảy ra khi bạn cần tìm nạp một mảng với

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
25. Tuy nhiên, nếu bạn sử dụng
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
21 trong một vòng lặp để lưu trữ các giá trị trong mảng của mình, thì hành vi không mong muốn này vẫn xảy ra. Thành thật mà nói, tôi không hiểu tại sao mọi người lại làm điều này khi sử dụng
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
25, nhưng cần lưu ý

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
42

Bây giờ

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
28 là giá trị bằng chữ của số lượng hàng

Tìm nạp nhiều cột dưới dạng biến mảng riêng biệt

Điều này có thể hữu ích vì bạn có thể dễ dàng tách nó thành một loạt các mảng 1D riêng biệt, thay vì chỉ một mảng đa chiều. Hãy nhớ rằng tôi đã sử dụng

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
00 để kiểm tra xem có bất kỳ hàng nào không. Hầu hết các trình điều khiển không có khả năng sử dụng các câu lệnh
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
00 trên
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
31, nhưng MySQL thì có. Nếu bạn đang sử dụng một trình điều khiển khác, bạn có thể sử dụng
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
32 trên mỗi biến mảng sau vòng lặp while hoặc khai báo từng biến thành một mảng trống

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
43

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
44

Tìm nạp một cột dưới dạng biến mảng

Khái niệm tương tự như ví dụ ngay trước đó, nhưng điều này rất hữu ích nếu tất cả những gì bạn cần làm là lấy một mảng chỉ có một cột

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
45

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
46

Tìm nạp cặp khóa/giá trị

Điều này tạo ra một mảng kết hợp với định dạng của cột đầu tiên là khóa và cột thứ hai là giá trị. Do đó, cột đầu tiên của bạn cần phải là một giá trị duy nhất

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
47

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
48

Tìm nạp mảng cặp khóa/giá trị

Vì thiếu một thuật ngữ tốt hơn rõ ràng. Điều tôi muốn nói ở đây là khóa sẽ là cột đầu tiên của bạn, cần phải là một giá trị duy nhất, trong khi giá trị sẽ là phần còn lại của các cột dưới dạng một mảng kết hợp

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
49

Tôi không chắc tại sao trên các tài liệu PHP nói rằng bạn phải bitwise nó và thêm

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
33, như vậy.
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
34. Nó có tác dụng tương tự từ các thử nghiệm của tôi

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
70

Tìm nạp theo nhóm

Giả sử bạn muốn nhóm theo màu mắt chẳng hạn. Chế độ tìm nạp tiện dụng này cho phép bạn thực hiện điều đó cực kỳ đơn giản

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
71

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
72

Tìm nạp theo nhóm, một cột

Sự khác biệt giữa ví dụ này và ví dụ trước về cơ bản là tình huống giống như

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
35 so với
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
36. Ví dụ trước nhóm cột đầu tiên với một mảng, trong khi ví dụ này nhóm cột đầu tiên với tất cả các giá trị từ cột thứ hai

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
73

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
74

Tìm nạp theo nhóm, mảng đối tượng

Tương tự như tìm nạp trong một nhóm thông thường, nhưng thay vào đó là các mảng con đối tượng

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
75

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
76

Bạn cũng có thể chỉ định một tên lớp

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
77

Tìm nạp vào lớp hiện có

Điều này gần giống với

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
67,
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
65 hoặc
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
66. Sự khác biệt duy nhất là điều này tìm nạp vào một lớp đã được xây dựng và vì lý do nào đó, nó sẽ không cho phép bạn sửa đổi các biến riêng tư. Cá nhân tôi không hiểu tại sao họ lại tạo một chế độ tìm nạp riêng cho việc này, thay vì cho phép bạn chuyển nó vào
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
45 với
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
65. Một khía cạnh khó chịu khác là PDO buộc bạn phải sử dụng
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
42, tiếp theo là ________ 345 [________ 346 sẽ cho bạn kết quả chính xác như vậy]

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
78

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
79

Tìm nạp lớp từ giá trị cơ sở dữ liệu

Đối với người bình thường, điều này có lẽ không quá hữu ích. Nhưng đối với những người dùng sử dụng nhiều ánh xạ đối tượng trong PDO, điều này thực sự khá tuyệt. Mặc dù những loại người dùng này muốn sử dụng ORM hoặc trình tạo truy vấn, tuy nhiên, nó vẫn cho thấy PDO mạnh mẽ như thế nào

Đối với công việc này, bạn cần khai báo tên các lớp của mình, nếu không, nó sẽ chỉ sử dụng stdClass. Vì vậy, bạn cần biết các giá trị của cơ sở dữ liệu của mình, điều này có thể gây bất tiện. Bạn cũng không được phép khai báo đối số tham số, giống như bạn làm với riêng

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
67

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
10

đầu ra

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
11

Tìm nạp đối tượng, mảng liên kết và số một cách lười biếng

Tôi chắc rằng nó nghe có vẻ khó hiểu, nhưng tôi không thể nghĩ ra cách nào tốt hơn để mô tả nó. Nó thực sự khá gọn gàng, vì bạn đang tìm nạp một đối tượng PDORow về cơ bản là một con trỏ tới tập kết quả. Nó hoàn toàn không tìm nạp bất cứ thứ gì, cho đến khi bạn sử dụng một mảng hoặc chỉ mục đối tượng [lười biếng]. Phần tuyệt vời nhất của quá trình triển khai là một khi bạn "tìm nạp" nó, bạn có tùy chọn sử dụng nó như một đối tượng, mảng kết hợp hoặc mảng số theo cách tiết kiệm bộ nhớ nhất có thể. Cần lưu ý rằng nếu chỉ mục nằm ngoài giới hạn, nó sẽ trả về null thay vì đưa ra lỗi

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
12

Thích

Bạn có thể trực giác cố gắng làm điều gì đó như sau

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
13

Tuy nhiên, điều này sẽ không làm việc. Đây là cách bạn sẽ làm đúng cách

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
14

Ở đâu trong mảng

Như bạn có thể thấy, PDO rõ ràng cũng vượt trội về điều này, vì mã ngắn hơn nhiều, do không cần chỉ định loại với

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
5 hoặc
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
4

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
15

Với các trình giữ chỗ khác

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
16

Nhiều báo cáo đã chuẩn bị trong giao dịch

Nếu bạn muốn đảm bảo rằng nhiều lệnh gọi SQL đồng thời, thì bạn phải sử dụng các giao dịch. Điều này đảm bảo rằng tất cả các hoạt động của bạn hoặc không có hoạt động nào sẽ thành công. Chẳng hạn, điều này có thể hữu ích để chuyển một hàng sang một bảng khác. Bạn sẽ muốn sao chép hàng sang bảng mới và xóa hàng khác. Nếu một trong các hoạt động không thành công, thì nó cần phải hoàn nguyên về trạng thái trước đó

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
17

Sử dụng lại cùng một mẫu, các giá trị khác nhau

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
18

Xử lý lỗi

Để ngăn rò rỉ mật khẩu của bạn, đây là những gì php của bạn. ini sẽ giống như trong sản xuất. làm cả

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
9 và
$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
0. Sau đó khởi động lại Apache hoặc Nginx

Nếu bạn đã bật lỗi và buộc chúng là ngoại lệ, giống như cách dễ nhất để xử lý lỗi của bạn là đặt chúng vào khối thử/bắt. Bây giờ bạn có quyền truy cập vào lớp PDOException

Người mới bắt đầu có thể cho rằng việc xử lý lỗi thích hợp đòi hỏi phải gói mỗi khối truy vấn trong một khối

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
8 riêng biệt, tương tự như xử lý lỗi thông thường với câu lệnh
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
51. Mặc dù không có gì sai về mặt kỹ thuật khi làm điều đó, nhưng sẽ trông thanh lịch hơn rất nhiều khi sử dụng một
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
8 duy nhất, toàn cầu bằng cách sử dụng lớp cơ sở
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
53 hoặc sử dụng
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
54. Ngoại lệ duy nhất cho điều này là với các giao dịch, lẽ ra phải có một giao dịch riêng biệt, nhưng sau đó ném ngoại lệ đó vào
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
8 toàn cầu

Tất cả các trang của bạn — ngay cả những trang không có PDO — nên được thiết lập như thế này, vì bạn thường chỉ cần đưa ra một thông báo cho toàn bộ trang php. Tuy nhiên, đôi khi bạn có thể cần nắm bắt các trường hợp cụ thể, vì vậy bạn có thể sử dụng bao nhiêu loại ngoại lệ cụ thể tùy thích, cùng với

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
56

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
19

Một cách khác để xử lý các ngoại lệ là tạo một trình xử lý ngoại lệ do người dùng định nghĩa,. Bạn sẽ thêm phần sau vào mỗi trang sau khi bao gồm

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
7. Bằng cách này, bạn có thể bỏ qua
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
8 trên hầu hết tất cả các truy vấn của mình ngoại trừ các giao dịch, mà bạn sẽ đưa ra một ngoại lệ sau khi
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
59ing nếu xảy ra sự cố

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
0

Tại sao phải kiểm tra tính trung thực?

Bạn có thể nhận thấy rằng tôi đang đưa ra một ngoại lệ để thực thi nếu nó quá nhanh, điều này có vẻ dư thừa, vì việc xử lý lỗi ở dạng ngoại lệ. Tuy nhiên, tôi nhận thấy một hành vi kỳ lạ, đó là

$stmt = $pdo->prepare["UPDATE myTable SET name = ? WHERE id = ?"];
$stmt->execute[[$_POST['name'], $_SESSION['id']]];
echo $stmt->rowCount[];
$stmt = null;
9 chỉ có thể trả về false trong một số trường hợp nếu chế độ giả lập bị tắt, đây là chế độ duy nhất mà hướng dẫn này đang thảo luận. Nó có thể là cụ thể của MySQL, nhưng tôi sẽ để nó ở đây vì cá nhân tôi đã trải nghiệm điều này khi có quá nhiều tham số bị ràng buộc để thực thi. Nó sẽ đơn giản trả về false và hoạt động như thể không có gì sai. Điều này sẽ tạo ra hành vi đặc biệt không mong muốn trong các giao dịch, vì một truy vấn sẽ âm thầm thất bại, trong khi những truy vấn khác sẽ hoạt động, do đó làm mất đi mục đích tuyến tính hóa của nó. Đây là lý do tại sao bạn phải kiểm tra tính trung thực trong trường hợp điều này xảy ra. Tôi thực sự không thể tìm thấy quá nhiều thông tin về nó, nhưng StackOverflow này mô tả vấn đề khá tốt. Thật kỳ lạ, nếu bạn không liên kết đủ các biến, nó sẽ đưa ra một ngoại lệ chính xác

Tôi có cần $stmt = null không?

Điều này về cơ bản giống như sử dụng

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
61 trong MySQLi và áp dụng tương tự. Không, nó chắc chắn là không bắt buộc, nhưng được một số người [rõ ràng là chủ quan] coi là thực hành mã hóa tốt. Tôi muốn rõ ràng hơn và tôi cũng làm cả
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
62 và
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
63. Nếu bạn đang đóng kết nối PDO, thì bạn cũng phải đóng các câu lệnh đã chuẩn bị,. Mặc dù điều này không hoàn toàn giống với việc sử dụng
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
64, nhưng nó khá giống. Chức năng PDO để đóng kết nối là thứ đã được yêu cầu trong nhiều năm và không rõ liệu nó có bao giờ được triển khai hay không

Việc đóng các câu lệnh đã chuẩn bị sẽ hữu ích nếu bạn đang sử dụng lại cùng một tên biến. Cả hai đều không thực sự cần thiết, vì dù sao thì chúng cũng sẽ đóng khi kết thúc quá trình thực thi tập lệnh

Chế độ thi đua vs. Tuyên bố chuẩn bị bản địa

Khi sử dụng câu lệnh đã chuẩn bị, bạn có hai tùy chọn. bật hoặc tắt chế độ mô phỏng. Bài viết này đề cập nghiêm ngặt đến các câu lệnh chuẩn bị sẵn, vì tôi tin rằng bạn nên sử dụng các câu lệnh chuẩn bị thực sự nếu phiên bản trình điều khiển của bạn hỗ trợ nó. Chế độ mô phỏng có vẻ giống như một giải pháp dự phòng cho các trình điều khiển/phiên bản không hỗ trợ các câu lệnh chuẩn bị sẵn;

Khi chế độ mô phỏng được bật, về cơ bản nó giống như sử dụng

set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
65 hoặc truyền kiểu để định dạng truy vấn của bạn theo cách thủ công — chế độ này sẽ tự động luôn thực hiện việc này một cách an toàn. Mặc dù về mặt lý thuyết, điều này vẫn an toàn như vậy bằng cách sử dụng MySQL 5. 5+ và đặt bộ ký tự thành utf8mb4 khi bạn tạo kết nối, tôi vẫn khuyên bạn nên sử dụng các câu lệnh chuẩn bị sẵn. Kiểm tra bài viết tuyệt vời này về một cuộc tấn công trường hợp khó hiểu

Mặc dù chúng ta đang nói về các mối đe dọa lý thuyết, nhưng các câu lệnh được chuẩn bị sẵn không mô phỏng sẽ loại bỏ hoàn toàn khả năng xảy ra một cuộc tấn công SQL injection. Truy vấn với trình giữ chỗ giả được gửi đến máy chủ trước, sau đó là các giá trị để liên kết — truy vấn và dữ liệu được cách ly hoàn toàn

Dưới đây là một số khác biệt chính giữa hai

Chế độ thi đua

  • Có thể sử dụng lại các trình giữ chỗ có tên
  • Cho phép hỗ trợ nhiều truy vấn
  • Cần sử dụng
    $stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
    $stmt->execute[[$_SESSION['id']]];
    $stmt = null;
    
    5 cho một số trường hợp cạnh nhất định, như với GIỚI HẠN
  • Nhanh hơn cho một câu lệnh, nhưng không thể chạy chuẩn bị một lần, thực hiện nhiều lần
  • Chi phí n chuyến khứ hồi máy khách-máy chủ cho mỗi câu lệnh
  • Báo lỗi khi câu lệnh được thực thi

Tuyên bố chuẩn bị bản địa

  • Có thể chạy chuẩn bị một lần, thực hiện nhiều lần để đạt hiệu quả
  • Chi phí 1+n chuyến khứ hồi máy khách-máy chủ cho mỗi câu lệnh
  • Chỉ có thể sử dụng mỗi trình giữ chỗ được đặt tên một lần
  • Không thể chạy nhiều truy vấn [mặc dù bạn có thể sử dụng giao dịch]
  • Về lý thuyết, an toàn hơn do truy vấn và giá trị bị cô lập
  • Báo cáo lỗi khi tuyên bố được chuẩn bị

Đây là một ví dụ về cách bạn sẽ sử dụng GIỚI HẠN khi bật chế độ mô phỏng. Lý do nó xảy ra là vì MySQL cuối cùng đã hiểu nó là GIỚI HẠN '23'. Vì vậy, bạn có thể sử dụng các câu lệnh chuẩn bị sẵn hoặc sử dụng

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
5 để xác định rõ ràng nó là một int

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
1

bindValue[] so với. bindParam[]

Hướng dẫn này không thực sự đi quá nhiều, vì bạn không thực sự cần những thứ này, ngoại trừ trong các trường hợp cấp bách khi bạn cần thực thi kiểu dữ liệu. Tuy nhiên, bạn nên hiểu sự khác biệt, vì bạn không bao giờ biết khi nào bạn có thể gặp phải tình huống mà nó có thể hữu ích

Cả hai phương pháp đều được sử dụng để liên kết thủ công với câu lệnh đã chuẩn bị. Sự khác biệt là

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
5 linh hoạt hơn, vì bạn có thể liên kết các biến và giá trị, trong khi
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
4 chỉ có thể chấp nhận các biến. Do đó,
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
4 giống hệt với
set_exception_handler[function[$e] {
  error_log[$e->getMessage[]];
  exit['Something weird happened']; //something a user can understand
}];
$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
$pdo = new PDO[$dsn, "username", "password", $options];
71 trong MySQLi. Vậy tại sao phương pháp này thậm chí còn tồn tại, nếu nó chỉ có nhược điểm?

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
2

Với

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
4, bạn có thể liên tục thay đổi biến và thực hiện lại. Đây không phải là trường hợp của
$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
5, vì bạn sẽ cần gọi lại phương thức. Tôi nghi ngờ mình sẽ cần cái này, nhưng thật tuyệt khi có tùy chọn. Lý do nó hoạt động như thế này là hiển nhiên nếu bạn xem qua các tài liệu, vì nó là một đối số hàm tham chiếu.

$stmt = $pdo->prepare["DELETE FROM myTable WHERE id = ?"];
$stmt->execute[[$_SESSION['id']]];
$stmt = null;
3

Vì vậy, sử dụng báo cáo đã chuẩn bị có nghĩa là tôi an toàn trước những kẻ tấn công?

Mặc dù bạn an toàn trước SQL injection, nhưng bạn vẫn cần xác thực và làm sạch dữ liệu do người dùng nhập của mình. Bạn có thể sử dụng một chức năng như filter_var[] để xác thực trước khi chèn nó vào cơ sở dữ liệu và htmlspecialchars[] để khử trùng sau khi truy xuất nó

Làm cách nào để truy xuất dữ liệu từ cơ sở dữ liệu bằng PDO?

Làm theo các bước để lấy dữ liệu từ Cơ sở dữ liệu trong PHP PDO. .
Tạo nên cơ sở dữ liệu. Tạo cơ sở dữ liệu bằng XAMPP, cơ sở dữ liệu được đặt tên là “geeksforgeeks” tại đây. .
Tạo bảng. Tạo bảng có tên “fetch_record” gồm 2 cột để lưu trữ dữ liệu. .
Tạo cấu trúc bảng. Bảng “fetch_record” chứa 2 trường

Truy vấn PDO là gì?

PDO [Đối tượng dữ liệu PHP] là lớp trừu tượng cho các truy vấn cơ sở dữ liệu của bạn và là một giải pháp thay thế tuyệt vời cho MySQLi, vì nó hỗ trợ 12 . Đây là một lợi ích to lớn cho những người và công ty cần nó. Tuy nhiên, hãy nhớ rằng MySQL là cơ sở dữ liệu phổ biến nhất cho đến nay.

Chức năng nào của đối tượng PDO chạy truy vấn?

Mô tả ¶ PDO. query[] chuẩn bị và thực thi một câu lệnh SQL trong một lệnh gọi hàm duy nhất, trả về câu lệnh dưới dạng đối tượng PDOStatement.

Thực thi trong PDO là gì?

PDO. exec[] thực thi một câu lệnh SQL trong một lần gọi hàm duy nhất, trả về số hàng bị ảnh hưởng bởi câu lệnh . PDO. exec[] không trả về kết quả từ câu lệnh SELECT. Đối với câu lệnh CHỌN mà bạn chỉ cần đưa ra một lần trong chương trình của mình, hãy cân nhắc đưa ra PDO. truy vấn[].

Chủ Đề