2010-07-31 25 views
8

यह मेरा सर्वर स्थापित करने का तरीका हो सकता है लेकिन मैं दीवार के खिलाफ अपने सिर को टक्कर लगी हूं। मैं जो करने की कोशिश कर रहा हूं वह यह कहता है कि यदि $action का कोई मूल्य नहीं है या उसके पास कोई मान है जो "add" या "हटाएं" नहीं है, तो कोई त्रुटि होने के अलावा स्क्रिप्ट को चलाना जारी रखें। हालांकि, मुझे कोई त्रुटि नहीं है इससे कोई फर्क नहीं पड़ता कि $action क्या है।php अगर बयान नहीं

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

$action ठीक से सेट किया जा रहा है और अगर if($action =="add") की तरह कुछ चलाने के यह काम करता है। यह मेरे स्थानीय मेजबान पर है इसलिए एक सेटिंग मुद्दा हो सकता है।

+1

जाँच $ कार्रवाई सेट है, तो आप पिछले लाइन –

+0

छर्रों पर यह निर्धारित करते हैं, अगर कुछ भी नहीं है में कोई मतलब नहीं है url '$ action' का '_ = xxx"' भाग 'शून्य होना चाहिए। मुझे लगता है कि अगर मैं स्थिर वैरिएबल में '$ action' सेट कर रहा था तो आप सही होंगे। फिर भी, क्योंकि उपयोगकर्ता डेटा में प्रवेश करता है, समस्याओं के लिए एक मौका है। यदि मैं गलत हूं तो मुझे सही करों। – BandonRandon

+0

ओह, मेरा बुरा। जारीकर्ता() शून्य चर पर झूठी वापसी। वैसे भी आपको यह जांचना चाहिए कि $ _GET ['a'] सेट है, $ action नहीं। या आपको "अपरिभाषित अनुक्रमणिका" त्रुटि मिल जाएगी। –

उत्तर

17

आपका तर्क थोड़ा सा है। दूसरा ||&& होना चाहिए:

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

आप देख सकते हैं क्यों अपने मूल लाइन एक नमूना मूल्य आज़माकर विफल रहता है। मान लें कि $action"delete" है। यहां बताया गया है कि स्थिति चरण-दर-चरण कैसे कम हो जाती है:

// $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) 

ओह! स्थिति बस सफल हुई और "त्रुटि" मुद्रित हुई, लेकिन यह असफल होने वाला था। वास्तव में, यदि आप इसके बारे में सोचते हैं, तो कोई फर्क नहीं पड़ता कि $action का मान क्या है, दो != परीक्षणों में से एक सत्य वापस आ जाएगा। || से && पर स्विच करें और फिर अंतिम पंक्ति में दूसरा if (true && false) बन जाता है, जो if (false) पर ठीक से कम हो जाता है।

|| का उपयोग करने का एक तरीका है और रास्ते में परीक्षण कार्य है। आप सब कुछ De Morgan's law का उपयोग कर नकारना करने के लिए, यानी .:

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

आप पढ़ सकते हैं कि अंग्रेजी में "के रूप में करता है, तो कार्रवाई नहीं है (या तो जोड़ने या निकालने), तो" है।

1

आप कह रहे हैं "अगर यह सेट नहीं है या यह जोड़ने से अलग है या यह अलग से अलग है"। आपको पता है कि , x != y के साथ falsea एक साथ दो अलग-अलग मान नहीं हो सकता है।

8

कोई फर्क नहीं पड़ता कि $ action क्या है, यह हमेशा "जोड़" नहीं होगा या "हटाएं" नहीं होगा, यही कारण है कि यदि स्थिति हमेशा गुजरती है। यह एक तरह की सुडोकू की तरह है

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

क्षमा करें, मुझे नहीं लगता कि यह सही तरीका है –

+0

@ डंबलर मुझे लगता है कि यह मेरे मूल कोड को संशोधित करने और यह समझाने का सबसे आसान तरीका था कि मैंने क्या किया। – BandonRandon

0

भविष्य में संदर्भ के लिए, आप जल्दी से एक सच तालिका अगर यह जिस तरह से आप चाहते हैं का मूल्यांकन करता है की जाँच करने के बना सकते हैं ...: क्या आप चाहते हैं || के बजाय & & उपयोग करने के लिए है।

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

उदाहरण:

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"))) 


मुझे लगता है कि यह है, लेकिन यह

0

नहीं एक जवाब करने के लिए सिर्फ कोड की खातिर में सबसे अच्छा और आसान तरीका है स्वरूपण

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

नोट exit; शीर्षलेख के बाद कथन()। यह महत्वपूर्ण बात है। हैडर() को समाप्त नहीं करते स्क्रिप्ट निष्पादन

2

आप भी आजमा सकते:

if ((!isset($action)) || !($action == "add" || $action == "delete")) { 
    // Do your stuff 
} 
संबंधित मुद्दे