2014-02-20 33 views
0

我有一個簡單的函數,可以切換表中的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

回答

0

本想回來,並關閉:

從我以前的錯誤中汲取教訓,並能恢復不包含此錯誤的備份。最有可能的原因是導致腳本以非預期方式執行的語法錯誤。本來希望找到根本原因以確保它不會再發生,但是已經花費在這個問題上的時間已經花費了太多時間。

對於未來的旅行者:一定要在嘗試使用它們之前檢查你的變量是否已設置。另外,對於使用單獨模板腳本的WebDev,請確保您的腳本在呼出所需的HTML之後清楚地調用退出。否則,如果控制塊配置不正確,它將返回並繼續執行。

+0

而不是備份,使用版本控制系統可以輕鬆查看不同版本的代碼之間的差異! – Csq

+0

是的,我相信這將是下一步!謝謝。 – SilverFox

0

呼叫

exit; 

立即終止PHP腳本發射只是東西,已經被使用echoprint產生。

在您的情況下exit;使用無輸出終止腳本。

+0

我瞭解EXIT;終止腳本。我把它放在那裏,以便我可以看到var_dump();的值是什麼。在第一次復飛時這是正確的。如果EXIT不在那裏,腳本似乎執行兩次,正確的值被替換爲不正確的值並傳遞給showPage()。 – SilverFox

+0

截至我寫評論的時候,在退出之前沒有var_dump()。 – SteAp

-1

這將幫助大家知道showPage()函數中的變量會發生什麼。從這裏我不知道它是否刷新變量的值或它在顯示之前如何使用它。

+0

這是一條評論,不是答案! – miken32

+0

showPage()只是一個模板函數,現在回顯$ user_data。沒有刷新。爲了清晰起見,我編輯了代碼。感謝您花時間。 – SilverFox

+0

我爲什麼要將$ id值更改爲數組以查詢您有點困惑。無論哪種方式,您都需要確保解除引用返回的結果,因爲它也是一個數組,因爲使用了'$ statement-> fetchAll();' –