2010-11-17 37 views
5

Với trang kiểm tra này:Sử dụng PHP 5.3: khai thác

$page = (int) $_GET['page'] ?: '1'; 
echo $page; 

Tôi không hiểu đầu ra tôi nhận được khi trang là undefined:

Request Result 
?page=2 2 
?page=3 3 
?page= 1 
?   error: Undefined index page 

Tại sao các thông báo lỗi? Đó là PHP 5.3; tại sao nó không vang "1"?

+5

Khá nhiều không liên quan, nhưng bạn thực sự muốn '1', không phải '' 1''. – ThiefMaster

+1

Trên dòng lệnh, điều này in 1 tốt: 'php -r 'echo (int) $ foo?: 1;'' (PHP 5.3.3, thông báo việc thiếu lỗi do báo cáo lỗi là im lặng). Bạn có thể thử chạy nó và xem nó làm gì không? Nó có thực sự nói "** error **, undefined index" không? – deceze

+2

Đó là và luôn luôn là một thông báo. Đó là "thông báo lỗi" chắc chắn là viết tay. – ThiefMaster

Trả lời

12

Cách thích hợp (theo ý kiến ​​của tôi) sẽ là:

$page = isset($_GET['page']) ? (int) $_GET['page'] : 1; 

Thậm chí nếu bạn sử dụng phong cách mới, bạn sẽ có vấn đề với ?page=0 (như 0 đánh giá false). "Mới" không phải lúc nào cũng tốt hơn ... bạn phải biết khi sử dụng.

+0

Yeah .. the ?: toán tử là vô ích cho điều đó .. mặc dù một "trở lại expr1 nếu nó không phải là unset/rỗng, nếu không expr2" nhà điều hành sẽ được awesome họ không bao giờ thêm vào đó. – ThiefMaster

+0

không không không, tôi muốn sử dụng kiểu mới – Isis

+2

+1 cho ternary op – mepcotterell

2

Đó là bởi vì bạn đang cố gắng để định kiểu cái gì đó là không xác định: (int) $ _GET [ 'page']

Tháo (int) hoặc thiết lập các định kiểu sau dòng có điều kiện.

+0

Lỗi vẫn còn – Isis

+0

Hãy thử thực hiện việc này: $ page = 1; if (! Isset ($ _ GET ['page'])) { $ page = (int) $ _GET ['trang']?: '1'; } echo $ page; – wajiw

3

Đáng tiếc là bạn không thể sử dụng nó cho mục đích mà bạn muốn sử dụng nó cho:

Biểu expr1: lợi nhuận expr3 expr1 nếu expr1 đánh giá là TRUE, và expr3 khác.

Vì vậy, bạn sẽ vẫn phải sử dụng isset hoặc empty() - toán tử ?: không bao gồm séc kiểm tra. Những gì bạn cần để sử dụng là:

$page = !empty($_GET['page']) ? (int)$_GET['page'] : 1; 
3

Chỉ cần cho đầy đủ, một cách khác để đạt được điều đó là để kéo nhà điều hành cấp bậc:

$page = (int)$_GET["page"] or $page = 1; 

Nhiều người nhận thức này là không đọc Tuy nhiên, mặc dù nó ngắn hơn isset () các cấu trúc.

Hoặc nếu bạn đang sử dụng đối tượng đầu vào hoặc bất kỳ lớp tiện ích khác:

$page = $_GET->int->default("page", 1); 
+0

Ví dụ đầu tiên của bạn gây ra lỗi, nếu chỉ mục 'page' không tồn tại, phải không? – DanMan

+0

@DanMan Nó làm tăng * Thông báo *. – mario

+0

Vâng, đó là ý tôi. Cảm ơn bạn đã làm rõ. – DanMan

1

Nếu sưng lên là mối quan tâm của bạn, làm thế nào về một hàm helper?

function get_or($index, $default) { 
    return isset($_GET[$index]) ? $_GET[$index] : $default; 
} 

sau đó bạn chỉ có thể sử dụng:

$page = get_or('page', 1); 

đó là sạch và xử lý các giá trị không xác định.

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