在解析/解释期间执行PHP函数?

问题描述:

我有一个简单的函数,可以切换表中的ON/OFF 1位列,我知道它工作正常,但似乎是执行两次。
在解析/解释期间执行PHP函数?

// toggleFunction($variable) toggles the value and returns the new result 
// and is placed BEFORE the EXIT to see what value it returns. It is ommitted in the 
// second block below because I only want it to run once, and then EXIT through  
// showPage(); 

// #1 
// TOGGLES ONCE CORRECTLY BUT THE PAGE IS NOT DISPLAYED BECAUSE IT DOES NOT REACH 
// showPage(); 

... 
if(isset($variable)) 
{ 
    var_dump($class->toggleFunction($variable)); 
    EXIT; 
    $user_data = $class->toggleFunction($variable); 
    $class->showPage($user_data); 
} 


// #2 
// APPEARS TO TOGGLE TWICE AND DISPLAYS INCORRECT VALUE ON PAGE 

... 
if(isset($variable)) 
{ 
    $user_data = $class->toggleFunction($variable); 
    $class->showPage($user_data); 
} 


function showPage($user_data) 
{ 
     echo $user_data; 
     EXIT; 
} 

function toggleFunction($id) 
{ 
    try{ 
    $array = array($id); 
    $query = "UPDATE table SET ONOFF = ONOFF XOR 1 WHERE id=?;"; 
    $stmt = $pdo_conn->prepare($query); 
    $stmt->execute($array); 

    $query = "SELECT ONOFF FROM table WHERE id=?;"; 
    $stmt = $connection->prepare($query); 
    $stmt->execute($array); 
    $result = $statement->fetchAll(); 
    return $result; 
    } 
    catch{ 
    ... } 
} 


调试:配售的var_dump()的,退出的显示,没有任何HTML格式得到正确的值,但随后的页面出现刷新(即使有绝对没有刷新调用)出现切换前的错误(原始)值。我认为这是因为它正在更新值两次(来回更改),所以看起来没有变化。其他调试技术显示,在第一次切换尝试失败后,该页面刷新期间该功能正常工作。

最后提到:我对解析和执行阶段(分配内存,分配变量等)的知识很低到平庸。我在之前的其他Web脚本活动中已经注意到了这一点,但从未发现它为什么在第一次传递期间似乎实际执行代码。最初,这导致我放置多个isset()块以确保$ _GET和其他变量实际存在,但这似乎不是问题。我还在需要时使用include_once()的脚本开头。

+0

发布您的代码。如果你说'toggleFunction()'应该执行的动作执行两次,任何想帮助你的人都需要知道'toggleFunction()'在做什么。 – miken32

+0

我觉得太多的代码只会混淆。将编辑。 – SilverFox

+0

此外,它会帮助发布实际的代码,而不是“测试”代码(它甚至不会解析;你在那里缺少一个=)并解释输入,实际输出和预期输出。 – miken32

本想回来,并关闭:

从我以前的错误中汲取教训,并能恢复不包含此错误的备份。最有可能的原因是导致脚本以非预期方式执行的语法错误。本来希望找到根本原因以确保它不会再发生,但是已经花费在这个问题上的时间已经花费了太多时间。

对于未来的旅行者:一定要在尝试使用它们之前检查你的变量是否已设置。另外,对于使用单独模板脚本的WebDev,请确保您的脚本在呼出所需的HTML之后清楚地调用退出。否则,如果控制块配置不正确,它将返回并继续执行。

+0

而不是备份,使用版本控制系统可以轻松查看不同版本的代码之间的差异! – Csq

+0

是的,我相信这将是下一步!谢谢。 – SilverFox

呼叫

exit; 

立即终止PHP脚本发射只是东西,已经被使用echoprint产生。

在您的情况下exit;使用无输出终止脚本。

+0

我了解EXIT;终止脚本。我把它放在那里,以便我可以看到var_dump();的值是什么。在第一次复飞时这是正确的。如果EXIT不在那里,脚本似乎执行两次,正确的值被替换为不正确的值并传递给showPage()。 – SilverFox

+0

截至我写评论的时候,在退出之前没有var_dump()。 – SteAp

这将帮助大家知道showPage()函数中的变量会发生什么。从这里我不知道它是否刷新变量的值或它在显示之前如何使用它。

+0

这是一条评论,不是答案! – miken32

+0

showPage()只是一个模板函数,现在回显$ user_data。没有刷新。为了清晰起见,我编辑了代码。感谢您花时间。 – SilverFox

+0

我为什么要将$ id值更改为数组以查询您有点困惑。无论哪种方式,您都需要确保解除引用返回的结果,因为它也是一个数组,因为使用了'$ statement-> fetchAll();' –