使用PHP(1)

以下提供的教學資訊修改自書籍PHP and MySQL 24-Hour Trainer,僅供學術討論與交流使用。


暖身一下

既然要開始使用PHP,至少要先了解一下php環境的基本設置!
使用phpinfo()指令可以列出php環境的基本設置。
<?php phpinfo(); ?>


學習echo與include的用法


echo function可以用來顯示資料,大概就像Java的print、println一樣。
<h1>Welcome</h1>
<p>Today is Sep 27, 2011</p>

//上面輸出的結果和下面輸出的結果是一樣的

<h1>Welcome</h1>
<p>Today is <?php echo date('M j, Y'); ?></p>


include function 則可以讀取指定的檔案,並且將檔案的內容插入原本檔案的區塊之中。

<?php include ('yourFile.php'); ?>
如果還想了解更多的php function,可以查詢官方的php手冊


變數的使用與規則

在php中的變數是以錢錢的符號$呈現,在等號之後則是它對應的值。

<?php 

$myName = 'Andy';

?>

雖然值都是字串,但是使用單引號雙引號來quote會有不同的結果

<?php

$myName = 'Andy';

$myVar = "Hi, my name is $myName";

echo $myVar;

?>
<?php

$myName = 'Andy';

$myVar = 'Hi, my name is $myName';

echo $myVar;
?>

雙引號和單引號的差別在於雙引號可以解讀引號內的變數
單引號則是忠實呈現,即第二段程式碼echo出來的結果為

Hi, my name is $myName

有時候,使用複數形式可能會造成理解上的困難(這比較容易發生在英文裡)
這時候可以使用{}來強調、劃分變數(variables)。例如:

<?php

$Animal = 'cat';

$myVar = "5 {$Animal}s";

echo $myVar;

?>

括號中的字有包含引號的時候,要如何告訴電腦說其實引號不是用來運算的呢?
可以在引號前加入\ 進行逃跑(escape)~

<?php

$myVar = "I don\'t know what the hell is it.";

echo $myVar;

?>


文字與數字之間的轉換
在PHP中,若牽涉到數字的運算,字串會自動轉成數字,如以下的例子即為75
因為$stringNumber被轉換為15了

<?php

$stringNumber = '15a4';

$number = 5;

echo $stringNumber * $number;

?>

使用文字function例如htmlspecialchars() function可以保留html的符號顯示
文字與文字之間可以用句點(.)來concatenate(串連)。

程式碼除錯

當程式寫好之後,不一定能將資料顯示出來
而這些Bug通常都有常見的解決方案,可以先檢查一下:
  1. 是不是忘了打echo
  2. 大小寫的問題。PHP對於大小寫很敏感,也就是說變數的字母雖然一樣,但是若是大小寫不同,PHP會認為那是不同變數。
  3. 忘了打分號(;)
  4. =與==(==是等同數值)
  5. 忘了加$在變數前面,或是多加了$在function上
除此之外,可以善用die() function來讓程式碼的處理停留在某一行上,檢查到目前為止有無錯誤。


使用陣列

陣列是array function

$employee = array('Sally Meyers', 'George Smith', 'Peter Hengel');

使用echo來印出陣列中其中一個元素,0即是代表此陣列中第一個元素

echo $employee[0];

也可以直接指定陣列中的元素對應的數值

$employee[0] = 'Sally Meyers';

使用print_r() function 來列出陣列中所有元素,結果:

Array ( [0] => Sally Meyers [1] => George Smith [2] => Peter Hengel )


另外陣列也可以由以下的形式指定數值:

<?php

$employee = array('name'=>'Sally Meyers', 'position'=>'President', 'yearEmployed'=>2001 );



<?php

$employee['name'] = 'Sally Meyers';

$employee['position'] = 'President';

$employee['yearEmployed'] = 2001;

經過print_r() function列出

print_r($employee);

輸出結果:
Array ( [name] => Sally Meyers [position] => President [yearEmployed] => 2001 )

接著是陣列更複雜的形式
<?php

$employees = array(

array('name'=>'Sally Meyers', 'position'=>'President', 'yearEmployed'=>2001 ),

array('name'=>'George Smith', 'position'=>'Treasurer', 'yearEmployed'=>2006 ),

array('name'=>'Peter Hengel', 'position'=>'Clerk', 'yearEmployed'=>1992 ),

);

print_r($employees); 

輸出結果:
Array ( [0] => Array ( [name] => Sally Meyers [position] => President [yearEmployed] => 2001 ) [1] => Array ( [name] => George Smith [position] => Treasurer [yearEmployed] => 2006 ) [2] => Array ( [name] => Peter Hengel [position] => Clerk [yearEmployed] => 1992)


如果只想要顯示單一元素,就分別指定index來echo

echo $employees[0]['position'];


布林值(boolean)的echo


<?php

$myVar1 = true;

$myVar2 = false;

?>

<p>True:<?php echo $myVar1; ?></p>

<p>False:<?php echo $myVar2; ?></p>

上面這段程式碼的結果為

True:1
False:

False值是不包括任何東西的。在PHP的數值中,從不同的類型轉換到布林,以下狀況都將為False:
  1. 數字0 或是文字0
  2. 空字串 或是沒有元素的陣列
  3. 一個空值的變數
值得注意的是,如果你指定了$myVar = 'False'; PHP會當成你指定字串 所以返回的結果也是True



時間與日期


<?php

echo time();

結果會是millisecond的型態

1410414619


<?php

echo date('c') . '<br />';

echo date('m/d/Y') . '<br />';

echo date('l, F n, Y') . '<br />';

echo date('l ga') . '<br />';

echo date('h:i a') . '<br />';

結果

2014-09-11T07:51:11+02:00
09/11/2014
Thursday, September 9, 2014
Thursday 7am
07:51 am


若想要自行定義時間日期的顯示格式,可以查詢PHP: date - manualDate/Time Functions

使用mktime() function好處是可以做數學運算,並且顯示最終的時間

<?php

$offset = 16;

echo date('n/j/Y', mktime(0,0,0,12+$offset,5,2011));

結果
4/5/2013 

strtotime() function可以更方便的取得時間戳記

<?php

echo date('l, F j, Y', strtotime('12/5/2011')) . '<br />';

echo date('l, F j, Y', strtotime('yesterday', strtotime('12/5/2011'))) . '<br />';

echo date('l, F j, Y', strtotime('yesterday')) . '<br />';

echo date('l, F j, Y', strtotime('now')) . '<br />';

echo date('l, F j, Y', strtotime('Dec 5 2011')) . '<br />';

echo date('l, F j, Y', strtotime('+4 hours')) . '<br />';

echo date('l, F j, Y', strtotime('+1 week')) . '<br />';

echo date('l, F j, Y', strtotime('+2 weeks 1 day 4 hours 10 seconds')) . '<br />';

echo date('l, F j, Y', strtotime('next Tuesday')) . '<br />';

echo date('l, F j, Y', strtotime('last Monday'));

結果

Monday, December 5, 2011
Sunday, December 4, 2011
Wednesday, September 10, 2014
Thursday, September 11, 2014
Monday, December 5, 2011
Thursday, September 11, 2014
Thursday, September 18, 2014
Friday, September 26, 2014
Tuesday, September 16, 2014
Monday, September 8, 2014

getdate() function可以查詢目前時間陣列

Array ( [seconds] => 12 [minutes] => 6 [hours] => 8 [mday] => 11 [wday] => 4 [mon] => 9 [year] => 2014 [yday] => 253 [weekday] => Thursday [month] => September [0] => 1410415572 )

Reflection of Jena Documentation

Jena官方網站
An Introduction to RDF and the Jena RDF API
SPARQL Tutorial

Jena是一個用來開發語意網(Semantic Web)與連結資料(Linked Data)的Java API,支援對RDF的CRUD、查詢(Query)與推論(Inference)。

官方的教學中牽涉到幾種編碼與檔案格式,如RDF(S)N-Triple

RDF格式和HTML看起來差不多,只是它屬性的值前後都得以它的屬性名稱包裝起來:
<fruit>banana</fruit>

N-Triple直接顯示triple的關係,不像RDF呈現的方式那樣有階層的排序:
<http://.../monkey><http://.../eat><http://.../banana>

triple是以subject, predicate, object所組成,可以聯想成英文中的主詞、動詞與受詞。

Jena可以透過SPARQL來進行查詢,有兩種檔案格式:.rq & .n3
兩者最大的差別在於PREFIX前面有沒有加@,所以按照官方教學進行SPARQL指令出現錯誤時,可以試著修改檔案格式rq為n3試試看。

Integrating Facebook in Android - Parse

參考Parse的教學

我們的目的是使用Parse API結合Facebook SDK

並且做出一個可以撈到FB使用者資料的簡單APP

根據教學,我們在開始coding之前,有兩個前置作業要做:
  1. 申請一個Facebook APP
  2. 把Key hash丟到Facebook APP中,可以參考FB官方流程
其實按照Parse官方的教學走就沒什麼問題,但是有些還是可以提出來一下

產生Key hash

按下你的「Windows+R」組合鍵開啟執行,輸入cmd打開命令列,準備開始製作*.keystore檔案,輸入
keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -keysize 2048 -validity 10000

程式碼中「-keystore android.keystore」這邊可以自行修改成你要的*.keystore,如banana.keystore

「-alias android」也可以自行修改你要的數值,如banana

輸入後它會叫你填一些東西,乖乖填完就好囉

填完資料會產生一個keystore,我們接著要來取出Key Hash,輸入
keytool -exportcert -alias apa -keystore apa.keystore | openssl sha1 -binary | openssl base64

就可以取得key hash囉!


產生Key hash 問題排除


  1. 如果有困難,無法取得key hash,可以先在cmd中cd到.android資料夾(像我的keystore就是放在 C:\Users\User\.android這個地方)
  2. 下載OpenSSL,把openssl.exe丟到存放*.keystore的地方,我的是放在C:\Users\User\.android


「Invalid Scope:basic_info. Use public_profile,user_friends instead...」問題

問題出在於onLoginButtonClicked()這個function裡面,basic_info是Facebook舊的permission
把它換成新的public_profile, user_friends之類的就沒問題了。

「can't import com.facebook...」問題

開發和網路有互動的APP時一定要記得開網路呀XD

「could not find *.apk」問題

我在用Eclipse的時候不停的build和clean,最後怒點右鍵點property→Android
在SDK那邊點了isLibrary,把這個勾勾取消掉就好囉


最後可以到這幾個地方看看自己的成果

  1. Facebook Developer 選擇自己的APP
  2. Home - Parse  選擇Parse Core

遇到The container 'Android Dependencies' references non existing library的問題該怎麼辦?

如果遇到了以下的問題



參照該連結提供的方法,去SDK Manager把support的library升級就可以囉!
至少對我來說是有用的XD

Step 1: 開啟Android SDK Manager



Step 2: 安裝support libray



Step 3: 安裝結束後,在專案資料夾上按右鍵,設定build path



Step 4: 重選Android Dependencies,完成!





消基會和消保會的差異在哪裡?



名稱
簡介
全名財團法人中華民國消費者文教基金會(Consumers' Foundation, Chinese Taipei,簡稱CFCT),成立於1980年11月1日,為專門改善臺灣消費環境,伸張臺灣消費者權利所設立的非營利性的第三部門。也就是說是民間組織。
全名行政院消費者保護會,於1994年7月1日成立,2012年前曾為中華民國行政院部會「行政院消費者保護委員會」。期間專責政策之研訂、審議及協調推動、《消費者保護法》之解釋及研修、重大消費事件之協調處理等消費者權益保護事項。
管理
民間
政府
對策
無法對業者做出處分,但是可以給消費者看檢驗報告(每個月都有出版)
有公權力,有相關的消保官與消保法

申訴消費過程中不公平以及意外等事件處理,過程為業者→消基會→消費者服務中心
也就是說,
  1. 一開始就直接叫你們經理出來可以先設法與業者溝通與協調
  2. 若認為沒有受到妥當的處置再去向消基會諮詢,看看是否是否屬於消費糾紛?有無消費權益上的損害?如何賠償等等
  3. 確認後接著再到地方政府所設立的消費者服務中心進行申訴



References

中華民國消費者文教基金會- 維基百科

關於消基會這個單位的一些問題 - Mobile01

如何在Blogger文章中加入程式碼區塊?

用Blogger寫blog是滿方便的,看起來好像該有的都有不該有的也都不該有
畢竟它不是個專事文書處理的服務,所以我對於沒有表格功能就比較沒那麼介意了XD
最近想要在文章中加入程式碼的區塊,不然code和plain text不能做出區隔的話
會比較難閱讀。以下是詳細的圖文步驟:


一、進入網誌管理後台


 


二、在sidebar的部分選擇「版面配置」


 


三、在區塊中新增小工具




四、選擇新增「HTML/Javascript」這個小工具





五、貼上javascript的code到內容欄位中,標題可以留白沒關係的



//code內容
<script src="//google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>


 

六、回到文章中,切換為HTML模式




七、針對要表示為程式碼的段落前後插入以下代碼


<pre class="codeblock prettyprint">

//段落內容

</pre>


八、大功告成,沒什麼~

//之後程式碼區塊的內容大概就像這樣
//雖然手動加好像還滿麻煩的XD



POST和GET有甚麼差別?


請搭配閱讀淺談 HTTP Method:表單中的 GET 與 POST 有什麼差別? - Soul & Shell Blog

POST和GET同為傳遞資料的一種方式,兩者間最明顯的差異就在於GET會在網址上顯示傳送的資料,而POST則是看不到的。使用GET的例子,可以試著玩耍Google搜尋引擎一下:
當我們搜尋「curiosity is power」的時候,可以看到網址顯示的是

https://www.google.com.tw/webhp?sourceid=chrome-instant&rlz=1C1AVNC_enTW558TW558&ion=1&espv=2&ie=UTF-8#q=curiosity+is+power

而其他部分的差異文章中拿明信片與平信來形容,我覺得很恰當也很傳神。

GET如明信片一般,寫任何東西在上面都有被看到的危險,但是造價比較便宜(請不要聯想現實生活中的酷卡,想一般書局的明信片就好了XD)封包中記錄的資料較少,所以傳輸的速度也比較快。POST就像平信──還要分裡面的信紙、外面的信封,因為要多買東西,所以不只貴也比較麻煩...封包中多紀錄了一點東西,所以傳輸速度也就比較慢了。

什麼是JSON格式?

JSON(JavaScript Object Notation)是一種輕量級的語言,以文字為基礎,且易於讓人閱讀。
JSON以key-value的格式儲存資料,並且必須被包在"{"與"}"符號之中。

以訂單內容為範例,JSON與XML不同格式有不同的表示方法:

JSON

{
  "orderID": 12345,
  "shopperName": "John Smith",
  "shopperEmail": "johnsmith@example.com",
  "contents": [
    {
      "productID": 34,
      "productName": "SuperWidget",
      "quantity": 1
    },
    {
      "productID": 56,
      "productName": "WonderWidget",
      "quantity": 3
    }
  ],
  "orderCompleted": true
}

XML 

<object>
  <property>
    <key>orderID</key>
    <number>12345</number>
  </property>
  <property>
    <key>shopperName</key>
    <string>John Smith</string>
  </property>
  <property>
    <key>shopperEmail</key>
    <string>johnsmith@example.com</string>
  </property>
  <property>
    <key>contents</key>
    <array>
      <object>
        <property>
          <key>productID</key>
          <number>34</number>
        </property>
        <property>
          <key>productName</key>
          <string>SuperWidget</string>
        </property>
        <property>
          <key>quantity</key>
          <number>1</number>
        </property>       
      </object>
      <object>
        <property>
          <key>productID</key>
          <number>56</number>
        </property>
        <property>
          <key>productName</key>
          <string>WonderWidget</string>
        </property>
        <property>
          <key>quantity</key>
          <number>3</number>
        </property>
      </object>
    </array>
  </property>
  <property>
    <key>orderCompleted</key>
    <boolean>true</boolean>
  </property> 
</object>

JSON和XML的不同 XML是標記語言,需要費更大的功夫才能解讀,XML在容易資料儲存方面更具優勢,而JSON輕巧的特性,使其較適合用於資料傳輸。

reference

瞭解JSON格式 @ 清新下午茶 :: 痞客邦 PIXNET ::
你不可不知的 JSON 基本介紹 | 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY