Tại sao file_get_contents trả về false?

Trong bài viết này, chúng ta sẽ xem cách đọc toàn bộ tệp thành một chuỗi bằng cách sử dụng hàm file_get_contents(), cùng với việc hiểu cách triển khai của chúng thông qua ví dụ

Hàm file_get_contents() trong PHP là một hàm sẵn có được sử dụng để đọc một tệp thành một chuỗi. Hàm này sử dụng các kỹ thuật ánh xạ bộ nhớ được máy chủ hỗ trợ và do đó nâng cao hiệu suất khiến nó trở thành một cách ưa thích để đọc nội dung của tệp. Đường dẫn của tệp sẽ được đọc, được gửi dưới dạng tham số cho hàm và nó trả về dữ liệu đã đọc nếu thành công và FALSE nếu thất bại

cú pháp.   

file_get_contents($path, $include_path, $context, 
                              $start, $max_length)

Thông số. Hàm file_get_contents() trong PHP chấp nhận một tham số bắt buộc và bốn tham số tùy chọn.   

  • $path. Nó chỉ định đường dẫn của tệp hoặc thư mục bạn muốn kiểm tra
  • $include_path. Đây là một tham số tùy chọn tìm kiếm một tệp trong tệp trong tệp bao gồm_path (trong php. ini) nếu nó được đặt thành 1
  • bối cảnh $. Đây là một tham số tùy chọn được sử dụng để chỉ định ngữ cảnh tùy chỉnh
  • $bắt đầu. Nó là một tham số tùy chọn được sử dụng để chỉ định điểm bắt đầu trong tệp để đọc
  • $max_length. Nó là một tham số tùy chọn được sử dụng để chỉ định số byte sẽ được đọc

Giá trị trả về. Nó trả về dữ liệu đã đọc nếu thành công và FALSE nếu thất bại

Tiếp cận. Để đưa tệp vào chuỗi, chúng ta sẽ sử dụng hàm file_get_contents(). Đối với ví dụ đầu tiên, chúng tôi sẽ chỉ định liên kết URL làm đối số sẽ chuyển hướng đến trang web đã cho. Đối với ví dụ thứ 2, hãy tạo tên tệp “gfg. txt” chứa dữ liệu. Hàm này sẽ đọc tệp thành một chuỗi và hiển thị nội dung tương ứng

`file_get_contents` sẽ trả về `FALSE` nếu bị lỗi - điều gì có thể khiến nó bị lỗi? . Chỉ cố mở một tệp không tồn tại sẽ không hoạt động, điều đó khiến nó tạo ra một ngoại lệ. từ PHP

Có lẽ tôi đã ngồi đây nhìn chằm chằm vào cái này quá lâu nhưng TẠI SAO

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
0 lại trả lại
$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
1 ở đây?

$url = "http://jobs.github.com/positions.json?search=" . $as_any . "&location=" .       $location;
// URL contains http://jobs.github.com/positions.json?search=Project Manager&location=London
var_dump($url);
$json = file_get_contents($url);
var_dump($json);
$results = json_decode($json, TRUE);
var_dump($results);
exit;

CHỈNH SỬA

Tôi đã kiểm tra

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
2 và chắc chắn nó đang bật

Giải pháp tốt nhất

Thử cái này

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;

Vấn đề là bạn không mã hóa URL cụm từ tìm kiếm chứa khoảng trắng. Yêu cầu trả về lỗi 400 từ máy chủ, lỗi này bạn sẽ nhận thấy nếu bạn đã bật báo cáo lỗi

Giải pháp liên quan

Php – Cách ngăn SQL injection trong PHP

Cách chính xác để tránh các cuộc tấn công SQL injection, bất kể bạn sử dụng cơ sở dữ liệu nào, là tách dữ liệu khỏi SQL, để dữ liệu vẫn là dữ liệu và sẽ không bao giờ được trình phân tích cú pháp SQL diễn giải thành các lệnh. Có thể tạo câu lệnh SQL với các phần dữ liệu được định dạng chính xác, nhưng nếu bạn không hiểu đầy đủ chi tiết, bạn nên luôn sử dụng câu lệnh đã chuẩn bị sẵn và truy vấn được tham số hóa. Đây là các câu lệnh SQL được máy chủ cơ sở dữ liệu gửi đến và phân tích cú pháp riêng biệt với bất kỳ tham số nào. Bằng cách này, kẻ tấn công không thể tiêm SQL độc hại

Về cơ bản, bạn có hai lựa chọn để đạt được điều này

  1. Sử dụng PDO (đối với mọi trình điều khiển cơ sở dữ liệu được hỗ trợ)

     $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    
     $stmt->execute([ 'name' => $name ]);
    
     foreach ($stmt as $row) {
         // Do something with $row
     }
    
  2. Sử dụng MySQLi (dành cho MySQL)

     $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
     $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
    
     $stmt->execute();
    
     $result = $stmt->get_result();
     while ($row = $result->fetch_assoc()) {
         // Do something with $row
     }
    

Nếu bạn đang kết nối với cơ sở dữ liệu không phải MySQL, thì có tùy chọn thứ hai dành riêng cho trình điều khiển mà bạn có thể tham khảo (ví dụ:

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
3 và
$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
4 cho PostgreSQL). PDO là tùy chọn phổ quát


Thiết lập kết nối chính xác

Lưu ý rằng khi sử dụng PDO để truy cập cơ sở dữ liệu MySQL, các câu lệnh chuẩn bị thực không được sử dụng theo mặc định. Để khắc phục điều này, bạn phải tắt mô phỏng các câu lệnh đã chuẩn bị. Một ví dụ về việc tạo kết nối bằng PDO là

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
0

Trong ví dụ trên, chế độ lỗi không thực sự cần thiết, nhưng bạn nên thêm nó vào. Bằng cách này, tập lệnh sẽ không dừng lại với

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
5 khi có sự cố xảy ra. Và nó mang lại cho nhà phát triển cơ hội
$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
6 bất kỳ (các) lỗi nào
$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
7n thành
$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
8

Tuy nhiên, điều bắt buộc là dòng

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
9 đầu tiên, yêu cầu PDO tắt các câu lệnh đã chuẩn bị được mô phỏng và sử dụng các câu lệnh đã chuẩn bị thực sự. Điều này đảm bảo rằng câu lệnh và các giá trị không được PHP phân tích cú pháp trước khi gửi nó đến máy chủ MySQL (khiến kẻ tấn công không có cơ hội tiêm SQL độc hại)

Mặc dù bạn có thể đặt

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
0 trong các tùy chọn của hàm tạo, điều quan trọng cần lưu ý là các phiên bản PHP 'cũ' (trước 5. 3. 6) âm thầm bỏ qua tham số bộ ký tự trong DSN


Giải trình

Câu lệnh SQL bạn chuyển đến

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
1 được máy chủ cơ sở dữ liệu phân tích cú pháp và biên dịch. Bằng cách chỉ định các tham số (hoặc là
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
2 hoặc tham số được đặt tên như
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
3 trong ví dụ trên), bạn cho công cụ cơ sở dữ liệu biết nơi bạn muốn lọc. Sau đó, khi bạn gọi
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
4, câu lệnh đã chuẩn bị được kết hợp với các giá trị tham số mà bạn chỉ định

Điều quan trọng ở đây là các giá trị tham số được kết hợp với câu lệnh đã biên dịch, không phải là chuỗi SQL. SQL injection hoạt động bằng cách lừa tập lệnh bao gồm các chuỗi độc hại khi nó tạo SQL để gửi đến cơ sở dữ liệu. Vì vậy, bằng cách gửi SQL thực riêng biệt với các tham số, bạn sẽ hạn chế rủi ro kết thúc bằng thứ mà bạn không có ý định

Bất kỳ tham số nào bạn gửi khi sử dụng câu lệnh đã chuẩn bị sẽ chỉ được coi là chuỗi (mặc dù công cụ cơ sở dữ liệu có thể thực hiện một số tối ưu hóa để tất nhiên, tham số cũng có thể kết thúc dưới dạng số). Trong ví dụ trên, nếu biến

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
5 chứa
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
6 thì kết quả sẽ chỉ là tìm kiếm chuỗi
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
7 và bạn sẽ không nhận được một bảng trống

Một lợi ích khác của việc sử dụng các câu lệnh đã chuẩn bị là nếu bạn thực hiện cùng một câu lệnh nhiều lần trong cùng một phiên thì nó sẽ chỉ được phân tích cú pháp và biên dịch một lần, giúp bạn tăng tốc độ

Ồ, và vì bạn đã hỏi về cách thực hiện cho phần chèn, đây là một ví dụ (sử dụng PDO)

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
4

Câu lệnh đã chuẩn bị có thể được sử dụng cho các truy vấn động không?

Mặc dù bạn vẫn có thể sử dụng các câu lệnh đã chuẩn bị cho các tham số truy vấn, nhưng bản thân cấu trúc của truy vấn động không thể được tham số hóa và một số tính năng truy vấn nhất định không thể được tham số hóa

Đối với những trường hợp cụ thể này, điều tốt nhất cần làm là sử dụng bộ lọc danh sách trắng để hạn chế các giá trị có thể

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
5

Php – Bảng liệt kê trên PHP

Tùy thuộc vào trường hợp sử dụng, tôi thường sử dụng một cái gì đó đơn giản như sau

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
6

Tuy nhiên, các trường hợp sử dụng khác có thể yêu cầu xác thực nhiều hơn các hằng số và giá trị. Dựa trên các nhận xét bên dưới về sự phản ánh và một vài ghi chú khác, đây là một ví dụ mở rộng có thể phục vụ tốt hơn cho nhiều trường hợp hơn

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
7

Bằng cách tạo một lớp enum đơn giản mở rộng BasicEnum, giờ đây bạn có khả năng sử dụng các phương thức để xác thực đầu vào đơn giản

$query = http_build_query(array('search'=>$as_any, 'location'=>$location));
$url = "http://jobs.github.com/positions.json?" . $query;
8

Như một lưu ý phụ, bất cứ khi nào tôi sử dụng sự phản chiếu ít nhất một lần trên lớp tĩnh/const nơi dữ liệu sẽ không thay đổi (chẳng hạn như trong một enum), tôi lưu trữ kết quả của các cuộc gọi phản chiếu đó, vì mỗi lần sử dụng các đối tượng phản chiếu mới

Bây giờ hầu hết mọi người cuối cùng đã nâng cấp lên ít nhất 5. 3 và có sẵn

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
8, đó chắc chắn cũng là một lựa chọn khả thi--miễn là bạn không bận tâm đến khái niệm truyền thống không trực quan về việc có các khởi tạo enum thực tế trong toàn bộ cơ sở mã của bạn. Trong ví dụ trên,
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
9 và
 $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
 $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'

 $stmt->execute();

 $result = $stmt->get_result();
 while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
0 hoàn toàn không thể được khởi tạo, chúng cũng không nên

file_get_contents trả về cái gì?

Hàm này tương tự như hàm file(), ngoại trừ file_get_contents() trả về tệp trong một chuỗi, bắt đầu từ độ lệch được chỉ định cho đến byte độ dài. On failure, file_get_contents() will return false . file_get_contents() is the preferred way to read the contents of a file into a string.

Công dụng của hàm file_get_contents() là gì?

file_get_contents() đọc tệp thành một chuỗi . Hàm này là cách ưa thích để đọc nội dung của tệp thành một chuỗi. Nó sẽ sử dụng các kỹ thuật ánh xạ bộ nhớ, nếu điều này được máy chủ hỗ trợ, để nâng cao hiệu suất.

Sự khác biệt giữa các hàm file() và file_get_contents() viết bằng chương trình nhỏ là gì?

Cả hai đều đọc toàn bộ tệp, nhưng file đọc tệp thành một mảng, trong khi file_get_contents đọc tệp thành một chuỗi .

Sự khác biệt giữa hàm file_get_contents() và hàm file() là gì?

Hàm file() đọc toàn bộ tệp trong một mảng, trong khi hàm file_get_contents() đọc toàn bộ tệp thành một chuỗi