2011-10-24 20 views
31

Ha surgido un nuevo problema para mí al intentar ejecutar mi script en un servidor PHP diferente.

En mi servidor anterior, el siguiente código parece funcionar bien, incluso cuando no se declara el parámetro 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>" 
?> 

Pero ahora, en un local de mi servidor en mi máquina local (XAMPP - Apache) me sale el siguiente error cuando no se define ningún valor para 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 

Lo que quiero que pasar para que el script para llamar a ciertas funciones javascript si se declara un valor para s, pero si no se declara Me gustaría que la página se cargue con normalidad.

¿Me puede ayudar?

+2

El nuevo servidor tiene avisos de depuración habilitados. Compruebe si 'error_reporting' en' php.ini'. No debería ser 'E_ALL' en un servidor de producción. – mario

Respuesta

50

El informe de errores no incluirá avisos en el servidor anterior y es por eso que no ha visto los errores.

Debería comprobar si el índice s existe realmente en la matriz $_GET antes de intentar usarlo.

Algo como esto sería suficiente:

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

Puede ser beneficioso (si usted planea en la adición de más casos) para utilizar una declaración switch para que su código sea más legible.

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: Por cierto, el primer conjunto de código que imita lo que escribió el suyo se entiende que ver en su totalidad. Es el resultado esperado de un valor inesperado en ?s= destinado a la salida <body> etiqueta o era esto un descuido? Tenga en cuenta que el modificador lo solucionará siempre con el valor predeterminado <body>.

+2

mejor solución que yo. +1 para ese –

+0

gracias muy limpio y útil – Jeff

0

recomiendo revisar las matrices antes ciegamente acceder a ellos:

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

Otra solución (rápida) es deshabilitar el informe de errores al escribir esto en la parte superior de la secuencia de comandos:

error_reporting(0); 

En su caso, es muy probable que su otro servidor haya configurado el informe de error en php.ini en 0 como predeterminado.
Al llamar al error_reporting con 0 como parámetro, está desactivando todos los avisos/advertencias y errores. Para más detalles, marque the php manual.

Recuerde que esta es una solución rápida y es muy recomendable evitar los errores en lugar de ignorarlos.

+0

Mucho mejor lidiar con el aviso que suprimir todos los errores –

+1

Esto oculta el problema real pero no lo resuelve. Es puramente incorrecto. – erenon

+1

@erenon: ¿Podemos por favor descansar? No hay un problema o error real, sino un aviso. No afecta el resultado. No hay cuentos de hadas por favor. – mario

0

Debe comprobar wheter existe el índice antes de utilizarla (compararlo)

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

Uso E_ALL | E_STRICT mientras se desarrolla!

1

Primero compruebe si el $_GET['s'] está configurado o no. Cambiar sus condiciones como esta

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

Y también manejar adecuadamente sus condiciones ifelse

6

Entrar en el hábito de comprobar si una variable está disponible con isset, por ejemplo,

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

Se podría deshabilita el informe de notificación, pero se trata de ellos es una buena higiene, y puede permitir que usted para detectar problemas que de otro modo podrían perderse.

0

¡Evita if else 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.'">'; 

limpia código, es legible código mantenible

+0

Eso es ingenuo. Cualquier buen editor de texto tiene "Buscar parche correspondiente" pero ninguno tiene "encontrar final para este caso". Claro que el '' caso' malo es malo 'bloque' caso'. Pero malo 'si' es más fácil de agarrar. Entonces si lo es! (Sí, he visto los 3 000k LOC largos Ifs y los interruptores. Tomará Ifs en cualquier momento) –

4

siempre uso una función de utilidad/clase para la lectura de los $ _GET y $ _POST matrices para evitar tener que comprobar siempre el índice existe ... Algo así hará el truco.

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

En realidad, ninguna de las respuestas propuestas, aunque es una buena práctica, eliminaría la advertencia.

En aras de la exactitud, yo haría lo siguiente:

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

De esta manera, puedo comprobar la matriz _GET para la clave de existir sin que se active la alerta. No es una buena idea desactivar las advertencias porque muchas veces son interesantes para echar un vistazo.

Para utilizar la función que acaba de hacer:

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

por lo que si existe el parámetro, se obtiene el valor, y si no funciona, que presentamos lo mejor defaultValue.

0

Función simple, funciona con GET o POST. Además, puedes asignar un valor predeterminado.

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

La verdadera respuesta a esto es poner un símbolo @ A antes de la variable que va a suprimir el error

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

Se trabajará algunos más lento, pero mantendrá el código limpio.

Cuando algo ahorra tiempo al programador y les cuesta tiempo a los usuarios del sitio web (o requiere más hardware), depende de la cantidad de gente que lo use.