解決 The script tried to execute a method or access a property of an incomplete object
問題程式執行出現以下錯誤 1Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "MyClass" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in xxx.php on line 4 原因這是因為程式某些操作產生 Incomplete Object(__PHP_Incomplete_Class),並且呼叫了此物件的函式。產生 I ...
PHP 使用者 (會員) 權限設計 - 以位元表示
網路上有人提到這個問題,整理了一下自己提出的回應寫成這篇提供參考。一般做法通常使用資料表紀錄人與權限的關聯,甚至是有群組和角色等更複雜的機制,在檢查是否具有權限時可能要 Join 許多 Table 來達成。而此篇文章則以不同的方式來設計,簡單的以位元的方式來表示使用者具有之權限,並使用 php 與 mysql 實作範例,範例不包含群組和角色等機制。 首先建立一權限資料表包含 index 欄位表示第幾個 bit,型別為 int;name 欄位表示權限的名稱,型別為 varchar,並建立一些權限,例如: Table: authorities index name 1 Authority1 2 Authority2 … … bigint 版本接著於使用者資料表包含一欄位表示具有之權限,例如 authority, 型別為 bigint unsigned,並建立一些使用者,例如: Table: users id authority 1 7 2 1 3 18446744073709551615 Case 1要檢驗使用者1是否具有 Authority ...
PHP 執行外部程式
說明 PHP 如何執行外部程式,以及可能造成無法成功執行的原因,包含 SELinux、php.ini 設定、Sudoer、環境變數路徑和參數問題。在 PHP 中可以使用 shell_exec()、exec()、system() 等函式執行外部程式,但是要注意有些設定可能會限制而無法執行,這裡以 Linux 系統為主要討論,要注意的地方如下: SELinux這是加強系統安全的模組,但沒有特別去設定的話時常會無法讓程式正常運作,而且在 PHP 端沒有任何訊息,例如執行 shell_exec("ls"),沒有任何訊息。不過如果被 SELinux 封鎖的話,在 /var/log/messages 裡面會有類似以下的訊息: 1Aug 10 11:24:48 pc111168 setroubleshoot: SELinux is preventing the sudo from using potentially mislabeled files /bin/ls (ls_exec_t). For complete SELinux messages. run sealert -l ...
PHP 教學 - 運算子 (Operators) - 下
介紹 PHP 中運算子的用法,包含執行運算子 (Execution Operator)、增值 / 減值運算子 (Incrementing / Decrementing Operator)、邏輯運算子 (Logical Operator)、字串運算子 (String Operator)、陣列運算子 (Array Operator) 和型別運算子 (Type Operator)。 執行運算子執行運算子 (Execution Operator) 使用兩個倒斜點 (```) 包夾要執行的指令,注意它並不是單引號,他會將執行結果的輸出回傳,可以存到變數。 123456789// 在 Linux 系統列出檔案$output = `ls al`;// 在 Windows 系統列出檔案$output = `DIR /A`;echo "<pre>{$output}</pre>";// 利用變數作為參數的用法$param = "/A"; // 傳入的參數$output = `D ...
PHP 教學 - 運算子 (Operators) - 上
介紹 PHP 中運算子的用法,包含種類、優先順序、算術運算子 (Arithmetic Operator)、指派運算子 (Assignment Operator)、位元運算子 (Bitwise Operator)、比較運算子 (Comparison Operator)、三元運算子 (Ternary Operator)和錯誤控制運算子 (Error Control Operator)。 簡介種類透過提供一些數值給運算子 (Operator,或運算符) 進行運算,進而得到一個運算結果,可以想成類似函式的回傳,另外被運算的數值稱為運算元 (Operand)。 依據運算元的個數,運算子可以分為三種: 一元運算子,只有一個運算元,例如:!, ++ 等。 二元運算子,包含兩個運算元,大部分都屬於這類。 三元運算子,包含三個運算元,只有 ? : 運算子屬於此類。 而依據性質,可以分為: 算術運算子 (Arithmetic Operator) 指派運算子 (Assignment Operator) 位元運算子 (Bitwise Operator) 比較運算子 (Comparison Operato ...
Maximum execution time of 30 seconds exceeded
問題PHP程式執行一段時間,最後出現以下錯誤訊息: 1Fatal error: Maximum execution time of 30 seconds exceeded in ....php on line ... 原因這表示 PHP 程式執行的時間已經超過 PHP 設定 (max_execution_time) 的最大限制。 解決方案方法一:修改 php.ini 設定找到 1max_execution_time 30 預設為 30 秒,改為較大的值,例如: 1max_execution_time 300 儲存後重新啟動 Apache 即可。 方法二:使用 ini_set() 函式在程式開頭加上 ini_set() 函式去更改本次執行的 max_execution_time,例如: 1ini_set("max_execution_time", "300");
PHP 教學 - 常數 (Constants)
介紹PHP中常術的用法,包含語法、命名規則和魔術常數 (Magic constant)。 語法變數的值會改變而稱為變數,那相對於變數的常數,則是恆常不變的值而稱作常數 (Constant)。常數在宣告之後,就無法再改變它的值,除了魔術常數 (magic constant) 有可能會改變,因為他並非是真正的常數。常數是有大小寫之分,而常數的命名規則和變數一樣,以正規表示法表示如下: 1[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 常數的使用和特性如下: 使用 define() 函式或 const 關鍵字宣告常數 (PHP 5.3.0 之後),但 const 關鍵字無法用在函式中,且和 static 類似,必須直接指定值,不可運算。 常數只能是數值的值,包括布林、整數、浮點數和字串,雖然也可以設為資源,但有可能會出現問題。 使用常數未定義時,會視為字串使用。可以使用 defined() 函式來判斷是否已定義。 和變數不一樣,常數不需要使用錢號 ($) 做開頭。除直接使用外,也可以用 constant() 函式取得常數值。 常數沒有範圍 (或當作是全域) ...
PHP 教學 - 變數 (Variables)
介紹 PHP 變數的用法,包含命名、指派 (assign)、宣告、變數範圍、預定義變數、全域變數、可變變數 (Variable variables)、POST、GET、REQUEST 和 COOKIE。 基礎命名規則變數是由錢號 ($) 開始,後面接著變數名稱,變數名稱有大小寫之分。變數名稱可以是英文字母、數字、底線和十六進位制為 0x7f - 0xff 的字元所組成,但是第一個字元不能是以數字開頭。正規表示法如下: 1[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 一些宣告範例如下: 1234567$User = 'dindin';$user = 'lala';echo "$User, $user"; // 大小寫不同: dindin, lala//$3m = '300cm'; // parse error, 不能是數字開頭$_55 = 66; // 有效的$lälä = '偽物'; // 有效的, 但必須存檔為 ...
PHP 教學 - 資料型態 (Data Type) - 下
介紹 PHP 中的資料型態 (型別),包含字串 (String)、陣列 (Array)、物件 (Object)、資源 (Resource)、NULL,型別的判斷與轉型。 字串 (String)語法字串有四種使用的方式: 單引號 雙引號 Heredoc Nowdoc 以下逐一進行介紹。 單引號以兩個單引號包夾一段文字,表示字串內容,使用單引號的字串有一些特徵如下 (與雙引號比較): 逸出字元 (Escape characters) 只有兩種。 逸出字元 \\ 可省略寫作 \,但不可為最後一個字元 (不建議省略)。 不會對字串中的變數進行解析。 所謂逸出字元是為了某些特別的用途或能以此輸入打不出來的字,而定義的一種使用方式,在此的逸出字元以反斜線 (backslash) 開頭。例如,我們使用單引號做包夾,但字串中如果出現單引號,將會誤判為字串結束單引號,所以使用 \' 來表示字串中的單引號。使用單引號的字串可用的逸出字元如下: 符號 說明 ' 單引號字元。 \ 反斜線字元。 一些使用範例如下: 12345678910echo '基本用法 ...
PHP 教學 - 資料型態 (Data Type) - 上
介紹 PHP 中的資料型態 (型別),包含布林 (Boolean)、整數 (Integer)、浮點數 (Float),型別的判斷與轉型。 簡介型別的種類PHP 有 8 種基本的資料型態 (Data Type) 或簡稱型別 (Type):4種數值 (scalar) 的型別: 布林 (boolean) 整數 (integer) 浮點數 (float 或 double) 字串 (string) 2種複合 (compound) 的型別: 陣列 (array) 物件 (object) 另外兩種特別的型別: 資源 (resource) 空值 (NULL) 為了方便閱讀另外也有幾種虛擬的型別: 混合 (mixed) 數字 (number) 回呼 (callback) 型別的判斷可利用 get_type() 函式取得型別種類或利用 is_xxx() 函式判斷變數是否為此型別( is_xxx() 的 xxx 替換為要判斷的型別,例如:is_integer)。比較特別的是 is_numeric() 函式,當傳入的參數為整數、浮點數或是純數字內容的字串,都回傳 TRUE。 123456789 ...