Php fetchall trả về cái gì?

Giống như đã nói trong bài viết chính, các chế độ tìm nạp PDO (cùng với các câu lệnh được chuẩn bị sẵn có thể sử dụng được) là một thứ khiến PDO trở thành một trình bao bọc, chứ không phải là một API cơ sở dữ liệu (mặc dù phổ biến) khác. Các chế độ này có thể giảm đáng kể số lượng mã cho các hoạt động thông thường, vì chúng cho phép bạn lấy dữ liệu ở định dạng phù hợp ngay từ truy vấn

Mặc dù các hằng số trong câu hỏi được mô tả một phần trên các trang thủ công cho các phương thức tìm nạp() và tìm nạp ALL(), danh sách đầy đủ chỉ có thể được tìm thấy trên trang có tất cả các hằng số PDO, nơi chúng chỉ nằm rải rác giữa các hằng số khác với các mô tả hầu như không vượt quá một . Nó có vẻ không quá thuận tiện và rất có thể đó là lý do tại sao một số chế độ thú vị lại không được khán giả PHP nói chung chú ý. Tôi quyết định loại bỏ các chế độ tìm nạp ra khỏi danh sách toàn cầu và chia chúng thành nhiều loại để thuận tiện, vì tổng số chế độ tìm nạp PDO lên tới con số kha khá là 23

Hơn nữa, một số chế độ có thể được kết hợp với nhau, tăng số lượng định dạng trả lại có thể có ngay cả khi chỉ. Tuy nhiên, người ta phải nhớ rằng không phải tất cả các giá trị của hằng số đều là lũy thừa của 2 và do đó, một số hằng số không thể được kết hợp. Ví dụ:

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
4 có giá trị hơi bất ngờ là 10 (tương đương với tổ hợp
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
5 - mặc dù bản thân nó khá vô dụng)

Chế độ cổ điển

Để bắt đầu, hãy liệt kê các chế độ giống với hành vi của các hàm mysql tốt cũ

PDO. FETCH_BOTH

Một đối tác cho

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
6. Hàng được trả về ở dạng mảng, trong đó dữ liệu được sao chép, được truy cập thông qua cả chỉ mục số và chỉ mục kết hợp. Chế độ này được thiết lập mặc định

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_BOTH);
/*
array (
  'id' => '104',
  0 => '104',
  'name' => 'John',
  1 => 'John',
  'sex' => 'male',
  2 => 'male',
  'car' => 'Toyota',
  3 => 'Toyota',
)*/

PDO. FETCH_NUM

Một người bạn cũ một lần nữa, một đối tác

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
7, chỉ số chỉ số

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/

PDO. FETCH_ASSOC

Điều tương tự, nhưng đối với

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
8 - chỉ các chỉ số kết hợp. Xem thêm

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

PDO. FETCH_OBJ

như

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
9 nhưng không cung cấp tên lớp. không có tên lớp được cung cấp. Trả về phiên bản
$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
0

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/

Lưu ý rằng PDO không ngớ ngẩn với việc trả lại các đối tượng.

PDO. FETCH_LAZY

Hằng số này đáng chú ý đến mức tôi quyết định dành cả một phần cho nó. Đối với người mới bắt đầu, giá trị được trả về là một thể hiện của lớp đặc biệt

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
1 và đối tượng này mang rất nhiều tính năng đặc biệt

  • Đầu tiên, biến này không chứa bất kỳ dữ liệu hàng nào mà chỉ trả về dữ liệu đó theo yêu cầu (vì vậy cái tên gợi ý)
  • Thay vào đó, nó chứa một biến bí ẩn có tên là

    $lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
    /*
    object(PDORow)#3 (2) {
      ["queryString"] => string(22) "SELECT name FROM users"
      ["name"]        => string(4) "John"
    }*/
    2 mà truy vấn SQL được gán. (Điều này nhắc nhở chúng ta về lớp PDOStatement)

    $lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
    /*
    object(PDORow)#3 (2) {
      ["queryString"] => string(22) "SELECT name FROM users"
      ["name"]        => string(4) "John"
    }*/

    Đối với những người tò mò - vâng, bạn có thể ghi đè lên nó. )

  • Thứ ba, bạn không thể lưu trữ đối tượng này trong một phiên (hay nói cách khác, đối tượng này không thể tuần tự hóa được)
  • Thứ tư, bạn có thể lấy dữ liệu theo bất kỳ cách nào - bằng cách sử dụng chỉ mục số, chỉ mục kết hợp hoặc thông qua thuộc tính đối tượng
  • Thứ năm, gọi một chỉ mục/thuộc tính không xác định không gây ra lỗi "Chỉ mục/thuộc tính không xác định". Giá trị
    $lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
    /*
    object(PDORow)#3 (2) {
      ["queryString"] => string(22) "SELECT name FROM users"
      ["name"]        => string(4) "John"
    }*/
    3 được trả về âm thầm
  • Thứ sáu, biến này đang thay đổi trạng thái của nó sau các cuộc gọi
    $lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
    /*
    object(PDORow)#3 (2) {
      ["queryString"] => string(22) "SELECT name FROM users"
      ["name"]        => string(4) "John"
    }*/
    4 do đó
  • Thứ bảy, hằng số này không thể được sử dụng với
    $lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
    /*
    object(PDORow)#3 (2) {
      ["queryString"] => string(22) "SELECT name FROM users"
      ["name"]        => string(4) "John"
    }*/
    5, mà chỉ với
    $lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
    /*
    object(PDORow)#3 (2) {
      ["queryString"] => string(22) "SELECT name FROM users"
      ["name"]        => string(4) "John"
    }*/
    4

Hãy làm một số bài kiểm tra. Chúng tôi sẽ cố gắng yêu cầu một lượng dữ liệu đáng kể và xem mức tiêu thụ bộ nhớ, xác minh một vài điều trên đường đi

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
8

đầu ra

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
9

Như bạn có thể thấy, mã này đang tìm nạp tất cả các bản ghi từ bảng người dùng, thêm một cột có kích thước 1Mb. Lần tìm nạp đầu tiên được thực hiện với

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
7 và có thể thấy rằng nó không thay đổi dung lượng bộ nhớ đã tiêu thụ (lưu ý rằng hành vi này có thể thay đổi tùy thuộc vào ). Sau đó, chúng tôi đang tìm nạp một hàng khác, sử dụng một trong các phương pháp thông thường và xem mức tiêu thụ bộ nhớ ngay lập tức tăng lên. Nên việc tiết kiệm bộ nhớ là điều hiển nhiên. Ngoài ra, chúng tôi đã quan sát thấy sự vắng mặt của lỗi "Biến không xác định" và trạng thái thay đổi sau cuộc gọi
$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
4 do đó

Từ đó, chúng ta có thể kết luận rằng đối tượng

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
1 chỉ là một liên kết đến tập kết quả. Không có trạng thái riêng, nó chỉ đọc dữ liệu từ vị trí con trỏ hiện tại. Với tất cả những điều đó, khá ngạc nhiên khi thấy chế độ này hiếm khi được sử dụng

Các chế độ hữu ích nhất

Ở đây tôi quyết định liệt kê các chế độ hữu ích nhất, trả về dữ liệu ở các định dạng được yêu cầu nhiều nhất. Tất cả các chế độ này chỉ có ý nghĩa với

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
5

Lưu ý rằng bạn luôn có thể kết hợp một số chế độ tìm nạp để thay đổi định dạng kết quả. Tất cả các ví dụ bên dưới được đưa ra với

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
81 được đặt làm định dạng tìm nạp mặc định

PDO. FETCH_COLUMN

Thường rất thuận tiện để lấy mảng một chiều đơn giản ra khỏi truy vấn, nếu chỉ một cột trong số nhiều hàng được tìm nạp. của bạn đây

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
5

PDO. FETCH_KEY_PAIR

Cũng là định dạng cực kỳ hữu ích, khi chúng ta cần lấy cột giống như trên, nhưng đánh chỉ mục không phải theo số thứ tự mà theo một trường duy nhất

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
6

Định dạng khóa-giá trị được trả về là tuyệt vời cho từ điển như dữ liệu hoặc đơn giản cho các giá trị được lập chỉ mục, như bên dưới

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
7

Lưu ý rằng bạn chỉ phải chọn hai cột cho chế độ này, cột đầu tiên phải là duy nhất

PDO. FETCH_UNIQUE

Tương tự như trên, nhưng không nhận được một cột mà là hàng đầy đủ, chưa được lập chỉ mục bởi một trường duy nhất

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
0

ở đây bạn lấy mảng dữ liệu được lập chỉ mục theo id (Lưu ý rằng cột đầu tiên được chọn phải là duy nhất. Trong truy vấn này, giả định rằng cột đầu tiên là id, nhưng để chắc chắn hơn, hãy liệt kê nó một cách rõ ràng). Hoặc bạn cũng có thể sử dụng bất kỳ trường duy nhất nào khác

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
1

PDO. FETCH_GROUP

Chế độ này nhóm các hàng được trả về thành một mảng lồng nhau, trong đó các chỉ mục sẽ là các giá trị duy nhất từ ​​cột đầu tiên và các giá trị sẽ là các mảng tương tự như các mảng được trả về bởi

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
5 thông thường. Ví dụ, đoạn mã sau sẽ tách nam khỏi nữ và đặt chúng vào các mảng khác nhau

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
2

Vì vậy, đây là giải pháp lý tưởng cho nhu cầu phổ biến như "nhóm sự kiện theo ngày" hoặc "nhóm hàng hóa theo danh mục"

Chế độ này có thể được kết hợp với

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
83

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
3

Một gợi ý. trong trường hợp bạn cần chọn tất cả các trường, nhưng không nhóm theo trường đầu tiên, ý tưởng đầu tiên mà các bào tử trong tâm trí sẽ không hoạt động

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
4

sẽ trả về một lỗi. Để tránh điều đó, chỉ cần thêm dấu hoa thị vào tên bảng

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
5

bây giờ nó hoạt động như một sự quyến rũ

OOP

Tất nhiên, khả năng điều khiển các đối tượng của PDO không bị giới hạn trong việc trả về một phiên bản

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
84 ngớ ngẩn. Trong phần sau chúng ta sẽ tìm hiểu cả đống chế độ tìm nạp hướng đối tượng

PDO. FETCH_CLASS

Nền tảng của thao tác đối tượng trong PDO. Tạo một thể hiện của một lớp có tên đã cho, ánh xạ các cột được trả về tới các thuộc tính của lớp. Chế độ này có thể được sử dụng để lấy một hàng hoặc một mảng các hàng từ cơ sở dữ liệu. Với

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
5, cách tiếp cận khá quen thuộc

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
6

sẽ cung cấp cho bạn một mảng bao gồm các đối tượng của lớp Người dùng, với các thuộc tính được điền từ dữ liệu trả về

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
7

Trong khi để có được một hàng, bạn có hai tùy chọn. Tuy nhiên, mặc dù bạn có thể sử dụng phương pháp

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
4 quen thuộc, như hình bên dưới

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
8

nên sử dụng phương pháp

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
87 chuyên dụng

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_NUM);
/*
array (
  0 => '104',
  1 => 'John',
  2 => 'male',
  3 => 'Toyota',
)*/
9

vì có một số vấn đề khi sử dụng

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
4 để lấy một đối tượng

  • bạn không thể truyền tham số hàm tạo cho đối tượng mới được tạo
  • nếu không có lớp nào được định nghĩa với tên như vậy, một mảng sẽ được trả về một cách âm thầm, trong khi với
    $user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
    /*
    stdClass::__set_state(array(
       'id' => '104',
       'name' => 'John',
       'sex' => 'male',
       'car' => 'Toyota',
    ))*/
    87, một lỗi sẽ được đưa ra
  • rõ ràng, phương thức chuyên dụng cần ít mã hơn để viết

Bất kể bạn chọn phương thức nào, tất cả các cột được trả về sẽ được gán cho các thuộc tính của lớp tương ứng theo các quy tắc sau

  • nếu có thuộc tính lớp mà tên trùng với tên cột thì giá trị cột sẽ được gán cho thuộc tính này
  • nếu không có thuộc tính như vậy, thì một phương thức
    $user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
    /*
    stdClass::__set_state(array(
       'id' => '104',
       'name' => 'John',
       'sex' => 'male',
       'car' => 'Toyota',
    ))*/
    90 ma thuật sẽ được gọi
  • nếu phương thức
    $user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
    /*
    stdClass::__set_state(array(
       'id' => '104',
       'name' => 'John',
       'sex' => 'male',
       'car' => 'Toyota',
    ))*/
    90 không được xác định cho lớp, thì một thuộc tính công khai sẽ được tạo và một giá trị cột được gán cho nó

Ví dụ, mã này

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

0

sẽ cung cấp cho bạn một đối tượng với tất cả các thuộc tính được gán tự động, bất kể chúng có tồn tại trong lớp hay không

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

1

Từ đó, bạn có thể biết rằng để tránh việc tạo thuộc tính tự động, bạn cần sử dụng phương pháp

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
90 ma thuật để lọc các thuộc tính ra. Kỹ thuật lọc đơn giản nhất sẽ chỉ là thêm một phương thức
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
90 trống vào đối tượng của bạn. Với nó, chỉ các thuộc tính hiện có sẽ được đặt

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

2

Như bạn có thể thấy, trong chế độ này, PDO cũng có thể gán giá trị cho các thuộc tính riêng tư. Điều hơi bất ngờ nhưng cực kỳ hữu ích

Tất nhiên, đối với các lớp mới được tạo, chúng tôi có thể muốn cung cấp các tham số hàm tạo. Vì vậy, hãy thêm chúng vào các ví dụ trên

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

3

sẽ cho bạn

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

4

Như bạn có thể thấy, trong chế độ này, PDO gán các thuộc tính của lớp trước khi gọi hàm tạo. Để sửa đổi hành vi này, hãy sử dụng cờ sau

PDO. FETCH_PROPS_LATE

Không phải là chế độ tìm nạp mà là cờ sửa đổi. Như đã lưu ý ở trên, theo mặc định, PDO gán các thuộc tính của lớp trước khi gọi hàm tạo. Hành vi này có thể được thay đổi bằng cờ này

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

5

Như bạn có thể thấy, một giá trị được gán trong hàm tạo đã bị ghi đè

PDO. FETCH_CLASSTYPE

Thêm một cờ sửa đổi cho PDO lấy tên lớp từ giá trị của cột đầu tiên. Với lá cờ này, người ta có thể tránh sử dụng

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
94 với
$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
4

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

6

Ngoài ra, như đối với bài viết chính, chế độ này có thể hữu ích nếu các đối tượng thuộc các lớp khác nhau có thể được tạo từ cùng một truy vấn

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

7

PDO. FETCH_INTO

Không giống như

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
96, không tạo đối tượng mới mà cập nhật đối tượng hiện có. Chỉ hoạt động với
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
94, biến hiện có làm tham số. Rõ ràng, vô ích với
$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
5

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

8

Như bạn có thể thấy, cuộc gọi

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
4 đang trả về cùng một đối tượng, điều này có vẻ dư thừa đối với tôi. Cũng lưu ý rằng không giống như
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
96, chế độ này không gán thuộc tính riêng tư

PDO. FETCH_SERIALIZE

Thêm một lá cờ cho

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
96. Bị cáo buộc nên trả lại một đối tượng đã được đăng theo thứ tự và được lưu trữ trong cơ sở dữ liệu. Hiện tại không hoạt động

Dự định làm một cái gì đó như

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_ASSOC);

/*
array (
  'id' => '104',
  'name' => 'John',
  'sex' => 'male',
  'car' => 'Toyota',
)*/

9

Nhưng đối tượng được trả về từ cơ sở dữ liệu không giống như trước khi tuần tự hóa. Và do đó unserialize thất bại. Sau khi nghịch chế độ này với một người bạn, chúng tôi đã gửi một lỗi, nhưng dường như không có gì thay đổi kể từ đó

Dù bằng cách nào, cờ này trông khá vô dụng, vì người ta luôn có thể hủy đánh dấu thủ công

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
0

Điều khoản khác

PDO. FETCH_FUNC

Đối với những người yêu thích đóng cửa. Chỉ hoạt động với

$lazy = $pdo->query("SELECT name FROM users")->fetch(PDO::FETCH_LAZY);
/*
object(PDORow)#3 (2) {
  ["queryString"] => string(22) "SELECT name FROM users"
  ["name"]        => string(4) "John"
}*/
5. Không thuận tiện lắm vì bạn nên liệt kê các tham số cho mọi cột được trả về theo cách thủ công. Ví dụ: trình giả lập
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
83

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
1

PDO. FETCH_NAMED

Gần như chính xác như

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
81, nhưng có một chút khác biệt. Nhiều lần tôi đã gặp một câu hỏi, liệu có thể phân biệt các trường khác nhau có cùng tên được trả về bởi cùng một truy vấn hay không. Với câu trả lời duy nhất là sử dụng bí danh trong SQL hoặc chỉ số số thay vì liên kết. Tuy nhiên, PDO cung cấp một cách khác. Nếu chế độ này được sử dụng, các giá trị trả về được gán giống như với
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
81, nhưng nếu có một vài cột có cùng tên trong tập kết quả, tất cả các giá trị sẽ được lưu trữ trong mảng lồng nhau. Ví dụ: hãy thử chọn từ
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
56 và
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
57, trong khi cả hai bảng đều có cột
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
58. Sử dụng
$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
81, chúng tôi sẽ mất một trong những tên

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
2

Trong khi nếu sử dụng

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
60 thay thế, mọi thứ sẽ được giữ nguyên

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
3

Tôi nghi ngờ liệu tính năng này có hữu ích hay không, nhưng ít nhất nó cũng cho bạn một sự lựa chọn

PDO. FETCH_BOUND

Một chế độ thú vị, về cơ bản khác với những chế độ khác. Bản thân nó không trả về bất kỳ dữ liệu nào, nhưng làm cho PDO gán giá trị cho các biến đã được ràng buộc trước đó bằng cách sử dụng

$user = $pdo->query("SELECT * from users LIMIT 1")->fetch(PDO::FETCH_OBJ);
/*
stdClass::__set_state(array(
   'id' => '104',
   'name' => 'John',
   'sex' => 'male',
   'car' => 'Toyota',
))*/
61 - hành vi có thể quen thuộc với người dùng mysqli.

Làm cách nào để sử dụng tìm nạp tất cả trong PHP?

Sử dụng phương thức PHP fetchAll() với phương thức query() . Đầu tiên, thực hiện truy vấn bằng cách gọi phương thức query() của đối tượng PDO. Sau đó, tìm nạp tất cả các hàng từ tập hợp kết quả vào một mảng bằng phương thức fetchAll().

Sự khác biệt giữa tìm nạp và tìm nạp Tất cả là gì?

nếu bạn muốn tất cả các bản ghi. để tìm nạp, bạn sẽ cần lặp lại như vậy while($row = $stmt->fetch()) { # làm việc với bản ghi } đối với fetchAll() bạn có quyền truy cập trực tiếp vào các bản ghi dưới dạng một mảng.

Tìm nạp trong PHP là gì?

Tìm nạp dữ liệu từ tập hợp kết quả bằng cách gọi một trong các phương thức tìm nạp sau. Để trả về một hàng từ tập kết quả dưới dạng một mảng hoặc đối tượng, hãy gọi PDOStatement. phương thức tìm nạp . Để trả về tất cả các hàng từ tập kết quả dưới dạng một mảng các mảng hoặc đối tượng, hãy gọi PDOStatement. phương pháp tìm nạp tất cả.

Làm cách nào để tìm nạp dữ liệu từ cơ sở dữ liệu bằng PDO trong PHP?

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