2011-10-24 28 views
31

Một vấn đề mới đã phát sinh đối với tôi khi tôi cố gắng chạy tập lệnh của mình trên một Máy chủ PHP khác.

TRÊN máy chủ cũ của tôi mã sau đây có vẻ hoạt động tốt - ngay cả khi không có thông số s được khai báo.

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

Nhưng bây giờ, trên máy chủ địa phương của tôi trên máy tính địa phương của tôi (XAMPP - Apache) tôi nhận được các lỗi sau khi không có giá trị cho s được định nghĩa.

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 

Những gì tôi muốn xảy ra cho kịch bản để gọi một số chức năng javascript nếu một giá trị được khai báo cho s, nhưng nếu không có gì bị tuyên bố tôi muốn trang để tải xuống bình thường.

Bạn có thể giúp tôi không?

+2

Máy chủ mới đã bật thông báo gỡ lỗi. Kiểm tra 'error_reporting' trong' php.ini'. Nó không nên là 'E_ALL' trên một máy chủ sản xuất. – mario

Trả lời

50

Báo cáo lỗi sẽ không bao gồm thông báo trên máy chủ trước đó là lý do bạn không thấy lỗi.

Bạn nên kiểm tra xem chỉ mục s có thực sự tồn tại trong mảng $_GET trước khi thử sử dụng không.

Something như thế này sẽ là đủ:

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>"; 
} 

Nó có thể mang lại lợi ích (nếu bạn có kế hoạch bổ sung thêm trường hợp) để sử dụng một tuyên bố switch để làm cho mã của bạn dễ đọc hơn.

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; 
} 

EDIT: BTW, bộ mã đầu tiên tôi đã viết bắt chước ý nghĩa của toàn bộ công việc của bạn là gì. Là kết quả mong đợi của một giá trị không mong muốn trong ?s= có nghĩa là để sản lượng không có thẻ <body> hoặc là một giám sát này? Lưu ý rằng công tắc sẽ sửa lỗi này bằng cách luôn đặt mặc định là <body>.

+2

giải pháp tốt hơn tôi. +1 cho rằng –

+0

cảm ơn rất gọn gàng và hữu ích – Jeff

0

tôi khuyên bạn nên kiểm tra các mảng của bạn trước khi bạn mù quáng truy cập chúng:

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

khác (nhanh) Sửa chữa là để vô hiệu hóa các báo cáo lỗi bằng cách viết này trên đỉnh của kịch bản:

error_reporting(0); 

Trong trường hợp của bạn, rất có thể máy chủ khác của bạn có cấu hình báo cáo lỗi trong php.ini được đặt thành 0 làm mặc định.
Bằng cách gọi số error_reporting với 0 làm tham số, bạn sẽ tắt tất cả các thông báo/cảnh báo và lỗi. Để biết thêm chi tiết, hãy kiểm tra the php manual.

Hãy nhớ rằng đây là cách khắc phục nhanh và bạn nên tránh các lỗi thay vì bỏ qua chúng.

+0

Tốt hơn để xử lý thông báo hơn là chặn tất cả các lỗi –

+1

Điều này ẩn vấn đề thực tế nhưng không giải quyết được. Nó hoàn toàn sai. – erenon

+1

@erenon: Chúng tôi có thể vui lòng cho phần còn lại không? Không có vấn đề hoặc lỗi thực sự, mà là một thông báo. Nó không ảnh hưởng đến kết quả. Không có câu chuyện cổ tích xin vui lòng. – mario

0

Bạn nên kiểm tra wheter chỉ số tồn tại trước khi sử dụng nó (so sánh nó)

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

Sử dụng E_ALL | E_STRICT trong khi phát triển!

1

Kiểm tra đầu tiên $_GET['s'] được đặt hay không. Thay đổi điều kiện của bạn như thế này

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

Và cũng xử lý đúng đắn ifelse điều kiện của bạn

6

Nhận được vào các thói quen kiểm tra nếu một biến có sẵn với isset, ví dụ

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

Bạn có thể tắt báo cáo thông báo, nhưng xử lý chúng là vệ sinh tốt và có thể cho phép bạn phát hiện các vấn đề bạn có thể bỏ lỡ.

0

Tránh nếu có, và các trường hợp khác!

$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.'">'; 

sạch, mã có thể đọc được là duy trì đang

+0

Điều đó thật ngây thơ. Bất kỳ trình soạn thảo văn bản nào đều có "Tìm khung phù hợp" nhưng không phải là một trình đơn có "tìm kết thúc cho trường hợp này". Chắc chắn trường hợp 'xấu' là khối' case' xấu. Nhưng xấu 'if' là dễ dàng hơn để có được treo của. Vì vậy, nếu nó là! (Có, tôi đã nhìn thấy cả 3 000k LOC dài Ifs và chuyển mạch. Sẽ mất Ifs bất cứ lúc nào) –

2

Tôi đã có cùng một vấn đề trong localhost với xampp. Bây giờ tôi đang sử dụng sự kết hợp của các thông số:

// Report all errors except E_NOTICE 
// This is the default value set in php.ini 
error_reporting(E_ALL^E_NOTICE); 

php.net: http://php.net/manual/pt_BR/function.error-reporting.php

4

tôi luôn luôn sử dụng một chức năng tiện ích/lớp để đọc từ _GET $ và $ _POST mảng để tránh việc phải luôn luôn kiểm tra chỉ số tồn tại ... Một cái gì đó như thế này sẽ làm các trick.

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

Thực tế không có câu trả lời được đề xuất nào, mặc dù thực hành tốt, sẽ xóa cảnh báo.

Vì lợi ích của tính đúng đắn, tôi muốn làm như sau:

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

Bằng cách này, tôi kiểm tra các mảng _GET cho chìa khóa để tồn tại mà không gây ra các cảnh báo. Nó không phải là một ý tưởng tốt để vô hiệu hóa các cảnh báo bởi vì rất nhiều lần họ ít nhất là thú vị để có một cái nhìn.

Để sử dụng chức năng bạn chỉ cần làm:

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

vì vậy nếu các tham số tồn tại, bạn sẽ có được giá trị, và nếu nó không, bạn sẽ có được defaultValue.

0

Chức năng đơn giản, hoạt động với GET hoặc POST. Ngoài ra, bạn có thể gán giá trị mặc định.

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

Câu trả lời thực cho điều này là để đặt một @ Tại biểu tượng trước khi biến mà sẽ ngăn chặn các lỗi

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

Nó sẽ làm việc một số chậm hơn, nhưng sẽ giữ mã sạch.

Khi điều gì đó tiết kiệm thời gian cho người lập trình và thời gian dành cho người dùng trang web (hoặc yêu cầu phần cứng nhiều hơn), điều đó tùy thuộc vào số người sẽ sử dụng nó.

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