这对我来说有点奇怪。 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()
的调用工作正常,但$page
中ModPages_GetPage()
的值未设置。事实上,在该调用之后抛出的任何调试语句都无法显示任何内容。
我将display_errors
设置为on
,error_reporting
设置为E_ALL
。我从我的数据库类中得到了一些通知,但就是这样。
在shell上运行脚本无法产生任何错误。使用strace
时,我确实看到该进程吐出'exit_group(255)'。
这个让我很困惑。我可以肯定在这方面有一些方向。
答案 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)
我会尝试以下:
答案 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)
虽然你们中的一些人已经付出了额外的努力来回应这个问题,但即使考虑到我提供的细节,也没有人能够看到全貌。我一直无法将问题追溯到其来源,但已转移到另一个项目。