Ví dụ chuỗi truy vấn trong PHP là gì?
Hầu hết mọi người đều biết cách truy xuất các tham số URL bằng cách sử dụng mảng $_GET. Tuy nhiên, nếu bạn muốn truy xuất các tham số này dưới dạng chuỗi thì sao? Show
Ví dụ: giả sử chúng ta có URL sau
Như bạn có thể thấy, chuỗi truy vấn trong URL ở trên chứa ba tham số GET Nếu chúng ta muốn truy xuất mọi thứ sau dấu chấm hỏi và gán nó cho một chuỗi, chúng ta chỉ cần truy cập phần tử QUERY_STRING trong mảng siêu toàn cục $_SERVER như vậy //Get the full string $queryString = $_SERVER['QUERY_STRING']; var_dump($queryString); Nếu chúng tôi chạy đoạn mã trên trên URL được đề cập, nó sẽ trả về chuỗi sau
Lưu ý cách chuỗi này không chứa biểu tượng dấu chấm hỏi. Nếu ký hiệu này là cần thiết, thì bạn sẽ phải tự thêm lại. Nếu không có chuỗi truy vấn thì sao?Nếu không có chuỗi truy vấn thì khóa QUERY_STRING trong $_SERVER sẽ là một chuỗi rỗng Không giống như các phần tử khác trong mảng $_SERVER, QUERY_STRING phải luôn tồn tại Tại sao điều này hữu ích?Điều này có thể hữu ích vì một số lý do Hai điều đầu tiên xuất hiện trong tâm trí là
QUERY_STRING và XSSBạn không bao giờ được in biến QUERY_STRING ra trang mà không lọc nó trước Nếu bạn làm điều này, bạn sẽ để ngỏ khả năng bị tấn công Cross Site Scripting (XSS) $queryString = $_SERVER['QUERY_STRING']; echo 'Link'; Đoạn mã trên dễ bị XSS vì kết quả QUERY_STRING đang được in ra mà không có bất kỳ loại lọc nào. Do đó, những người dùng ác ý có khả năng đưa mã JavaScript vào chuỗi truy vấn và thực thi mã đó trên trang của bạn Các chuỗi truy vấn cũng được tạo bằng cách gửi biểu mẫu hoặc bởi người dùng nhập truy vấn vào thanh địa chỉ của trình duyệt Ghi chú. Nếu bạn muốn gửi một lượng lớn dữ liệu (hơn 100 kb) thì Request. QueryString không thể được sử dụng Chuỗi truy vấn là một phần của bộ định vị tài nguyên thống nhất (URL) gán giá trị cho các tham số đã chỉ định. Chuỗi truy vấn thường bao gồm các trường được trình duyệt Web hoặc ứng dụng khách khác thêm vào URL cơ sở, chẳng hạn như một phần của HTML, chọn giao diện của trang hoặc chuyển đến các vị trí trong nội dung đa phương tiện. [1][2][3] Máy chủ web có thể xử lý yêu cầu Giao thức truyền siêu văn bản (HTTP) bằng cách đọc tệp từ hệ thống tệp của nó dựa trên đường dẫn URL hoặc bằng cách xử lý yêu cầu bằng logic dành riêng cho loại tài nguyên. Trong trường hợp logic đặc biệt được gọi, chuỗi truy vấn sẽ có sẵn cho logic đó để sử dụng trong quá trình xử lý, cùng với thành phần đường dẫn của URL Cấu trúc[sửa]URL điển hình chứa chuỗi truy vấn như sau see my page! mine is better1 Khi một máy chủ nhận được yêu cầu cho một trang như vậy, nó có thể chạy một chương trình, chuyển chuỗi truy vấn, trong trường hợp này là see my page! mine is better2, không thay đổi đối với chương trình. Dấu chấm hỏi được sử dụng làm dấu phân cách và không phải là một phần của chuỗi truy vấn. [4][5] Các khung web có thể cung cấp các phương thức phân tích cú pháp nhiều tham số trong chuỗi truy vấn, được phân tách bằng một số dấu phân cách. [6] Trong URL ví dụ bên dưới, nhiều tham số truy vấn được phân tách bằng dấu và, " see my page! mine is better3" see my page! mine is better4 Cấu trúc chính xác của chuỗi truy vấn không được chuẩn hóa. Các phương pháp được sử dụng để phân tích cú pháp chuỗi truy vấn có thể khác nhau giữa các trang web Một liên kết trong trang web có thể có một URL chứa chuỗi truy vấn. HTML xác định ba cách mà tác nhân người dùng có thể tạo chuỗi truy vấn
Biểu mẫu web[sửa]Một trong những cách sử dụng ban đầu là chứa nội dung của biểu mẫu HTML, còn được gọi là biểu mẫu web. Đặc biệt, khi một biểu mẫu chứa các trường see my page! mine is better2, see my page! mine is better3, see my page! mine is better4 được gửi, nội dung của các trường được mã hóa dưới dạng chuỗi truy vấn như sau see my page! mine is better5
Mặc dù không có tiêu chuẩn rõ ràng, nhưng hầu hết các khung web đều cho phép nhiều giá trị được liên kết với một trường duy nhất (e. g. see my page! mine is better9). [7][8] Đối với mỗi trường của biểu mẫu, chuỗi truy vấn chứa một cặp $queryString = $_SERVER['QUERY_STRING']; echo 'Link';00. Biểu mẫu web có thể bao gồm các trường không hiển thị cho người dùng; Quy ước này là khuyến nghị của W3C. [6] Trong các khuyến nghị năm 1999, W3C đã khuyến nghị rằng tất cả các máy chủ web đều hỗ trợ dấu phân cách dấu chấm phẩy ngoài dấu phân cách dấu và [9] để cho phép các chuỗi truy vấn được mã hóa ứng dụng/x-www-form-urlencoded trong URL trong tài liệu HTML mà không cần phải thực thể thoát dấu và. Kể từ năm 2014, W3C khuyến nghị chỉ sử dụng dấu và làm dấu tách truy vấn [10] Nội dung biểu mẫu chỉ được mã hóa trong chuỗi truy vấn của URL khi phương thức gửi biểu mẫu là GET. Mã hóa tương tự được sử dụng theo mặc định khi phương thức gửi là POST, nhưng kết quả được gửi dưới dạng nội dung yêu cầu HTTP thay vì được đưa vào URL đã sửa đổi. [1] Tìm kiếm được lập chỉ mục[sửa]Trước khi các biểu mẫu được thêm vào HTML, các trình duyệt đã hiển thị phần tử see my page! mine is better1 dưới dạng điều khiển nhập văn bản một dòng. Văn bản được nhập vào điều khiển này đã được gửi đến máy chủ dưới dạng chuỗi truy vấn bổ sung cho yêu cầu GET cho URL cơ sở hoặc URL khác được chỉ định bởi thuộc tính $queryString = $_SERVER['QUERY_STRING']; echo 'Link';02. [11] Điều này nhằm mục đích cho phép các máy chủ web sử dụng văn bản được cung cấp làm tiêu chí truy vấn để chúng có thể trả về danh sách các trang phù hợp. [12] Khi văn bản nhập vào điều khiển tìm kiếm được lập chỉ mục được gửi, nó được mã hóa dưới dạng chuỗi truy vấn như sau $queryString = $_SERVER['QUERY_STRING']; echo 'Link';03
Mặc dù phần tử see my page! mine is better1 không được dùng nữa và hầu hết các trình duyệt không còn hỗ trợ hoặc hiển thị nó, nhưng vẫn còn tồn tại một số vết tích của tìm kiếm được lập chỉ mục. Ví dụ: đây là nguồn xử lý dấu cộng đặc biệt, ' $queryString = $_SERVER['QUERY_STRING']; echo 'Link';04' trong mã hóa phần trăm URL của trình duyệt (mà ngày nay, với việc ngừng tìm kiếm được lập chỉ mục, tất cả đều dư thừa với $queryString = $_SERVER['QUERY_STRING']; echo 'Link';07). Ngoài ra một số máy chủ web hỗ trợ CGI (e. g. , Apache) sẽ xử lý chuỗi truy vấn thành các đối số dòng lệnh nếu nó không chứa dấu bằng, ' see my page! mine is better6' (theo mục 4. 4 của CGI 1. 1). Một số tập lệnh CGI vẫn phụ thuộc và sử dụng hành vi lịch sử này cho các URL được nhúng trong HTML Mã hóa URL[sửa mã nguồn]Một số ký tự không thể là một phần của URL (ví dụ: khoảng trắng) và một số ký tự khác có ý nghĩa đặc biệt trong URL. ví dụ: ký tự $queryString = $_SERVER['QUERY_STRING']; echo 'Link';09 có thể được sử dụng để chỉ định thêm một tiểu mục (hoặc đoạn) của tài liệu. Trong biểu mẫu HTML, ký tự see my page! mine is better6 được sử dụng để phân tách tên khỏi giá trị. Cú pháp chung của URI sử dụng mã hóa URL để giải quyết vấn đề này, trong khi các biểu mẫu HTML thực hiện một số thay thế bổ sung thay vì áp dụng mã hóa phần trăm cho tất cả các ký tự như vậy. SPACE được mã hóa thành ' $queryString = $_SERVER['QUERY_STRING']; echo 'Link';04' hoặc " $queryString = $_SERVER['QUERY_STRING']; echo 'Link';07". [13] HTML 5 chỉ định chuyển đổi sau để gửi biểu mẫu HTML bằng phương thức "NHẬN" tới máy chủ web. [1] Sau đây là tóm tắt ngắn gọn về thuật toán
Bộ tám tương ứng với dấu ngã (" see my page! mine is better21") được RFC3986 cho phép trong chuỗi truy vấn nhưng bắt buộc phải được mã hóa theo phần trăm trong biểu mẫu HTML thành " see my page! mine is better28" Việc mã hóa SPACE là ' $queryString = $_SERVER['QUERY_STRING']; echo 'Link';04' và việc lựa chọn các ký tự "nguyên trạng" giúp phân biệt mã hóa này với RFC 3986 Ví dụ[sửa]Nếu một biểu mẫu được nhúng trong trang HTML như sau see my page! mine is better7 và người dùng chèn các chuỗi "đây là một trường" và "đã rõ chưa (đã)?" . see my page! mine is better33 Nếu biểu mẫu được xử lý trên máy chủ bằng tập lệnh CGI, thì tập lệnh này thường có thể nhận chuỗi truy vấn dưới dạng biến môi trường có tên see my page! mine is better34 Theo dõi[sửa]Một chương trình nhận chuỗi truy vấn có thể bỏ qua một phần hoặc toàn bộ chuỗi đó. Nếu URL được yêu cầu tương ứng với một tệp chứ không phải một chương trình, thì toàn bộ chuỗi truy vấn sẽ bị bỏ qua. Tuy nhiên, bất kể chuỗi truy vấn có được sử dụng hay không, toàn bộ URL bao gồm nó sẽ được lưu trữ trong tệp nhật ký máy chủ Những dữ kiện này cho phép các chuỗi truy vấn được sử dụng để theo dõi người dùng theo cách tương tự như cách được cung cấp bởi cookie HTTP. Để điều này hoạt động, mỗi khi người dùng tải xuống một trang, một mã định danh duy nhất phải được chọn và thêm dưới dạng chuỗi truy vấn vào URL của tất cả các liên kết mà trang chứa. Ngay khi người dùng nhấp vào một trong các liên kết này, URL tương ứng sẽ được yêu cầu tới máy chủ. Bằng cách này, việc tải xuống của trang này được liên kết với trang trước đó Ví dụ: khi một trang web chứa nội dung sau được yêu cầu see my page! mine is better một chuỗi duy nhất, chẳng hạn như see my page! mine is better35 được chọn và trang được sửa đổi như sau $queryString = $_SERVER['QUERY_STRING']; echo 'Link';0 Việc thêm chuỗi truy vấn không thay đổi cách hiển thị trang cho người dùng. Ví dụ: khi người dùng theo dõi liên kết đầu tiên, trình duyệt sẽ yêu cầu trang see my page! mine is better36 đến máy chủ, máy chủ này sẽ bỏ qua những gì theo sau see my page! mine is better37 và gửi trang see my page! mine is better38 như mong đợi, đồng thời thêm chuỗi truy vấn vào liên kết của nó Bằng cách này, mọi yêu cầu trang tiếp theo từ người dùng này sẽ mang cùng một chuỗi truy vấn see my page! mine is better35, giúp có thể xác định rằng tất cả các trang này đã được xem bởi cùng một người dùng. Chuỗi truy vấn thường được sử dụng cùng với đèn hiệu web Sự khác biệt chính giữa chuỗi truy vấn được sử dụng để theo dõi và cookie HTTP là
Các vấn đề về khả năng tương thích[sửa | sửa mã nguồn]Theo đặc tả HTTP
Nếu URL quá dài, máy chủ web không thành công với mã trạng thái HTTP quá dài 414 Request-URI Cách giải quyết chung cho những sự cố này là sử dụng POST thay vì GET và lưu trữ các tham số trong phần thân yêu cầu. Giới hạn độ dài đối với nội dung yêu cầu thường cao hơn nhiều so với giới hạn độ dài URL. Ví dụ: theo mặc định, giới hạn về kích thước POST là 2 MB trên IIS 4. 0 và 128 KB trên IIS 5. 0. Giới hạn có thể định cấu hình trên Apache2 bằng cách sử dụng lệnh see my page! mine is better40, chỉ định số byte từ 0 (có nghĩa là không giới hạn) đến 2147483647 (2 GB) được phép trong nội dung yêu cầu. [16] Chuỗi truy vấn trong PHP là gì?Chuỗi truy vấn là một phần của bộ định vị tài nguyên thống nhất (URL) gán giá trị cho các tham số đã chỉ định .
Làm cách nào để tạo chuỗi truy vấn trong PHP?PHP có thể tạo chuỗi truy vấn từ mảng sử dụng hàm http_build_query() . Hàm này lấy một mảng kết hợp gồm các tên và giá trị trường và trả về toàn bộ chuỗi truy vấn.
Chuỗi truy vấn của tôi là gì?Chuỗi truy vấn là phần của URL nơi dữ liệu được chuyển đến ứng dụng web và/hoặc cơ sở dữ liệu phía sau . Lý do chúng ta cần chuỗi truy vấn là giao thức HTTP không có trạng thái theo thiết kế. Để một trang web không chỉ là một cuốn sách nhỏ, bạn cần duy trì trạng thái (lưu trữ dữ liệu).
Làm cách nào để lấy dữ liệu chuỗi truy vấn trong PHP?Cách tiếp cận. Phân tích cú pháp chuỗi URL bằng cách sử dụng hàm parse_url() hàm này sẽ trả về một mảng kết hợp chứa các thành phần khác nhau (URL đã truyền). Truy vấn của mảng được trả về bởi hàm parse_url() chứa chuỗi truy vấn URL. |