Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回不一致结果的PHP开关_Php - Fatal编程技术网

返回不一致结果的PHP开关

返回不一致结果的PHP开关,php,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::sen

我有以下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;
如果我传入
文件夹
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注意:未定义索引:文件夹
(预期),并且
$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"
}

如果
$\u GET['folder']
'inbox'
未定义的
,我希望将
$messages
设置为相同的值。关于不一致的根源有什么想法吗?

这意味着未定义
$\u GET['folder']
,因此您最好使用
isset()
来检查它。

P.S.:您应该始终验证用户的输入(如
$\u GET
$\u POST

这意味着未定义
$\u GET['folder']
,因此您最好使用
isset()
来检查它。

P.S.:您应该始终验证用户的输入(如
$\u GET
$\u POST

您没有检查他们是否请求有效的文件夹,这可能会变得很重要。如果按照@user574632的建议做一些事情会更好,但是我会添加更多的代码。为什么

$\u 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;
}

您没有检查他们是否请求有效文件夹,这可能会变得很重要。如果按照@user574632的建议做一些事情会更好,但是我会添加更多的代码。为什么
$\u 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;
}


而且您永远不应该直接访问请求参数!您能否显示函数,以及正确和错误结果的“var_dump()”。很奇怪,一个通知会改变返回类型。你说它是“意外的”或“不一致的”。你能给出不同的结果,让你认为它是不一致的吗?在我看来,它要么会给您一个切换案例,要么会返回一个错误。而且您永远不应该直接访问请求参数!您能否显示函数,以及正确和错误结果的“var_dump()”。很奇怪,一个通知会改变返回类型。你说它是“意外的”或“不一致的”。你能给出不同的结果,让你认为它是不一致的吗?在我看来,它要么会给你一个切换案例,要么会返回一个错误。我知道它没有定义,但是
default
不是为了捕捉这类东西吗?函数也没有“爆炸”,它只是返回了一些与预期不同的东西。这不是因为它没有赋值,它实际上没有定义为变量。@Jonathan Bender:as
$\u GET['folder']
没有定义,它会抛出一个错误,没有这样的变量。这不是
开关
错误或功能,而是php,因为无论您将变量放在哪里:在
函数
调用中,
如果
或任何地方,如果变量未定义,它都会抛出此错误。
默认值
用于未识别的is
case
s值,不适用于未定义的变量。@JonathanBender--该错误破坏了开关的功能,因此它不应该正常工作。我知道它没有定义,但不是
default
想要捕捉那种东西吗?函数也没有“爆炸”,它只是返回了一些与预期不同的东西。这不是因为它没有赋值,它实际上没有定义为变量。@Jonathan Bender:as
$\u GET['folder']
没有定义,它会抛出一个错误,没有这样的变量。这不是
开关
错误或功能,而是php,因为无论您将变量放在哪里:在
函数
调用中,
如果
或任何地方,如果变量未定义,它都会抛出此错误。
默认值
用于未识别的is
case
s值,不适用于未定义的变量。@JonathanBender--该错误破坏了开关的功能,因此它不应该正常工作。虽然这确实使它工作,但我最感兴趣的是它为什么返回某些内容,而不是像预期的那样将其包装到数组中。我本以为开关会出错或返回相同的内容。@JonathanBender我也是,请按照我之前的评论编辑您的问题,我很感兴趣。@JonathanBender可能$messages已经初始化,并且在上述代码之前有一个对象,所以整个开关块不会运行(由于错误)看到旧值了吗?即使缺少的变量是坏的,对PHP来说,它只是一个
通知
,而不是
错误
。如果变量不存在,则该值将替换为
NULL
。在OP的情况下,
switch(NULL)
在语法上是有效的,并且将运行
default
情况。@GigaWatt正确,我刚刚测试并得到了相同的结果。显然,OPs代码或设置出现了一些奇怪的情况。虽然这确实使它工作起来,但我最感兴趣的是它为什么返回一些东西,而不是像预期的那样将其包装到数组中。我本以为开关会出错或返回相同的内容。@JonathanBender我也是,请按照我之前的评论编辑您的问题,我很感兴趣。@JonathanBender可能$messages已经初始化,并且在上述代码之前有一个对象,所以整个开关块不会运行(由于错误)看到旧值了吗?即使缺少的变量不好,但对PHP来说只是
// 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;
}