Hướng dẫn file_get_contents php input

- Hàm file_get_contents[] dùng để lấy nội dung của một tập tin.

- Cú pháp:

file_get_contents[đường dẫn đến tập tin mà bạn muốn lấy nội dung]

- Tôi có một tập tin myCode_01.html nằm ở đường dẫn //webcoban.vn/file/myCode_01.html với nội dung như sau:


    
        Lap Trinh Web
    
    
        

Tai lieu huong dan hoc Lap Trinh Web

HTML & CSS

Ngon ngu lap trinh PHP

- Để lấy nội dung của tập tin myCode_01.html thì tôi sử dụng đoạn mã sau:

- Khi đó, biến $text sẽ có giá trị là chuỗi:


    
        Lap Trinh Web
    
    
        

Tai lieu huong dan hoc Lap Trinh Web

HTML & CSS

Ngon ngu lap trinh PHP

- Ví dụ phía trên là chúng ta lấy toàn bộ nội dung của tập tin, để lấy một phần nội dung của tập tin thì chúng ta sử dụng cú pháp như sau:

file_get_contents[đường dẫn đến tập tin mà bạn muốn lấy nội dung, 0, NULL, start, length]

- Trong đó:

Tham sốYêu cầuMô tả
start Không bắt buộc

- Chỉ định vị trí mà bạn muốn bắt đầu lấy.

length Không bắt buộc

- Chỉ định số lượng byte mà bạn muốn lấy.

- Biến $text sẽ có giá trị là chuỗi:

- Biến $text sẽ có giá trị là chuỗi:


    
        Lap Trin

- Biến $text sẽ có giá trị là chuỗi:

ml>
    
        Lap Trin

Đầu tiên, một sự thật cơ bản về PHP.

PHP không được thiết kế để cung cấp cho bạn một giao diện REST thuần túy [GET, POST, PUT, PATCH, DELETE] giống như giao diện để xử lý các yêu cầu HTTP .

Tuy nhiên, $_SERVER, $_COOKIE, $_POST, $_GET, và $_FILES superglobals , và các chức năng filter_input_array[]rất hữu ích cho nhu cầu người bình thường của / layman.

Lợi thế ẩn số một của $_POST[và $_GET] là dữ liệu đầu vào của bạn được PHP giải mã url tự động . Bạn thậm chí không bao giờ nghĩ đến việc phải làm điều đó, đặc biệt là đối với các tham số chuỗi truy vấn trong một GETyêu cầu tiêu chuẩn hoặc dữ liệu nội dung HTTP được gửi cùng với một POSTyêu cầu.

Các phương thức yêu cầu HTTP khác

Những người nghiên cứu giao thức HTTP cơ bản và các phương thức yêu cầu khác nhau của nó hiểu rằng có nhiều phương thức yêu cầu HTTP, bao gồm cả phương thức thường được tham chiếu PUT, PATCH[không được sử dụng trong Apigee của Google] và DELETE.

Trong PHP, không có superglobals hoặc chức năng lọc đầu vào để nhận dữ liệu nội dung yêu cầu HTTP khi POSTkhông được sử dụng. Các đệ tử của Roy Fielding phải làm gì? ;-]

Tuy nhiên, sau đó bạn tìm hiểu thêm ...

Điều đó đang được nói, khi bạn nâng cao kiến ​​thức lập trình PHP của mình và muốn sử dụng XmlHttpRequestđối tượng của JavaScript [jQuery đối với một số], bạn sẽ thấy hạn chế của lược đồ này.

$_POSTgiới hạn bạn sử dụng hai loại phương tiện trong Content-Typetiêu đề HTTP :

  1. application/x-www-form-urlencoded, và
  2. multipart/form-data

Vì vậy, nếu bạn muốn gửi các giá trị dữ liệu để PHP trên máy chủ, và có nó hiển thị trong $_POSTsuperglobal , sau đó bạn phải URLEncode nó trên client-side và gửi dữ liệu cho biết như cặp khóa / giá trị - một bước bất tiện cho người mới [đặc biệt là khi cố gắng tìm hiểu xem các phần khác nhau của URL có yêu cầu các hình thức mã hóa urlencoding khác nhau hay không: bình thường, thô, v.v.].

Đối với tất cả người dùng jQuery của bạn, $.ajax[]phương pháp đang chuyển đổi JSON của bạn thành các cặp khóa / giá trị được mã hóa URL trước khi truyền chúng đến máy chủ. Bạn có thể ghi đè hành vi này bằng cách cài đặt processData: false. Chỉ cần đọc tài liệu $ .ajax [] và đừng quên gửi đúng loại phương tiện trong tiêu đề Loại-Nội dung.

php: // input, but ...

Ngay cả khi bạn sử dụng php://inputthay vì $_POSTcho POSTdữ liệu nội dung yêu cầu HTTP của mình , nó sẽ không hoạt động với HTTP Content-Typecủa multipart/form-dataĐây là loại nội dung mà bạn sử dụng trên biểu mẫu HTML khi bạn muốn cho phép tải tệp lên!


    

Do đó, trong PHP truyền thống, để đối phó với một sự đa dạng của các loại nội dung từ một HTTP POSTyêu cầu, bạn sẽ học cách sử dụng $_POSThoặc filter_input_array[POST], $_FILESphp://input. Không có cách nào để chỉ sử dụng một nguồn đầu vào chung cho các POSTyêu cầu HTTP trong PHP.

Bạn không thể tải tệp qua $_POSTfilter_input_array [POST] hoặc php://inputvà bạn cũng không thể tải JSON / XML / YAML trong filter_input_array[POST]hoặc $_POST.

Hướng dẫn sử dụng PHP: php: // input

php: // input là luồng chỉ đọc cho phép bạn đọc dữ liệu thô từ phần thân yêu cầu ... php: // input không khả dụng với enctype = "Multiart / form-data".

PHP Framework giải cứu?

Các khung công tác PHP như Codeigniter 4 và Laravel sử dụng một mặt tiền để cung cấp một giao diện [ IncomingRequesthoặc Requestcác đối tượng] sạch hơn cho phần trên. Đây là lý do tại sao các nhà phát triển PHP chuyên nghiệp sử dụng các khung công tác thay vì PHP thô.

Tất nhiên, nếu bạn thích lập trình, bạn có thể tạo ra đối tượng mặt tiền của riêng bạn để cung cấp những gì các khung làm việc. Chính vì tôi đã dành thời gian tìm hiểu vấn đề này nên tôi mới có thể viết câu trả lời này.

Mã hóa URL? Cái quái gì vậy !!! ???

Thông thường, nếu bạn đang thực hiện một yêu cầu HTTP bình thường, đồng bộ [khi toàn bộ trang vẽ lại] với một biểu mẫu HTML, thì tác nhân người dùng [trình duyệt web] sẽ mã hóa dữ liệu biểu mẫu cho bạn. Nếu bạn muốn thực hiện một yêu cầu HTTP không đồng bộ bằng cách sử dụng XmlHttpRequestđối tượng, thì bạn phải tạo chuỗi urlencoded và gửi nó, nếu bạn muốn dữ liệu đó hiển thị trong $_POSTsuperglobal .

Làm thế nào để liên lạc với bạn với JavaScript? :-]

Việc chuyển đổi từ một mảng hoặc đối tượng JavaScript sang một chuỗi được mã hóa bằng mã urle làm phiền nhiều nhà phát triển [ngay cả với các API mới như Dữ liệu biểu mẫu ]. Họ muốn chỉ có thể gửi JSON và mã máy khách làm như vậy sẽ hiệu quả hơn .

Hãy nhớ rằng [nháy mắt, nháy mắt], nhà phát triển web trung bình không học cách sử dụng XmlHttpRequestđối tượng trực tiếp, các hàm toàn cục, hàm chuỗi, hàm mảng và biểu thức chính quy như bạn và tôi ;-]. Mã hóa khẩn cấp đối với họ là một cơn ác mộng. ;-]

PHP, những gì mang lại?

Việc PHP thiếu xử lý XML và JSON trực quan khiến nhiều người không thích. Bạn sẽ nghĩ rằng nó sẽ là một phần của PHP bây giờ [thở dài].

Rất nhiều loại phương tiện [loại MIME trong quá khứ]

XML, JSON và YAML đều có các loại phương tiện có thể được đưa vào Content-Typetiêu đề HTTP .

  • ứng dụng / xml
  • applyaiton / json
  • application / yaml [mặc dù IANA không có chỉ định chính thức được liệt kê]

Xem có bao nhiêu loại phương tiện [trước đây là loại MIME] được IANA xác định.

Xem có bao nhiêu tiêu đề HTTP .

php: // input hoặc bust

Sử dụng php://inputluồng cho phép bạn phá vỡ mức độ trừu tượng của việc trông trẻ / cầm tay mà PHP đã buộc trên thế giới. :-] Với sức mạnh lớn đến trách nhiệm lớn!

Bây giờ, trước khi xử lý các giá trị dữ liệu được truyền trực tuyến php://input, bạn nên / phải làm một số việc.

  1. Xác định xem phương thức HTTP chính xác đã được chỉ định chưa [GET, POST, PUT, PATCH, DELETE, ...]
  2. Xác định xem tiêu đề Loại-Nội dung HTTP đã được truyền hay chưa.
  3. Xác định xem giá trị cho Loại-Nội dung có phải là loại phương tiện mong muốn hay không.
  4. Xác định nếu gửi đi dữ liệu được cũng được hình thành XML / JSON / YAML / vv
  5. Nếu cần, hãy chuyển đổi dữ liệu sang kiểu dữ liệu PHP: mảng hoặc đối tượng.
  6. Nếu bất kỳ kiểm tra hoặc chuyển đổi cơ bản nào không thành công, hãy đưa ra một ngoại lệ !

Còn về bảng mã ký tự?

AH, HA! Có, bạn có thể muốn luồng dữ liệu được gửi vào ứng dụng của mình được mã hóa UTF-8, nhưng làm thế nào bạn có thể biết nó có hay không?

Hai vấn đề quan trọng.

  1. Bạn không biết có bao nhiêu dữ liệu đang đi qua php://input.
  2. Bạn không biết chắc chắn mã hóa hiện tại của luồng dữ liệu.

Bạn sẽ cố gắng xử lý dữ liệu luồng mà không biết trước hết là bao nhiêu? Đó là một ý tưởng khủng khiếp . Bạn không thể dựa hoàn toàn vào Content-Lengthtiêu đề HTTP để được hướng dẫn về kích thước của đầu vào được truyền trực tuyến vì nó có thể bị giả mạo.

Bạn sẽ cần một:

  1. Thuật toán phát hiện kích thước luồng.
  2. Giới hạn kích thước luồng do ứng dụng xác định [giới hạn Apache / Nginx / PHP có thể quá rộng].

Bạn có định chuyển đổi dữ liệu luồng sang UTF-8 mà không biết mã hóa hiện tại của luồng không? Làm sao? Bộ lọc luồng iconv [ ví dụ về bộ lọc luồng iconv ] dường như muốn mã hóa bắt đầu và kết thúc, như thế này.

'convert.iconv.ISO-8859-1/UTF-8'

Vì vậy, nếu bạn tận tâm, bạn sẽ cần:

  1. Thuật toán phát hiện mã hóa luồng.
  2. Thuật toán xác định bộ lọc dòng động / thời gian chạy [vì bạn không thể biết mã hóa bắt đầu tiên nghiệm].

[ Cập nhật : 'convert.iconv.UTF-8/UTF-8'sẽ buộc mọi thứ thành UTF-8, nhưng bạn vẫn phải tính đến các ký tự mà thư viện iconv có thể không biết cách dịch. Nói cách khác, bạn phải làm thế nào để xác định hành động cần thực hiện khi không thể dịch một ký tự : 1] Chèn một ký tự giả, 2] Lỗi / ném và ngoại lệ].

Bạn không thể chỉ dựa vào Content-Encodingtiêu đề HTTP , vì điều này có thể chỉ ra một cái gì đó giống như nén như sau. Đây không phải là điều bạn muốn đưa ra quyết định liên quan đến iconv.

Content-Encoding: gzip

Do đó, các bước chung có thể là ...

Phần I: Liên quan đến Yêu cầu HTTP

  1. Xác định xem phương thức HTTP chính xác đã được chỉ định chưa [GET, POST, PUT, PATCH, DELETE, ...]
  2. Xác định xem tiêu đề Loại-Nội dung HTTP đã được truyền hay chưa.
  3. Xác định xem giá trị cho Loại-Nội dung có phải là loại phương tiện mong muốn hay không.

Phần II: Liên quan đến Dữ liệu Luồng

  1. Xác định kích thước của luồng đầu vào [tùy chọn, nhưng được khuyến nghị].
  2. Xác định mã hóa của dòng đầu vào.
  3. Nếu cần, hãy chuyển đổi luồng đầu vào sang mã hóa ký tự mong muốn [UTF-8].
  4. Nếu cần, hãy đảo ngược quá trình nén hoặc mã hóa cấp ứng dụng, sau đó lặp lại các bước 4, 5 và 6.

Phần III: Kiểu dữ liệu liên quan

  1. Xác định nếu gửi đi dữ liệu được cũng được hình thành XML / JSON / YMAL / vv

[Hãy nhớ rằng, dữ liệu vẫn có thể là một chuỗi được mã hóa URL mà sau đó bạn phải phân tích cú pháp và giải mã URL].

  1. Nếu cần, hãy chuyển đổi dữ liệu sang kiểu dữ liệu PHP: mảng hoặc đối tượng.

Phần IV: Giá trị dữ liệu liên quan

  1. Lọc dữ liệu đầu vào.

  2. Xác thực dữ liệu đầu vào.

Bây giờ bạn thấy chưa?

Các $_POSTsuperglobal, cùng với các thiết lập php.ini cho giới hạn về đầu vào, là đơn giản hơn cho người không có đạo. Tuy nhiên, xử lý mã hóa ký tự trực quan và hiệu quả hơn nhiều khi sử dụng luồng vì không cần phải lặp qua các siêu cầu [hoặc mảng, nói chung] để kiểm tra các giá trị đầu vào cho mã hóa thích hợp.

50 hữu ích 2 bình luận chia sẻ

Chủ Đề