- 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 đó:
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 GET
yê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
POST
yê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 POST
khô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.
$_POST
giới hạn bạn sử dụng hai loại phương tiện trong Content-Type
tiêu đề HTTP :
application/x-www-form-urlencoded
, và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
$_POST
superglobal , 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://input
thay vì $_POST
cho POST
dữ 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-Type
củ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 POST
yêu cầu, bạn sẽ học cách sử dụng $_POST
hoặc filter_input_array[POST]
, $_FILES
và php://input
. Không có cách nào để chỉ sử dụng một nguồn đầu vào chung cho các POST
yêu cầu HTTP trong PHP.
Bạn không thể tải tệp qua
$_POST
filter_input_array [POST] hoặc php://input
và 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 [ IncomingRequest
hoặc Request
cá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 $_POST
superglobal .
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-Type
tiê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://input
luồ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.
- Xác định xem phương thức HTTP chính xác đã được chỉ định chưa [GET, POST, PUT, PATCH, DELETE, ...]
- Xác định xem tiêu đề Loại-Nội dung HTTP đã được truyền hay chưa.
- 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.
- Xác định nếu gửi đi dữ liệu được cũng được hình thành XML / JSON / YAML / vv
- 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.
- 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.
- Bạn không biết có bao nhiêu dữ liệu đang đi qua
php://input
. - 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-Length
tiê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:
- Thuật toán phát hiện kích thước luồng.
- 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:
- Thuật toán phát hiện mã hóa luồng.
- 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-Encoding
tiê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
- Xác định xem phương thức HTTP chính xác đã được chỉ định chưa [GET, POST, PUT, PATCH, DELETE, ...]
- Xác định xem tiêu đề Loại-Nội dung HTTP đã được truyền hay chưa.
- 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
- Xác định kích thước của luồng đầu vào [tùy chọn, nhưng được khuyến nghị].
- Xác định mã hóa của dòng đầu vào.
- 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].
- 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
- 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].
- 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
Lọc dữ liệu đầu vào.
Xác thực dữ liệu đầu vào.
Bây giờ bạn thấy chưa?
Các $_POST
superglobal, 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ẻ