2012-10-18 55 views
5

Dưới đây là đoạn code tôi đã gặp khó khăn trong vài giờ:PHP yêu cầu không thành công với không có lỗi

if ((require $_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php') == 'OK') { 
    echo 'OK'; 
} else { 
    echo 'KO'; 
} 

Nếu tôi hiểu được tài liệu PHP trên "yêu cầu" chỉ thị chính xác, "KO" nên không bao giờ được viết bởi vì, nếu yêu cầu không hoạt động, một lỗi được nâng lên.

Trong trường hợp của tôi, "KO" luôn được hiển thị ngay cả với tunning lỗi:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR); 

Lưu ý rằng với cùng yêu cầu (hoặc bao gồm) hoạt động hoàn hảo trong các trang khác của trang web.

EDIT

Các nếu cấu trúc đã được thêm vào sau khi xem tài liệu. Lúc đầu, tôi đã có một dòng duy nhất:

require $_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php'; 

Như tôi đã kiểm tra rằng dòng này đã không làm việc, tôi đã thêm các if.

Nhân tiện. Trang bắt buộc (khi nó hoạt động) thêm một thẻ script vào trang gọi mà tôi không bao giờ thấy trên trang duy nhất này. Trên bất kỳ trang nào khác mà yêu cầu này được sử dụng, tập lệnh xuất hiện trên đầu ra.

Vì vậy, câu hỏi của tôi phải là "nếu đầu ra của tệp php được yêu cầu không được hiển thị, tại sao không có lỗi được nêu lên?"

+1

Menu_js.php có thực sự có tuyên bố cho biết: trả về 'OK' không? Nếu không, nó sẽ luôn luôn nói 'KO'. Xem thêm: http://nl1.php.net/manual/en/function.include.php – Friek

Trả lời

4

Theo the documentation

thành công bao gồm, trừ khi ghi đè bởi các tập tin bao gồm, trở lại 1 ... Ngoài ra, nó có thể trở về giá trị từ các tập tin bao gồm. Bạn có thể lấy giá trị của cuộc gọi bao gồm như bạn muốn cho một chức năng bình thường.

Vì vậy, tệp của bạn không trả về 'OK'. Nó trả về 1 hoặc (để thành công) hoặc một giá trị tùy chỉnh.

require là cấu trúc ngôn ngữ, không phải là chức năng chuẩn. Bằng cách sử dụng require, bạn đã cho biết mã sẽ bị lỗi nếu không tìm thấy tệp. Nhiều khả năng bạn không cần phải kiểm tra giá trị trả lại.

+0

Bạn nói đúng. Đó là lý do tại sao tôi không thể hiểu tại sao "KO" được hiển thị. – Targol

+0

Vui lòng xem các chỉnh sửa của tôi. Tôi đã không bao giờ yếu tố trong parens của bạn. –

1

Bạn không thể sử dụng require trong if

Sử dụng này

if(file_exists($_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php')) 
{ 
echo 'OK'; 
} else { 
    echo 'KO'; 
} 
+0

Cảm ơn câu trả lời nhưng, như tôi đã nói trong câu hỏi, dòng chính xác (ví dụ như "yêu cầu" một) hoạt động trong nhiều trang khác của trang web của tôi vì vậy tôi biết chắc chắn rằng các tập tin tồn tại. – Targol

+0

@jhonraymos: Từ PHP bao gồm hướng dẫn: Thành công bao gồm, trừ khi được ghi đè bởi tệp được bao gồm, trả về 1. Có thể thực hiện câu lệnh trả về bên trong tệp được bao gồm để chấm dứt xử lý trong tệp đó và quay lại tập lệnh được gọi nó. – Friek

+1

Câu đầu tiên của bạn là câu trả lời của tôi: Bạn không thể sử dụng yêu cầu trong nếu Nhưng nó được viết bằng văn bản ở đâu? – Targol

1

Trong khi đó là sự thật rằng yêu cầu sẽ không trở lại bất cứ điều gì, làm cho điều kiện luôn trở lại 'KO' kể từ khi bàn tay trái giá trị trong dấu ngoặc đơn sẽ không bao giờ bằng 'OK', bạn có thể kiểm tra xem tệp có bị lỗi hay không bằng cách đặt giá trị in_errors ini tạm thời trong tập lệnh này Bật.

Vì bạn đã đặt báo cáo lỗi để bắt lỗi này, nên display_errors của bạn có thể bị tắt, do đó không hiển thị cho bạn điều này.Đặt cho tập lệnh này như sau:

ini_set('display_errors', 'on'); 
+0

Tôi đã thử rằng không thành công. – Targol

3

Điều này chỉ hoạt động theo cách bạn mong đợi nếu menu_js.php chứa return 'OK';. Nếu không, require chỉ hoạt động tốt, nhưng giá trị trả lại không phải là "OK", đó là lý do tại sao điều kiện "KO" của bạn được kích hoạt. require không trả lại 'OK'. Nếu require không hoạt động, chương trình sẽ bị tạm dừng ngay lập tức, điều kiện false của bạn sẽ không bao giờ bị ảnh hưởng theo cách bạn nghĩ.

2

Có một số sai lầm ở đây:

  1. Theo tài liệu PHP:

    require giống hệt include trừ khi thất bại nó cũng sẽ tạo ra một lỗi E_COMPILE_ERROR mức tử vong.

    Lỗi nghiêm trọng sẽ dừng việc thực thi tập lệnh của bạn.

  2. require lợi gì khi trở về tập tin bao gồm:

    // a.php 
    return 'test'; 
    
    // b.php 
    $result = require 'a.php'; 
    echo $result; // will display 'test' 
    

Vì vậy, không kiểm tra giá trị trả về của require! Sử dụng is_file(), sau đó nếu true, yêu cầu tệp đó!

Các vấn đề liên quan