2011-10-24 9 views
31

मेरे लिए एक नई समस्या उत्पन्न हुई है क्योंकि मैंने अपनी स्क्रिप्ट को एक अलग PHP सर्वर पर चलाने की कोशिश की है।

मेरे पुराने सर्वर पर निम्न कोड ठीक काम करने लगता है - भले ही s पैरामीटर घोषित नहीं किया गया हो।

<?php 
if ($_GET['s'] == 'jwshxnsyllabus') 
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',   '../bibliographies/jwshxnbibliography_')\">"; 
if ($_GET['s'] == 'aquinas') 
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
if ($_GET['s'] == 'POP2') 
echo "<body onload=\"loadSyllabi('POP2')\">"; 
elseif ($_GET['s'] == null) 
echo "<body>" 
?> 

लेकिन अब, अपने स्थानीय मशीन (XAMPP - अपाचे) पर एक अपने स्थानीय सर्वर पर मैं पाने त्रुटि निम्नलिखित जब s के लिए कोई मूल्य नहीं परिभाषित किया गया है।

Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 43 
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 45 
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 47 
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 49 

मैं क्या स्क्रिप्ट अगर एक मूल्य s के लिए घोषित किया जाता है कुछ जावास्क्रिप्ट कार्यों कॉल करने के लिए क्या करना चाहते हैं, लेकिन अगर कुछ भी नहीं घोषित किया जाता है मैं सामान्य रूप से लोड करने के लिए पेज चाहते हैं।

क्या आप मेरी मदद कर सकते हैं?

+2

नए सर्वर डिबग नोटिस सक्रिय है। 'Php.ini' में' error_reporting' के लिए जांचें। यह उत्पादन सर्वर पर 'E_ALL' नहीं होना चाहिए। – mario

उत्तर

50

त्रुटि रिपोर्टिंग में पिछले सर्वर पर नोटिस शामिल नहीं होंगे, इसलिए आपने त्रुटियों को नहीं देखा है।

आपको यह जांचना चाहिए कि सूचकांक s वास्तव में $_GET सरणी में इसका उपयोग करने से पहले मौजूद है या नहीं।

कुछ इस तरह पर्याप्त होगा:

if (isset($_GET['s'])) { 
    if ($_GET['s'] == 'jwshxnsyllabus') 
     echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',   '../bibliographies/jwshxnbibliography_')\">"; 
    else if ($_GET['s'] == 'aquinas') 
     echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
    else if ($_GET['s'] == 'POP2') 
     echo "<body onload=\"loadSyllabi('POP2')\">"; 
} else { 
    echo "<body>"; 
} 

यह फायदेमंद हो सकता है (यदि आप अधिक मामलों जोड़ने की योजना बनाते) अपने कोड अधिक पठनीय बनाने के लिए एक switch कथन का उपयोग करने के लिए।

switch ((isset($_GET['s']) ? $_GET['s'] : '')) { 
    case 'jwshxnsyllabus': 
     echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',   '../bibliographies/jwshxnbibliography_')\">"; 
     break; 
    case 'aquinas': 
     echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
     break; 
    case 'POP2': 
     echo "<body onload=\"loadSyllabi('POP2')\">"; 
     break; 
    default: 
     echo "<body>"; 
     break; 
} 

संपादित करें: बीटीडब्ल्यू, कोड का पहला सेट मैंने लिखा है कि आपकी पूरी तरह से क्या करना है। ?s= में एक अप्रत्याशित मूल्य का प्रत्याशित परिणाम उत्पादन के लिए होती नहीं <body> टैग या यह एक निरीक्षण था है? ध्यान दें कि स्विच हमेशा <body> पर डिफॉल्ट करके इसे ठीक करेगा।

+2

मुझसे बेहतर समाधान। उस –

+0

के लिए +1 बहुत साफ और उपयोगी – Jeff

0

मैं इससे पहले कि आप आँख बंद करके उन तक पहुँचने आप अपने सरणियों की जाँच की सिफारिश:

if(isset($_GET['s'])){ 
    if ($_GET['s'] == 'jwshxnsyllabus') 
     /* your code here*/ 
} 

एक और (त्वरित) ठीक स्क्रिप्ट के शीर्ष पर इस लिख कर त्रुटि रिपोर्टिंग अक्षम करने के लिए है:

error_reporting(0); 

आपके मामले में, यह बहुत संभव है कि आपके अन्य सर्वर में php.ini में त्रुटि रिपोर्टिंग कॉन्फ़िगरेशन डिफ़ॉल्ट रूप से 0 पर सेट हो।
error_reporting को 0 पैरामीटर के रूप में कॉल करके, आप सभी नोटिस/चेतावनियां और त्रुटियों को बंद कर रहे हैं। अधिक जानकारी के लिए the php manual देखें।

Remeber कि यह एक त्वरित फिक्स है और इसे अनदेखा करने के बजाय त्रुटियों से बचने की अत्यधिक अनुशंसा की जाती है।

+0

सभी त्रुटियों को दबाकर नोटिस से निपटने के लिए बेहतर है –

+1

यह वास्तविक समस्या को छुपाता है लेकिन इसे हल नहीं करता है। यह पूरी तरह से गलत है। – erenon

+1

@erenon: क्या हम इसे आराम दे सकते हैं? कोई वास्तविक समस्या या त्रुटि नहीं है, लेकिन एक नोटिस है। यह परिणाम को प्रभावित नहीं करता है। कृपया कोई परी कथाएं नहीं। – mario

0

आपको जांचना चाहिए wheter सूचकांक यह उपयोग (तुलना)

if (isset($_GET['s']) AND $_GET['s'] == 'foobar') { 
    echo "foo"; 
} 

उपयोग E_ALL से पहले से मौजूद है | विकास के दौरान E_STRICT!

1

पहले चेक करें $_GET['s'] सेट है या नहीं। इस

<?php 
if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') 
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',   '../bibliographies/jwshxnbibliography_')\">"; 
elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') 
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') 
echo "<body onload=\"loadSyllabi('POP2')\">"; 
elseif (isset($_GET['s']) && $_GET['s'] == null) 
echo "<body>" 
?> 

की तरह अपने स्थिति बदल सकते हैं और यह भी ठीक से संभाल अपने ifelse स्थिति

6

जाँच की आदत में जाओ अगर एक चर isset, उदा के साथ उपलब्ध है

if (isset($_GET['s'])) 
{ 
    //do stuff that requires 's' 
} 
else 
{ 
    //do stuff that doesn't need 's' 
} 

आप नोटिस रिपोर्टिंग अक्षम कर सकता है, लेकिन उन्हें काम कर अच्छे स्वास्थ्य है, और आप आप अन्यथा चूक सकते समस्याओं का पता करने के लिए अनुमति दे सकते हैं।

0

से बचें और कुछ और elseifs है,!

$loadMethod = ""; 
if(isset($_GET['s'])){ 
    switch($_GET['s']){ 
     case 'jwshxnsyllabus': 
      $loadMethod = "loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')"; 
     break; 
     case 'aquinas': 
      $loadMethod = "loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')"; 
     break; 
     case 'POP2': 
      $loadMethod = "loadSyllabi('POP2')"; 
    } 
} 

echo '<body onload="'.$loadMethod.'">'; 

स्वच्छ, पठनीय कोड maintainable कोड

+0

यह बेवकूफ है। किसी भी अच्छे टेक्स्ट एडिटर में "मिलान करने वाले ब्रैकेट का पता लगाएं" लेकिन किसी एक को "इस मामले के लिए समाप्त नहीं होना चाहिए"। निश्चित रूप से खराब 'मामला' खराब 'मामला' ब्लॉक है। लेकिन खराब 'अगर' लटका पाने के लिए आसान है। तो अगर यह है! (हाँ मैंने 3 000k LOC लंबे समय के ifs और स्विच दोनों को देखा है। किसी भी समय ifs ले जाएगा) –

4

मैं हमेशा $ _GET और $ _POST सरणियों से पढ़ने के लिए एक उपयोगिता समारोह/वर्ग का उपयोग होने से बचने के लिए हमेशा की जांच करने के अब मैं मानकों के इस संयोजन का उपयोग कर रहा सूचकांक मौजूद है ... ऐसा कुछ चाल करेगा।

class Input { 
function get($name) { 
    return isset($_GET[$name]) ? $_GET[$name] : null; 
} 

function post($name) { 
    return isset($_POST[$name]) ? $_POST[$name] : null; 
} 

function get_post($name) { 
    return $this->get($name) ? $this->get($name) : $this->post($name); 
} 
} 
$input = new Input; 
$page = $input->get_post('page'); 
1

असल में प्रस्तावित उत्तरों में से कोई भी, हालांकि एक अच्छा अभ्यास चेतावनी को हटा देगा।

शुद्धता के लिए, मैं तो निम्न कार्य करें चाहते हैं:

function getParameter($param, $defaultValue) { 
    if (array_key_exists($param, $_GET)) { 
     $value=$_GET[$param]; 
     return isSet($value)?$value:$defaultValue; 
    } 
    return $defaultValue; 
} 

इस तरह, मैं कुंजी चेतावनी ट्रिगर के बिना अस्तित्व के लिए _GET सरणी की जाँच करें। चेतावनियों को अक्षम करना एक अच्छा विचार नहीं है क्योंकि कई बार वे देखने के लिए कम से कम दिलचस्प होते हैं।

$myvar = getParameter("getparamer", "defaultValue") 

इसलिए यदि पैरामीटर मौजूद है, तो आप मूल्य मिलता है, और अगर यह does not, आप DefaultValue मिलती है:

समारोह तुम सिर्फ कर का उपयोग करें।

0

सरल समारोह, GET या POST के साथ काम करता है। इसके अलावा आप एक डिफ़ॉल्ट मान असाइन कर सकते हैं।

function GetPost($var,$default='') { 
    return isset($_GET[$var]) ? $_GET[$var] : (isset($_POST[$var]) ? $_POST[$var] : $default); 
} 
-2

इस के लिए असली जवाब चर जो त्रुटि को दबाने होगा

@$_GET["field"] 
@$_POST["field"] 

यह कुछ धीमी काम करेंगे, लेकिन कोड को साफ रखने से पहले प्रतीक पर एक @ डाल करने के लिए है।

जब कुछ प्रोग्रामर के लिए समय की बचत होती है, और वेबसाइट के उपयोगकर्ताओं के लिए समय की लागत (या अधिक हार्डवेयर की आवश्यकता होती है), यह कितना लोग इसका उपयोग होगा पर निर्भर करता है।

संबंधित मुद्दे