PHP函数'return'没有返回

时间:2010-10-05 02:29:44

标签: php function

这对我来说有点奇怪。 PHP是我的强项,我通常可以找出遇到的任何问题。

我有一个多年来一直使用的自定义框架。我已经把它重写了,我做的一切都和以前一样。问题在于以下构造:

function ModPages_GetPage() {
    $page = ModPages_GetPageByName($_GET['page_name']);
    if($page != false) {
        include(TPL_DIR.'pages/pages.view.php');
    } else {
        ErrorMessage('Invalid Page', 'The selected page could not be found.');
    }
}


function ModPages_GetPageByName($page_name = null) {
    $db = new Database;
    $query = '
        SELECT *
        FROM pages
        WHERE page_name = "'.CleanStr($page_name).'"
            AND page_enabled = "yes"
        LIMIT 1
        ';
    $page = $db->GetRow($query);

    return $page;
}

此代码使用'home'调用$_GET['page_name']的值。对ModPages_GetPageByName()的调用工作正常,但$pageModPages_GetPage()的值未设置。事实上,在该调用之后抛出的任何调试语句都无法显示任何内容。

我将display_errors设置为onerror_reporting设置为E_ALL。我从我的数据库类中得到了一些通知,但就是这样。

在shell上运行脚本无法产生任何错误。使用strace时,我确实看到该进程吐出'exit_group(255)'。

这个让我很困惑。我可以肯定在这方面有一些方向。

8 个答案:

答案 0 :(得分:1)

我认为这是你的查询,你不应该只返回页面名而不是星号吗?因为star(*)会返回一个可能作为值传回的数组?只是我的猜测。

$query = '
        SELECT *
        FROM pages
        WHERE page_name = "'.CleanStr($page_name).'"
            AND page_enabled = "yes"
        LIMIT 1
        ';

如果你在$ page返回上执行print_r,我认为它应该是一个数组

$page = $db->GetRow($query);
echo "Page:<pre>".print_r($page,true)."</pre><br />\n";

然后可能会返回类似这样的内容

return $page['page_name_field'];

答案 1 :(得分:0)

在我们找到解决方案之前,我们首先要确保在设置$ page变量之前,首先只需回显$_GET['page_name']以查看是否收到了值。

<强> PK

答案 2 :(得分:0)

您的脚本是在数据库调用后立即停止,还是只是不显示任何输出?

如果第一个为真,那么它看起来像是一个致命的错误。使用E_ALL,它应该显示,你确定display_errors和error_reporting就像你说那时,并且GetRow函数不会以任何方式改变它们吗?如果是这样,也许Apache错误日志中存在某些内容(有时会在那里记录PHP错误)。

如果后者为真,我正在考虑在被调用的方法中抛出异常,并捕获更高级别的函数。要检查这一点,您可以在try / catch块中放置数据库调用(即:出错的地方),看看是否到达了catch块。

答案 3 :(得分:0)

我会尝试以下:

  • 用$ _REQUEST替换$ _GET(也许你的表单正在使用POST?)
  • 执行 print_r 检查变量的内容。
  • 使用mysql_error查看任何错误,或在浏览器中打印mysql查询,将其复制/粘贴到phpmyadmin中,是否返回任何内容?错误..数据?
  • 类似的事情发生在我身上一次,我的框架用ANSI编码,我的调用php文件是UTF8 + BOM ...我把所有东西都改成了UTF8 + BOM并且工作正常。
  • 尝试不同的浏览器,我知道它可能不是浏览器问题,但可能是你的脚本缓存在某个地方。
  • 你在使用一些缓存吗?像eaccelerator?

答案 4 :(得分:0)

这些功能是否在课堂上?如果是这样,您将需要$ page = $ this-&gt; ModPages_GetPageByName()。

另外,我会在ModPages_GetPageByName()中回显出参数和sql语句。这样您就可以验证它不是SQL错误。

答案 5 :(得分:0)

我无法确定您的代码无法正常工作,但我可以提出一些可能有助于查找错误的建议。

我注意到的第一件事是你没有检查$ db实际上是否包含一个有效的数据库。我不知道你的数据库对象的细节,但我假设有一些机制在那里检查它是否实际连接到数据库。您应该使用它来确定数据库是否已连接,然后再对其运行查询。

$db = new Database ();
if ($db -> isConnected ())
{
    $query = 'SELECT * (etc etc etc)';
    // ...
}
else
{
    // Put some kind of DB connection error notification or throw an exception here
}

只是在风格上,你不需要在返回之前存储数据库查找的结果,除非你计划在返回之前对结果进行一些处理。您可以直接返回查找。当然,这只是一种风格选择,但它节省了一两行:)

return ($db->GetRow($query));

运行getpage函数后,我强烈建议使用var_dump()结果。即使你的函数返回NULL,你仍然会在var_dump中看到这个。如果有疑问,请将其丢弃:)。我还建议安装xdebug以使var_dump输出更具可读性。

$page = ModPages_GetPageByName($_GET['page_name']);
var_dump ($page);

我还强烈建议在执行之前对你的查询进行var_dumping,以确保你正在运行你认为正在运行的查询。将输出的查询复制并粘贴到sqlyog或phpmyadmin或您用于交互式访问数据库的任何内容中,并确保它返回您认为应返回的内容。

要检查的其他事项,您尝试返回的页面实际设置为page_enabled ='yes'? page_enabled列是否实际将值存储为“yes”,还是bool或整数或其他内容?是启用还是禁用魔术引号?如果他们处于一种状态,当你认为他们在另一种状态时,他们会引起混乱。实际上是否有错误报告给浏览器?在脚本顶部添加一行,确保失败只是为了确保,就像在整数上尝试foreach一样。如果您没有看到错误,则可能未正确配置错误报告。我知道这些是显而易见的问题,但我也知道,如果你没有从查询中获得预期,那么忽略显而易见的问题是多么容易。

答案 6 :(得分:0)

你确定没有设置$ page,还是只是你的调试指令没有打印任何东西?尝试记录到文件或数据库;也许你的代码触发了输出缓冲或类似的东西。

此外,您在声明之前调用ModPages_GetPageByName。这通常是可以的,但可能不是在特殊情况下(例如,当代码包含在if块中时)。尝试交换两者。

此外,请检查您的环境并禁用操作码缓存和其他可能的错误源。例如,APC可以在更改PHP文件后很长时间调用旧版本的脚本。

答案 7 :(得分:0)

虽然你们中的一些人已经付出了额外的努力来回应这个问题,但即使考虑到我提供的细节,也没有人能够看到全貌。我一直无法将问题追溯到其来源,但已转移到另一个项目。