Это мой сценарий switch-case:

switch ($_GET['page'])
{
case '?users':
.....
default: echo 'Welcome';

   }

Этот скрипт работает нормально, но когда я загружаю страницу в первый раз, он возвращает ошибку:

Notice: Undefined index: page in

Я знаю почему, потому что скрипт не знает, что такое значение. Как установить значение по умолчанию и избежать ошибки?

0
Klapsius 28 Авг 2014 в 12:06
10
Перед переключателем $page = isset($_GET['page']) ? $_GET['page'] : '';
 – 
Debflav
28 Авг 2014 в 12:08
1
Что Debflav имеет в виду, так это то, что в массиве $_GET нет элемента для ключа page, поэтому вам нужно убедиться, что там что-то есть, даже пустая строка.
 – 
Francisco Presencia
28 Авг 2014 в 12:10
2
ТАКЖЕ: для whatever.php?page=users значение $_GET['page'] будет users НЕ ?users
 – 
Sharky
28 Авг 2014 в 12:10
Решать. Переключатель спасибо (isset($_GET['page']) ? $_GET['page'] : '') {
 – 
Klapsius
28 Авг 2014 в 12:12
1
Спасибо, чтобы быть более конкретным. мне иногда лень :D
 – 
Debflav
28 Авг 2014 в 12:13

2 ответа

Лучший ответ

Используйте isset(): EDITED

if(isset($_GET['page'])){
    switch ($_GET['page'])
    {
    case 'users':
    .....
    default: echo 'Welcome';

       }
}
2
Suchit kumar 28 Авг 2014 в 12:23
1
-1 Из документации isset(): Returns TRUE if var exists and has value other than NULL, FALSE otherwise. Как можно ты false == '?users'?
 – 
Francisco Presencia
28 Авг 2014 в 12:11
Presencia я редактировал, поэтому понизил голос.
 – 
Suchit kumar
28 Авг 2014 в 12:13
Потому что ваш предыдущий код был явно неверным (вы не должны переключать true/false). Теперь я отменил отрицательный голос.
 – 
Francisco Presencia
28 Авг 2014 в 12:14
Оператор case по-прежнему неверен, если только строка запроса не index.php?page=?users, что было бы нелогично/странно, если бы это было так.
 – 
ʰᵈˑ
28 Авг 2014 в 12:16

1a) Убедитесь, что индекс page существует

if( array_key_exists('page', $_GET) ) {

}

1b) Установите значение по умолчанию

$_GET['page'] = array_key_exists('page', $_GET) ? $_GET['page'] : '';

2) Ваше утверждение неверно

case 'users' :
 //...
break;

3) Весь код вместе

$_GET['page'] = array_key_exists('page', $_GET) ? $_GET['page'] : '';
  switch ($_GET['page']) {
      case 'users':
              //...
      break;
      default: 
              echo 'Welcome';
      break;
   }

Подсказки

  • Убедитесь, что вы break; блок case.
  • Всегда проверяйте наличие индексов перед тем, как использовать их вслепую
4
ʰᵈˑ 28 Авг 2014 в 12:10
default также нуждается в break;? Это новость для меня. Ну, может быть, я никогда не ставил его, так как он всегда последний case, так что все в порядке.
 – 
Francisco Presencia
28 Авг 2014 в 12:16
2
Не использовать break;. default не нуждается в разрыве только в том случае, если это последний случай, но делать так, как я, это в основном привычка и несколько легче читать, потому что каждый случай находится в униформе ( случай -> новая строка (с отступом ) -> новая строка break). ИДК... :P
 – 
ʰᵈˑ
28 Авг 2014 в 12:19
Я поставил последний break также. Действительно, я думаю, что он необязательный. +1 за развернутый ответ.
 – 
Debflav
28 Авг 2014 в 12:21
Спасибо, @Debflav :) (Последний случай не нуждается в разрыве, и значение по умолчанию не всегда является последним - из-за странного/нелогичного написания кода)
 – 
ʰᵈˑ
28 Авг 2014 в 12:23