有在用AMPPS而且是MAC user的朋友,
可能會發現,自從升級成Mac OS X 10.9 Mavericks後,
打開AMPPS要啟動Apache,怎麼點都沒反應,至於Mysql則沒問題,
所以這陣子都靠terminal代其勞,
打開terminal->
sudo bash /Applications/AMPPS/apache/bin/apachectl start
sudo bash /Applications/AMPPS/apache/bin/apachectl stop
最近AMPPS官方團隊也推出補救方案->AMPPS 2.2,
download->install->it's work!!
2013年12月17日 星期二
2013年11月15日 星期五
[PHP] 用Xdebug協助除錯
寫程式總會碰到除蟲的痛,
僅管PHP算是比較好寫的程式,
但單只靠伺服器吐回來的陽春錯誤訊息,在小程式裡上可以應付,
當寫到規模比較大的程式時,這樣的error是不夠幫助我們除蟲的,
Xdebug,是一個幫助PHP除錯的延伸應用,
除了既有的error message以外,連call stack也會顯示出來,方便許多。
安裝步驟(我以AMPPS為例):
1.先查詢目前所使用PHP的資訊
->2種方法可查詢
a.使用phpinfo()

2.phpinfo get.直接全選+複製所有內容,

3.到Xdebug wizard page,在空格處貼上剛複製的phpinfo,送出後會自動分析所需要的xdebug版本
(當然也可以直接到官網自行選擇所符合的版本下載),

4.自動跳出xdebug.版本.dll的下載點,還有設定說明,

5.下載dll檔到ext folder裡(ex. C:\Ampps\php\ext),

6.打開php.ini,在下方加入以下設定碼->save->finish!
(使用AMPPS,要打開apache下的php.ini喔)
8.隨便測試一個寫錯的程式,Bingo!!

對照沒有xdebug前,原始的error message

僅管PHP算是比較好寫的程式,
但單只靠伺服器吐回來的陽春錯誤訊息,在小程式裡上可以應付,
當寫到規模比較大的程式時,這樣的error是不夠幫助我們除蟲的,
Xdebug,是一個幫助PHP除錯的延伸應用,
除了既有的error message以外,連call stack也會顯示出來,方便許多。
安裝步驟(我以AMPPS為例):
1.先查詢目前所使用PHP的資訊
->2種方法可查詢
a.使用phpinfo()
<?php phpinfo(); ?>b.或進入AMPPS page查詢
2.phpinfo get.直接全選+複製所有內容,
3.到Xdebug wizard page,在空格處貼上剛複製的phpinfo,送出後會自動分析所需要的xdebug版本
(當然也可以直接到官網自行選擇所符合的版本下載),
4.自動跳出xdebug.版本.dll的下載點,還有設定說明,
5.下載dll檔到ext folder裡(ex. C:\Ampps\php\ext),
6.打開php.ini,在下方加入以下設定碼->save->finish!
(使用AMPPS,要打開apache下的php.ini喔)
zend_extension = "C:\Program Files\Ampps\php\ext\php_xdebug-2.2.3-5.3-vc9.dll" xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_host=localhost xdebug.remote_port=90007.Restart Apache!!
8.隨便測試一個寫錯的程式,Bingo!!
對照沒有xdebug前,原始的error message
Ref.
2013年11月5日 星期二
[PHP]CURL常遇錯誤(call to undefined function curl_init)
今天實作php的curl功能,
畢擷取和傳送資料是很重要的功能,
以前有fopen()可以用,後來發現curl更強大,寫起來也更簡潔,
不過在實做時,碰到了這樣的問題,

code is here:
記下解決方法,方便大家參考,
可能原因
1.curl沒被啟用
2.缺少curl.dll檔
首先:
1. 打開php.ini->搜尋"extension=php_curl.dll"->去掉前面的";"->save->即可重啟apache

2. 如果方法1沒有解決問題->同樣在php.ini搜尋"extension_dir"->查目錄位址->到該目錄下檢查是否有"php_curl.dll"->沒有的話就下載 php_curl.dll

->搞定之後->把php目錄中的"libeay32.dll"和"ssleay32.dll"copy至c:\windows\system32裡面->重啟apache
Finish!

成功把Yahoo網頁抓過來了.
畢擷取和傳送資料是很重要的功能,
以前有fopen()可以用,後來發現curl更強大,寫起來也更簡潔,
不過在實做時,碰到了這樣的問題,
code is here:
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, "www.yahoo.com.tw"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $output = curl_exec($ch); curl_close($ch); echo $output; ?>上網google發現是蠻常見的問題,
記下解決方法,方便大家參考,
可能原因
1.curl沒被啟用
2.缺少curl.dll檔
首先:
1. 打開php.ini->搜尋"extension=php_curl.dll"->去掉前面的";"->save->即可重啟apache
2. 如果方法1沒有解決問題->同樣在php.ini搜尋"extension_dir"->查目錄位址->到該目錄下檢查是否有"php_curl.dll"->沒有的話就下載 php_curl.dll
->搞定之後->把php目錄中的"libeay32.dll"和"ssleay32.dll"copy至c:\windows\system32裡面->重啟apache
Finish!
成功把Yahoo網頁抓過來了.
[PHP]辨認USER上網的裝置和瀏覽器
開發網站平台時常常需要考慮到user是用什麼裝置連進來,
因為不同裝置或瀏覽器在支援上會有差異,
(ex. iOS對flash的支援)
或針對行動裝置用戶傳送不同的效果或頁面等,
都可能要用到這樣的判斷,
實際研究後,發現只要在server端做個判斷功能即可。
辨識功能主要透過 $_SERVER[ ] 的回傳資訊和建立一個變數(ex. $browser)來作邏輯判斷。
利用$_SERVER['USER_AGENT']可以回傳user的作業系統和瀏覽器版本。

如果user使用智慧型行動裝置,$_SERVER['HTTP_X_WAP_PROFILE']則會回傳1個link(連結至行動裝置資訊的xml檔),藉由判斷他回傳有無,判別是否來自行動裝置
(據說不是所有行動裝置都會傳送這個link,不過至少到N95都有,所以應該影響不大)
ok,接下來就是code了!
改寫後程式碼如下:
簡單做個html+css頁面讓output美觀點, 假設我想讓mobile-device user看見手機,non-mobile user看見PC, HTML+CSS code:

2. 模擬user來自行動裝置

Reference.
1. User agent WIKI
2. PHP: $_SERVER
3. ASP資料
4. iPhone、Android手機模擬器 (Google Chrome內建)
因為不同裝置或瀏覽器在支援上會有差異,
(ex. iOS對flash的支援)
或針對行動裝置用戶傳送不同的效果或頁面等,
都可能要用到這樣的判斷,
實際研究後,發現只要在server端做個判斷功能即可。
辨識功能主要透過 $_SERVER[ ] 的回傳資訊和建立一個變數(ex. $browser)來作邏輯判斷。
利用$_SERVER['USER_AGENT']可以回傳user的作業系統和瀏覽器版本。
如果user使用智慧型行動裝置,$_SERVER['HTTP_X_WAP_PROFILE']則會回傳1個link(連結至行動裝置資訊的xml檔),藉由判斷他回傳有無,判別是否來自行動裝置
(據說不是所有行動裝置都會傳送這個link,不過至少到N95都有,所以應該影響不大)
ok,接下來就是code了!
改寫後程式碼如下:
<?php
//Detect mobile user client
function checkMobile() {
$mbBrowser = 0;
$userAgent = $_SERVER['HTTP_USER_AGENT']; //取得用戶端的使用環境
$accept = $_SERVER['HTTP_ACCEPT'];
//"i" 不區分大小寫
if (preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|android)/i',
strtolower($userAgent))) {
$mbBrowser++;
}
//非行動裝置
if (strpos(strtolower($userAgent),'windows') > 0) {
$mbBrowser = 0;
}
//有HTTP_X_WAP_PROFILE則必是行動裝置
if ((strpos(strtolower($accept),'application/vnd.wap.xhtml+xml') > 0)
or ((isset($_SERVER['HTTP_X_WAP_PROFILE'])
or isset($_SERVER['HTTP_PROFILE'])))) {
$mbBrowser++;
}
//額外放入暴力判斷
$mobileSource = strtolower(substr($userAgent, 0, 4));
$mbArray = array(
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
'wapr','webc','winw','winw','xda ','xda-'
);
if (in_array($mobileSource,$mbArray)) {
$mbBrowser++;
}
//ALL_HTTP是ASP的variable
if (strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini') > 0) {
$mbBrowser++;
}
if ($mbBrowser > 0) {
return true;
} else {
return false;
}
}
?>
next, test it!簡單做個html+css頁面讓output美觀點, 假設我想讓mobile-device user看見手機,non-mobile user看見PC, HTML+CSS code:
<html>
<head>
<title>Detect Mobile Test</title>
<style type="text/css">
#pic {
z-index:1;
position: absolute;
left:0px;
top:0px;
}
#word {
position: absolute;
font-size:120%;
z-index:2;
left:65px;
top:100px;
}
</style>
</head>
<body>
<?php
if(checkMobile()) {
echo '<div id="word">by Mobile</div>';
echo '<div id="pic"><img src="./mobile.jpg" /></div>';
}
else {
echo '<div id="word">by PC</div>';
echo '<div id="pic"><img src="./monitor.jpg" /></div>';
}
?>
</body>
</html>
1. 模擬user來自非行動裝置2. 模擬user來自行動裝置
Reference.
1. User agent WIKI
2. PHP: $_SERVER
3. ASP資料
4. iPhone、Android手機模擬器 (Google Chrome內建)
2013年10月27日 星期日
[PHP]利用IF-ELSE將秒數自動轉換成小時分鐘秒
在處理時間性資料(time-dependent)時,
有時候外部傳來的時間格式只有秒,如8590秒,
或如time()回傳的時間戳,
為方便進一步使用時間變項或顯示給user,因此常需要做時間的轉換,
其實PHP提供有date(),gmstrftime()等時間處理函數,
這邊隨手記錄下,實作此類function的筆記!
有時候外部傳來的時間格式只有秒,如8590秒,
或如time()回傳的時間戳,
為方便進一步使用時間變項或顯示給user,因此常需要做時間的轉換,
其實PHP提供有date(),gmstrftime()等時間處理函數,
這邊隨手記錄下,實作此類function的筆記!
<?php
//將秒數自動轉換成小時分鐘秒
//Convert secs to string of day hours and mins
function convertSecToStr($secs) {
if($secs >= 86400) {
$days = floor($secs / 86400);
$secs = $secs%86400;
$r .= $days.' day';
if($days <> 1) {
$r .= 's';
}
if($secs > 0) {
$r .= ', ';
}
}
if($secs >= 3600) {
$hours = floor($secs / 3600);
$secs = $secs%3600;
$r .= $hours.' hour';
if($hours <> 1) {
$r .= 's';
}
if($secs > 0) {
$r .= ', ';
}
}
if($secs >= 60) {
$minutes = floor($secs / 60);
$secs = $secs%60;
$r .= $minutes.' minute';
if($minutes <> 1) {
$r .= 's';
}
if($secs > 0) {
$r .= ', ';
}
}
$r .= $secs.' second';
if($secs <> 1) {
$r .= 's';
}
return $r;
}
$a = '979346';
$string = convertSecToStr($a);
echo "{$a} is equal to {$string}";
?>
2013年10月25日 星期五
[PHP]判斷時間格式
作表單時會需要user填入時間這類資訊,
通常使用checkdate()檢測時間是否正確,
今天想試試看,利用preg_match()作多一層的格式確認,
首先,先做一個簡易表單方便送值進去,
其實也可以直接寫在程式碼裡面測試,這樣就不用再寫form,
純粹看個人習慣,
這邊用GET的網址傳値,
順便在url檢視送進去的值,
(當然如果是password等就再用POST,這邊只是純練習)
TEST 1.
input=123

TEST 2.
input=1987/09/27

TEST 3.
input=19870927
通常使用checkdate()檢測時間是否正確,
今天想試試看,利用preg_match()作多一層的格式確認,
首先,先做一個簡易表單方便送值進去,
其實也可以直接寫在程式碼裡面測試,這樣就不用再寫form,
純粹看個人習慣,
這邊用GET的網址傳値,
順便在url檢視送進去的值,
(當然如果是password等就再用POST,這邊只是純練習)
<html>
<head></head>
<body>
<form method="get">
Date:<input type="text" name="date" />
<input type="submit" name="send" />
</form>
</body>
</html>
作出來的表單:
<?php
$date = $_GET[date];
//Check if date is in YYYY-MM-DD format
function checkDateFormat($date)
{
//match the format of date by preg_match()
//"^" 以指定字元或字串起始
//"$" 以指定字元或字串結束
//"\d" 與[0-9]相同,比對任何數字字元
//"{n}" 指定字元出現n次
if (preg_match ("/^([0-9]{4})([0-9]{2})([0-9]{2})$/", $date, $parts))
{
//check weather the date is valid of not
if(checkdate($parts[2],$parts[3],$parts[1]))
return true;
else
return false;
}
else
return false;
}
if(checkDateFormat($date))
{
echo 'yes it is right!!';
} else
echo 'something might be wrong!!';
?>
寫好我的checkDateFormat()後,接下來就是測試噜,TEST 1.
input=123
TEST 2.
input=1987/09/27
TEST 3.
input=19870927
訂閱:
意見 (Atom)
