2010-07-31 29 views
8

Đây có thể là cách máy chủ của tôi được thiết lập nhưng tôi đập đầu vào tường. Những gì tôi đang cố gắng làm là nói rằng nếu $action không có giá trị hoặc có giá trị không phải là "thêm" hoặc "xóa" hơn là có lỗi khác, hãy tiếp tục chạy tập lệnh. Tuy nhiên, tôi gặp lỗi bất kể $action là gì.php nếu không khai báo

$action= $_GET['a']; 
if((!isset($action)) || ($action !="add" || $action !="delete")){ 
    //header("location:index.php"); 
    echo "error <br>"; 
} 

$action đang được thiết lập đúng cách và nếu chạy cái gì đó như if($action =="add") nó hoạt động. Đây là trên máy chủ lưu trữ cục bộ của tôi vì vậy có thể là vấn đề về cài đặt.

+1

không có ý nghĩa trong việc kiểm tra nếu $ hành động được thiết lập, nếu bạn đặt nó trên dòng trước –

+0

Shrapnel, nếu không có gì là trong phần '"? ​​a = xxx "' của url '$ action' phải là null. Tôi nghĩ rằng nếu tôi đã đặt '$ action' thành một biến tĩnh, bạn sẽ đúng. Tuy nhiên, bởi vì người dùng nhập dữ liệu có một cơ hội cho các vấn đề. Đúng nếu tôi sai. – BandonRandon

+0

oops, tệ của tôi. isset() trả về false trên các biến null. Dù sao thì bạn nên kiểm tra xem $ _GET ['a'] có được đặt không, không phải $ action. Hoặc bạn sẽ nhận được lỗi "Chỉ mục không xác định". –

Trả lời

17

Logic của bạn hơi bị tắt. Thứ hai || nên &&:

if ((!isset($action)) || ($action != "add" && $action != "delete")) 

Bạn có thể thấy lý do tại sao dòng ban đầu của bạn bị lỗi bằng cách cố gắng ra một giá trị mẫu. Giả sử $action"delete". Dưới đây là cách điều kiện giảm xuống từng bước:

// $action == "delete" 
if ((!isset($action)) || ($action != "add" || $action != "delete")) 
if ((!true) || ($action != "add" || $action != "delete")) 
if (false || ($action != "add" || $action != "delete")) 
if ($action != "add" || $action != "delete") 
if (true || $action != "delete") 
if (true || false) 
if (true) 

Rất tiếc! Tình trạng vừa thành công và in "lỗi", nhưng nó được cho là thất bại. Trong thực tế, nếu bạn nghĩ về nó, bất kể giá trị của $action là, một trong hai thử nghiệm != sẽ trả về giá trị true. Chuyển đổi || thành && và sau đó dòng thứ hai đến dòng cuối cùng trở thành if (true && false), cách này giảm xuống mức if (false).

Có một cách để sử dụng || và có công việc kiểm tra, nhân tiện. Bạn cần phải phủ nhận mọi thứ khác sử dụng De Morgan's law, tức là .:

if ((!isset($action)) || !($action == "add" || $action == "delete")) 

Bạn có thể đọc rằng trong tiếng Anh là "nếu hành động không phải là (hoặc thêm hoặc loại bỏ), sau đó".

1

Bạn đang nói "nếu nó không được đặt hoặc khác với tính năng thêm hoặc khác với xóa". Bạn nhận ra rằng a != x && a != y, với x != y nhất thiết là falsea không được đồng thời hai giá trị khác nhau.

8

Bất kể hành động $ là gì, nó sẽ luôn không được "thêm" HOẶC không bị "xóa", đó là lý do tại sao điều kiện if luôn chuyển. Những gì bạn muốn là sử dụng & & thay vì ||:

(!isset($action)) || ($action !="add" && $action !="delete")) 
+0

xin lỗi, tôi không nghĩ rằng đây là đúng cách –

+0

@ dumbledor Tôi nghĩ rằng đây là cách dễ nhất để sửa đổi mã ban đầu của tôi và giải thích những gì tôi đã làm sai. – BandonRandon

0

để tham khảo trong tương lai, bạn có thể nhanh chóng tạo ra một bảng sự thật để kiểm tra xem nó đánh giá theo cách bạn muốn ... đó là loại giống như sudoku.

(!isset($action)) && ($action !="add" && $action !="delete"))

dụ:

column 1 is issetaction, column 2 and 3 evaluates !="add","delete" respectively

if($a=add) T && (F && T) => T && F => FALSE

if($a=delete) T && (T && F) => T && F => FALSE

if($a=nothing) T && (T && T) => T && T => TRUE

0
if(!(isset($action) && ($action =="add" || $action =="delete"))) 


tôi nghĩ rằng đây là cách tốt nhất và đơn giản nhất để làm điều đó

0

không phải là một câu trả lời nhưng chỉ trong rượu sake mã định dạng

if((isset($_GET['a'])) $action=$_GET['a']; else $action =""; 
if(!($action === "add" OR $action === "delete")){ 
    header("location: /index.php"); 
    exit; 
} 

lưu ý exit; tuyên bố sau tiêu đề(). đó là điều quan trọng. header() không chấm dứt thực hiện kịch bản

2

Bạn cũng có thể thử:

if ((!isset($action)) || !($action == "add" || $action == "delete")) { 
    // Do your stuff 
} 
Các vấn đề liên quan