返回不一致结果的PHP开关
我有以下switch语句,它应该返回发送给用户或从用户发送来的消息数组:返回不一致结果的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
<?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,因为无论您将变量放在哪里:在函数调用中,如果或任何地方,如果变量未定义,它都会抛出此错误。默认值用于未识别的iscase
s值,不适用于未定义的变量。@JonathanBender--该错误破坏了开关的功能,因此它不应该正常工作。我知道它没有定义,但不是default
想要捕捉那种东西吗?函数也没有“爆炸”,它只是返回了一些与预期不同的东西。这不是因为它没有赋值,它实际上没有定义为变量。@Jonathan Bender:as$\u GET['folder']
没有定义,它会抛出一个错误,没有这样的变量。这不是开关错误或功能,而是php,因为无论您将变量放在哪里:在函数调用中,如果或任何地方,如果变量未定义,它都会抛出此错误。默认值用于未识别的iscase
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;
}