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?
Ví dụ: giả sử chúng ta có URL sau
Tốt nhất. com/tệp. php?id=299&mobile=Y&clid=392829
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
id=299&mobile=Y&clid=392829
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à
- Bạn có thể sử dụng chuỗi để xây dựng liên kết phân trang
- Nó có thể được sử dụng để lấy URL đầy đủ của một trang web
QUERY_STRING và XSS
Bạ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
Vì chuỗi truy vấn là một chuỗi ký tự được lưu trữ trong một URL, nên bạn có thể tạo một URL chứa chuỗi truy vấn trong tập lệnh PHP của mình
Sau đó bao gồm URL dưới dạng liên kết trong trang được hiển thị
Đây là một ví dụ đơn giản tạo hai biến, $firstName và $age, sau đó tạo một liên kết trong trang được hiển thị có chứa một chuỗi truy vấn để lưu trữ các giá trị của biến
$firstName ="Tom" ; $age ="3" ; $queryString ="firstName=$firstName&age=$age" ; echo'Find out more info on this person
';
Mã này tạo ra đánh dấu sau
Find out more info on this person
Nếu người dùng sau đó nhấp vào liên kết này, thông tin thêm. php được chạy và dữ liệu chuỗi truy vấn [firstName=Tom & age=3] được chuyển đến moreinfo. tập lệnh php
Dữ liệu đã được truyền từ lần thực thi tập lệnh này sang lần thực thi tập lệnh tiếp theo
Lưu ý rằng ký tự dấu và [&] cần được mã hóa dưới dạng & bên trong mã đánh dấu XHTML
mã hóa URL
PHP cung cấp cho bạn một hàm gọi là urlencode[] có thể mã hóa bất kỳ chuỗi nào bằng cách sử dụng mã hóa URL
Thử nghiệm
Find out more info onthis person '; ?>//w ww .j av a2s . c o m
Kết quả
PHP có thể tạo chuỗi truy vấn từ mảng bằ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
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
When using the http_build_query function to create a URL query from an array for use in something like curl_setopt[$ch, CURLOPT_POSTFIELDS, $post_url], be careful about the url encoding.
In my case, I simply wanted to pass on the received $_POST data to a CURL's POST data, which requires it to be in the URL format. If something like a space [ ] goes into the http_build_query, it comes out as a +. If you're then sending this off for POST again, you won't get the expected result. This is good for GET but not POST.
Instead you can make your own simple function if you simply want to pass along the data:
________số 8
You can then use this to pass along POST data in CURL.
$queryString = $_SERVER['QUERY_STRING']; echo 'Link';0
$queryString = $_SERVER['QUERY_STRING']; echo 'Link';1