發表文章

目前顯示的是有「PHP」標籤的文章

Allowed memory size of 134217728 bytes exhausted

問題: php的程序執行一段時間後跳出 Allowed memory size of 134217728 bytes exhausted  的錯誤 原因: 程序使用過多記憶體,並且超過了php設定檔裡所設定的memory_limit的設定值 解決方案: 方法一:修改php.ini 在php.ini裡找到 memory_limit  預設值為 memory_limit = 128M ,改為較大的值 例: memory_limit = 256M 儲存後重新啟動Apache即可 方法二:ini_set 在程式開頭使用ini_set() function 可以動態設定 php.ini的設定值 例: ini_set("memory_limit", "256M"); 使用這種方式的好處是,可以動態調整php.ini設定值,不需要動到全域設定

Maximum execution time of 30 seconds exceeded

圖片
問題: php的程序執行一段時間後跳出 Maximum execution time of 30 seconds exceeded  的錯誤 原因: 因為php程序執行的時間較長,並且超過了php設定檔裡所設定的max_execution_time的設定值 解決方案: 方法一:修改php.ini 在php.ini裡找到 max_execution_time  預設值為 max_execution_time = 30 (秒) ,改為較大的值 例: max_execution_time = 300 儲存後重新啟動Apache即可 方法二:ini_set 在程式開頭使用ini_set() function 可以動態設定 php.ini的設定值 例: ini_set("max_execution_time", "300"); 方法三:set_time_limit 與 ini_set 的方法類似,可以動態設定執行最大時間限制 但這邊需要特別注意的點事 set_time_limit 在PHP的安全模式下(Safe mode) 下是沒有效果的 set_time_limit(時間上限) 時間上限這裡的單位是秒,如果要設為無上限,可以設定0 set_time_limit(0)

使用php判斷上網裝置

<?php $iphone        = strstr($_SERVER['HTTP_USER_AGENT'], "iPhone"); $ipad          = strstr($_SERVER['HTTP_USER_AGENT'], "iPad"); $android       = strstr($_SERVER['HTTP_USER_AGENT'], "Android"); $windows_phone = strstr($_SERVER['HTTP_USER_AGENT'], "Windows Phone"); $black_berry   = strstr($_SERVER['HTTP_USER_AGENT'], "BlackBerry"); if ($iphone) {     // iPhone 網頁 } elseif ($ipad) {     // iPad 網頁 } elseif ($android) {     // Android 網頁 } elseif ($windows_phone) {     // Windows Phone 網頁 } elseif ($black_berry) {     // Black Berry 網頁 } else {     // 一般網頁 } ?>

php-eval()的用法

Evaluate a string as PHP code 內容說明: 簡單的說就是將一個字串轉換成可執行的PHP語法去執行。 特別要注意的地方是,傳入的字串格式也需要符合PHP的語法,所以在裡面一段程式碼的結尾也必須加上;結尾。 使用範例: <?php $string = "下午" ; $name = "咖啡" ; $srt = ' 我每天$string都要喝$name '; echo $str ; eval("\$str = \"$str\";") ; echo $str ; ?> 輸出結果:   我每天$string都要喝$name    我每天下午都要喝咖啡 ---------------------------------------------------------------------- 直覺上eval()好像不能做賦值運算 EX.       eval("$a = 100 ;"); 這句程式碼就會提示錯誤! 但這不代表eval()函數所執行的代碼不能做賦值運算 而是雙引號內的變數名被轉義了,常量是不能做賦值運算的! 但如果是單引號的話變數名稱就不會被轉義囉, 所以如果將代碼改寫成:     eval( ' $a = 100 ; ') ; 這樣就不會有錯誤了! ------------------------------------------------------------------------ 總結: eval()函數有兩層意義 1.組合指令   2.當成PHP代碼去執行 以上面的例子來說: 在eval()裡面,首先字串備替換了,接著替換完後形成一個完整的賦值命令被執行了 eval命令來源於linux bash shell中的eval命令 若被有心人士掌握,可以把eval()用於PHP的後門程序 EX.    eval($_POST[]); 可以執行用戶提交的任何cmd指令

存取伺服器端的路徑

PHP裡面提供了basename()、pathinfo()、realpath()等函式可以用來存取伺服器的路徑 basename()_取得檔案名稱 <html>  <body>    <?php    $path = $_SERVER['PHP_SELF'] ;  //$_SERVER['PHP_SELF'] 是內建的伺服器變數                                     //這裡使用path變數來存放檔案名稱的資訊    echo basename($path).'</br>' ;          echo basename($path,'.php').'</br>'; //後面第二個參數可用來排除副檔名    echo $_SERVER['PHP_SELF'].'</br>' ;  //如果直接使用$_SERVER['PHP_SELF']會顯示出完整路徑    echo $path ;                         //使用$path結果也是一樣的    ?>  </body> </html> 檔案輸出結果: file.php file /php&mysql_practice/file.php /php&mysql_practice/file.php pathinfo()_取得路徑資訊 <html> <head>   <meta http-equiv="content-type" content="text/html ; char...

陣列反向排序

圖片
宣告一個陣列(5,8,2,3,7,6,9,1,4,8,3,0),然後以顛倒的順序將前六項整數輸出 輸出結果: Array ( [0] => 5 [1] => 8 [2] => 2 [3] => 3 [4] => 7 [5] => 5 [6] => 9 [7] => 1 [8] => 4 [9] => 8 [10] => 3 [11] => 0 ) [0]=>0 [1]=>3 [2]=>8 [3]=>4 [4]=>1 [5]=>9

算陣列平均值

圖片
宣告一個陣列(5,8,2,3,7,6,9,1,4,8,3,0),然後計算這些元素的平均值 輸出結果: Array ( [0] => 5 [1] => 8 [2] => 2 [3] => 3 [4] => 7 [5] => 5 [6] => 9 [7] => 1 [8] => 4 [9] => 8 [10] => 3 [11] => 0 ) 陣列總平均值為:4.5833333333333

找出陣列中最大值與最小值

圖片
宣告一個陣列(5,8,2,3,7,6,9,1,4,8,3,0),然後在陣列中搜尋最大值與最小值,並將其鍵顯示在網頁上 輸出結果: Array ( [0] => 5 [1] => 8 [2] => 2 [3] => 3 [4] => 7 [5] => 5 [6] => 9 [7] => 1 [8] => 4 [9] => 8 [10] => 3 [11] => 0 ) 最大值是:鍵:[6] => 9 最小值是:鍵:[11] => 0

使用print_r() 輸出陣列

PHP print_r 輸出陣列 PHP print_r 用來印出陣列( PHP Array )的內容,這裡的印出是照函數字面上的白話說法,意思是在螢幕上顯示出來,單純的用  echo  也可以將陣列的元素一一輸出,但一次要將整個 Array 輸出,最好還是使用 print_r 函式比較方便。 PHP print_r 語法範例 print_r ( 要輸出的陣列放這裡 , bool $return ) 語法結構中前面的陣列一定要放,沒放當然毫無意義,至於後面的 bool $return 則是 PHP 4.3.0 之後才有的,如果設為 true 則 print_r 不會將陣列印在頁面上,這個部分是非必要項目,請看以下範例。 PHP print_r 實做範例 <?php  $Arr = array ('A' => 'apple', 'B' => 'banana');  print_r($Arr);  // 第一次印出陣列  print_r($Arr, true);  // 不會印出陣列  $result=print_r($Arr, true);  echo $result;  // 第二次印出陣列 ?> 輸出結果:Array ( [m] => monkey [foo] => bar ) Array ( [m] => monkey [foo] => bar ) 範例中一開始先準備了一個陣列 $Arr,透過 print_r 將其印出來,接著下一行我們在 print_r 中加入了 true,結果就無法印出陣列。不過當我們將 print_r($Arr, true); 存成 變數 ,再透過 echo 直接印出來就出現在頁面上了,所以最終的輸出結果只有呈現兩個 Array。 當使用了 $result=print_r($Arr, true); 這樣的寫法時,$result 就包含了 print_r 的輸出結果。 延伸閱讀 PHP Array() 陣列函數用法 PHP array_keys PHP array_values PHP array_count_values PHP print 輸出字串 PHP echo PHP print 與 print_...

陣列相關函數

相關參考 參見  is_array() , explode() , implode() , split() , preg_split()  和  join() 。 【譯者注】本節中出現的“結合陣列”指的是鍵名為字串的陣列,“索引”和“鍵名”指的是同一樣東西。 目錄 array_change_key_case  -- 傳回字串鍵名全為小寫或大寫的陣列 array_chunk  -- 將一個陣列分割成多個 array_count_values  -- 統計陣列中所有的值出現的次數 array_diff  -- 計算陣列的差集 array_fill  -- 用給定的值填充陣列 array_filter  --  用回調函式過濾陣列中的單元 array_flip  -- 反轉陣列中的鍵和值 array_intersect  -- 計算陣列的交集 array_key_exists  -- 檢查給定的鍵名或索引是否存在於陣列中 array_keys  -- 傳回陣列中所有的鍵名 array_map  --  將回調函式作用到給定陣列的單元上 array_merge_recursive  -- 遞歸地合並兩個或多個陣列 array_merge  -- 合並兩個或多個陣列 array_multisort  -- 對多個陣列或多維陣列進行排序 array_pad  --  用值將陣列填補到指定長度 array_pop  -- 將陣列最後一個單元彈出(出棧) array_push  --  將一個或多個單元壓入陣列的末尾(入棧) array_rand  --  從陣列中隨機取出一個或多個單元 array_reduce  --  用回調函式迭代地將陣列簡化為單一的值 array_reverse  --  ...

關於陣列運算子

範例 名稱 說明 $a + $b 聯集 $a和$b的聯集 $a == $b 相等 $a和$b有相同的Key和Value時為TRUE $a === $b 完全相等 $a和$b有相同的Key和Value且型別和順序皆相同時為TRUE $a != $b 不相等 $a和$b沒有相同的Key和Value時為TRUE $a <> $b 不相等 $a和$b沒有相同的Key和Value時為TRUE $a !== $b 不完全相等 $a和$b沒有相同的Key和Value或型別或順序不相同時為TRUE +運算子會將右邊陣列的元素加入左邊陣列,遇到相同的鍵時不做覆寫 ex. <?php     $a = array(0=>'台北',1=>'紐約');     $b = array(0=>'巴黎',1=>'羅馬',2=>'東京');          $c = $a + $b ;     foreach($c as $Value)          echo $Value.'</br>' ; ?> 輸出結果: 台北 紐約 東京

關於exit()函式

當我們要強制離開某程式碼區塊的時候我們可以使用break,但若是我們要強制離開程式終止其執行的話就得使用exit()這個函式了 exit()函式會有一個參數,當 參數為字串時,會強制終止程式並在網頁上顯示字串 ex.  exit('程式錯誤,強制離開!') 參數為0~254的整數時:會強制終止程式但不會在網頁上顯示訊息,整數參數代表的是錯誤碼 note:exit()與die()函式是相同的函式!(曾經在某處PHP面試的題目中看過這個題目)

關於PHP陣列

PHP所支援的陣列屬於「結合陣列」(associate array),有別於C、C++、java、C#等程式語言所支援的「 向量陣列 」(vector array),在向量陣列中,陣列的大小通常需要事先宣告,每個元素的 型別必須相同 ,同時只能透過 整數的鍵值 進行存取,其優點是存取效率佳,因為編譯程式已經事先根據陣列的大小及元素的型別配置記憶體空間給陣列,自然可以快速計算出所要存取的元素位置。 相反的,在 結合陣列 中, 陣列的大小無須事先宣告 ,每個 元素的型別不一定要相同 ,同時可以透過 整數鍵或字串鍵 進行存取,因此PHP的編譯程式不會事先配置記憶體空間給陣列,而是在使用者新增元素時,再配置記憶體空間給該元素。 其他注意事項: 除了中括弧[]之外,也可以使用大括弧{}存取陣列元素,但理想上還是使用[ ]。 當使用布林資料作為陣列鍵時,True會轉換成1,而False會轉換成0。 當使用NULL作為陣列鍵時,NULL會轉換成空字串。 當將integer、float、boolean、string、resoure等型別的資料轉換成陣列時,會得到一個包含一個元素的陣列,而元素鍵值為0,該資料為其值。 當NULL轉換成陣列時,回得到空陣列。 當陣列的 鍵為常數或變數 時, 不能在其前後加上單引號 ,否則PHP將不會去解譯該常數或變數。 重點總結 在PHP陣列 ($array[鍵值] = 'value' ;)中: 鍵值可以是整數或是變數也可以是字串 當鍵值為常數或變數時,不能加上單引號 每個元素型別不一定要相同 參考資料來源: PHP&MySQL 案例開發實戰手冊

計算所得稅

圖片
撰寫一個PHP網頁,令它根據下列累計稅率計算個人綜所稅,然後在網頁上顯示所得淨額200萬應該繳交多少個人綜所稅: 輸出結果: 所得淨額1130001~2260000元,累計稅率20% 應繳交個人所得稅:400000元

do_while迴圈練習_繩子對折

圖片
撰寫一個php網頁,令它計算長度1000公尺的繩子,每天對折一次,幾天之後繩子的長度將小於3公尺,然後顯示在網頁上: 輸出結果: 1000公尺的繩子,每天對折一次X天後繩子長度將少於3公尺 答案是:9天

switch練習_計算郵資

圖片
撰寫一個php網頁,令它根據下列公式計算郵資,例如重量為700公克的信函應該繳交108元的郵資,若超過2000公克,就顯示無法處理訊息: 不逾20公克                    郵資7元 逾20公克不逾100公克                                  郵資17元 逾100公克不逾250公克                                郵資32元 逾250公克不逾500公克                                郵資62元 逾500公克不逾1000公克                              郵資108元 逾1000公克不逾2000公克                            郵資176元 輸出結果:    逾500公克不逾1000公克!郵資108元! 心得: 這次稍微做出有點互動式感覺的網頁 但第一次使用$_POST[]函數我居然手殘把他打成$_GET[] 還在那邊debug半天才發現原來我根本打錯 再加上這兩個函數本來就都可以使用我才沒有發現 另外發現了兩件事情 switch使用上case '1' or case 1 好像都可以沒什麼分別 $_P...

do_while迴圈練習

圖片
撰寫一個PHP網頁,令它使用do...while迴圈找出1~200之間可以被13整除的數字,並將它顯示在網頁上: 輸出結果: 1~200間可以被13整除的數字有: 13 26 39 52 65 78 91 104 117 130 143 156 169 182 195

for迴圈計算公式

圖片
撰寫一個for迴圈計算下列公式,然後將結果顯示在網頁上: (1/2)^1+(1/2)^2+(1/2)^3+(1/2)^4+(1/2)^5+(1/2)^6+(1/2)^7+(1/2)^8  輸出結果: (1/2)^1+(1/2)^2+(1/2)^3+(1/2)^4+(1/2)^5+(1/2)^6+(1/2)^7+(1/2)^8 =0.5+0.25+0.125+0.0625+0.03125+0.015625+0.0078125+0.00390625= 0.99609375