PHP开关返回不一致的结果

时间:2014-06-02 20:46:34

标签: php

我有以下switch语句,它应返回发送给用户/从用户发送的消息数组:

<?php
// Load libs, verify user
require_once '../bootstrap.php';

switch ($_GET['folder']) {
  case 'inbox':
    $messages = Message::sentToUser($userId);
    break;

  case 'sent':
    $messages = Message::sentByUser($userId);
    break;

  default:
    $messages = Message::sentToUser($userId);
    break;
}

$json = json_encode($messages);
echo $json;

Messages.php

  public static function sentToUser($user_id)
  {
    $messages = DB::table('messages')
                  ->order_by('id', 'DESC')
                  ->where('sent_to_id', '=', $user_id)
                  ->where('show_to_receiver', '=', 1)
                  ->get();

    return ($messages) ? $messages : array();
  }

如果我传入folder param:

,一切正常
[
  {
    id: "1"
    title: "Test Message"
    message: ""
    read: "0"
    date_sent: "2014-05-14 15:08:43"
    date_read: null
    sent_from_id: "5"
    sent_to_id: "40"
  }
]

但是,在默认情况下(没有给出文件夹参数),PHP抛出PHP Notice: Undefined index: folder(预期),并且$messages作为对象返回,而不是数组:

{
  id: "1"
  title: "Test Message"
  message: ""
  read: "0"
  date_sent: "2014-05-14 15:08:43"
  date_read: null
  sent_from_id: "5"
  sent_to_id: "40"
}

如果$messages$_GET['folder']'inbox',我希望将undefined设置为相同的内容。关于不一致的根源的任何想法?

3 个答案:

答案 0 :(得分:4)

$folder = isset($_GET['folder']) ? $_GET['folder'] : '';
switch ($folder) {
...

答案 1 :(得分:1)

这意味着$_GET['folder']未定义,因此您最好使用isset()进行检查 的 P.S。 : 您应该始终验证用户的输入(例如$_GET$_POST

答案 2 :(得分:1)

您没有检查他们是否正在请求有效的文件夹,这可能会变得很重要。如果你按照@ user574632建议的方式做一些事情会更好,但我会添加更多代码。为什么$_GET['folder']为空?为什么它会有不同的价值?您应该考虑这些两个不同的案例。如果文件夹可以为空并且意味着收件箱,那么请在代码中说明。这样就更合适了:

// Acknowledge only for the empty folder if it follows your logic, not for everything
$folder = isset($_GET['folder']) ? $_GET['folder'] : 'inbox';

switch ($folder) {
  case 'inbox':
    $messages = Message::sentToUser($userId);
    break;

  case 'sent':
    $messages = Message::sentByUser($userId);
    break;

  // Other code would cause an exception, error, exit or whatever. LOG THAT.
  default:
    throw new InvalidFolderException("User trying to access an invalid folder");
    break;
}