Verificar con isset
siempre es recomendable, de lo contrario, tendrás un Undefined index
si intentas a acceder a una clave del $_GET
que no existe.
Por otra parte, no puedes intentar usar variables sin definirlas previamente, por lo que puedes definir los valores de dichas variables en el default
.
Pero, así no queda resuelta la parte del else
(porque el código no entraría en el bloque switch
), debido a que tienes un if
, el cual es innecesario si quieres asignar valores por defecto. El if
tendría sentido si quisieras mostrar otra cosa distinta desde el else
o dirigir el código por otro camino en ese caso o mostrar un mensaje de error.
En cualquier caso, yo lo resolvería usando un array, es más simple y más fácil de mantener.
Veamos todos los casos:
1. Con array, mostrando valores por defecto
/*
Esto reemplaza a los case ...
Si hubiera situaciones nuevas, solamente las agregas aquí
*/
$allData=
array(
'1l'=> array(
'number' => '1 lesson',
'duration' => '1 hour',
'price' => 'usd 6'),
'6l' => array(
'number' => '6 lessons',
'duration' => '1 hour each lesson',
'price' => 'usd 34'),
'12l' => array (
'number' => '12 lessons',
'duration' => '1 hour each lesson',
'price' => 'usd 68'),
'default' => array (
'number' => '',
'duration' => '',
'price' => '')
);
/*
Obtienes la key desde el GET
mediante operador de fusion de null
si tu versión de PHP no lo soporta, usa esto en su lugar
$key=!empty($_GET['id']) ? $_GET['id'] : 'default';
*/
$key=$_GET['id'] ?? 'default';
$html=sprintf(
'<div id="cont_pricing">
<div id="txt_pricing">
<p>
%s
<br/>
<br/>
%s
<br/>
<br/>
%s
</p>
</div>
</div>',$allData[$key]['number'],$allData[$key]['duration'],$allData[$key]['price']);
echo $html;
2. Con array y else (no hay valores por defecto)
/*
Esto reemplaza a los case ...
Si hubiera situaciones nuevas, solamente las agregas aquí
*/
$allData=
array(
'1l'=> array(
'number' => '1 lesson',
'duration' => '1 hour',
'price' => 'usd 6'),
'6l' => array(
'number' => '6 lessons',
'duration' => '1 hour each lesson',
'price' => 'usd 34'),
'12l' => array (
'number' => '12 lessons',
'duration' => '1 hour each lesson',
'price' => 'usd 68')
);
/*
Obtienes la key desde el GET
mediante operador de fusion de null
si tu versión de PHP no lo soporta, usa esto en su lugar
$key=!empty($_GET['id']) ? $_GET['id'] : 'default';
*/
$key=$_GET['id'] ?? null;
if (array_key_exists($key, $allData)) {
$html=sprintf(
'<div id="cont_pricing">
<div id="txt_pricing">
<p>
%s
<br/>
<br/>
%s
<br/>
<br/>
%s
</p>
</div>
</div>',$allData[$key]['number'],$allData[$key]['duration'],$allData[$key]['price']);
} else {
$html="Error. La clave $key no es válida";
}
echo $html;
3. Con switch
(y valores por defecto)
/*
Obtienes la key desde el GET
mediante operador de fusion de null
si tu versión de PHP no lo soporta, usa esto en su lugar
$key=!empty($_GET['id']) ? $_GET['id'] : 'default';
*/
$key=$_GET['id'] ?? 'default';
switch ($key) {
case '1l':
$number = '1 lesson';
$duration = '1 hour';
$price = 'usd 6';
break;
case '6l':
$number = '6 lessons';
$duration = '1 hour each lesson';
$price = 'usd 34';
break;
case '12l':
$number = '12 lessons';
$duration = '1 hour each lesson';
$price = 'usd 68';
break;
default:
$number = '';
$duration = '';
$price = '';
break;
}
$html=sprintf(
'<div id="cont_pricing">
<div id="txt_pricing">
<p>
%s
<br/>
<br/>
%s
<br/>
<br/>
%s
</p>
</div>
</div>',$number, $duration, $price);
echo $html;
4. Con switch
(y else y valores por defecto)
/*
Obtienes la key desde el GET
mediante operador de fusion de null
si tu versión de PHP no lo soporta, usa esto en su lugar
$key=!empty($_GET['id']) ? $_GET['id'] : 'default';
*/
$key=$_GET['id'] ?? null;
if ($key) {
switch ($key) {
case '1l':
$number = '1 lesson';
$duration = '1 hour';
$price = 'usd 6';
break;
case '6l':
$number = '6 lessons';
$duration = '1 hour each lesson';
$price = 'usd 34';
break;
case '12l':
$number = '12 lessons';
$duration = '1 hour each lesson';
$price = 'usd 68';
break;
default:
$number = '';
$duration = '';
$price = '';
break;
}
$html=sprintf(
'<div id="cont_pricing">
<div id="txt_pricing">
<p>
%s
<br/>
<br/>
%s
<br/>
<br/>
%s
</p>
</div>
</div>',$number, $duration, $price);
} else {
$html="Error. No se pasaron datos válidos";
}
echo $html;
De cualquiera de estas formas tu código debería funcionar. Lo fundamental es que:
Deberías primero capturar el valor del dato que viene en el $_GET
, con un ternario o de otro modo.
Si usas switch ... case
deberías prever la situación del default
Si ninguna condición se cumple, debes tener claro qué debe hacer el código en ese caso (por ejemplo, en el caso 4
si el GET tiene una clave id
pero que no vale ninguno de los case, el código tomará los valores por defecto, y sólo entrará en el else
cuando el GET no tenga una clave id
).