2013年6月9日 星期日

JS print 的設定參數

<script type="text/javascript">
  window.print();
  if(window.print)
  {
    factory.printing.header = ""
    factory.printing.footer = ""
    factory.printing.portrait =false
    factory.printing.leftMargin = 0
    factory.printing.topMargin = 0
    factory.printing.rightMargin = 0
    factory.printing.bottomMargin = 0
    factory.printing.Print(true);            
  }    
</script>';

2013年3月30日 星期六

AJAX簡介

AJAX 只是一個商業化的名詞,全名就是 Asynchronous JavaScript XMLHttpRequest,簡單說來就是非同步的 XMLHttpRequest。
非同步跟同步有什麼不一樣呢?最簡單的說法就是,同步的更新等於是每一次都需要重讀整個網頁,而非同步只是針對部分的區域變更,而且每一個部分都有各自的資料更新,所以會在各自接收到資料的時候更新(也就是所謂的非同步)。

使用 AJAX 的最大優點,就是可以在不需要重新讀取整個網頁的狀態下,更新部分資訊,很多時候其實頁面更新的資料只有一小部分,而使用同步更新必須整個網頁重新讀取、顯示,不但比較緩慢而且要浪費許多資源。最重要的是讓使用者有中斷感,而 AJAX 的非同步更新會讓人感覺不到中段,就好像我們平常在電腦是用的程式一樣,而不像初期的網頁,每一次更新資料就需要整個重讀一次。



2013年3月13日 星期三

PHP的物件模式


在這裡介紹一下一些PHP物件的模式:


__construct 建構子:會在物件宣告時執行,如果需要代入參數,在宣告時必須一併帶入。
__destruct 解構子:在物件被釋放的時候會執行。

__clone 複製整個物件


class point
{
var $x;
var $y;

function __construct($var1=0, $var2=0)
{
$this->x = $var1;
$this->y = $var2;
}

function show_center()
{
echo "<BR>The center is: ".$this->x."|".$this->y;
}

}

$a = new point(2,3);
$b = $a->_clone();  //複製物件, b 的中心點一樣會是 2,3

物件保護模式

public (公有模式):任何人都可以使用
private(私有模式):只有物件內自己可以使用
protected (保護模式):只有物件以及子物件可以使用



__call() 使用方法:
當__call函式存在時,如果不存在的物件函式被呼叫,就會觸發__call(),這樣可以防止錯誤的呼叫。


class point
{
var $x;
var $y;

function __construct($var1=0, $var2=0)
{
$this->x = $var1;
$this->y = $var2;
}

function show_center()
{
echo "<BR>The center is: ".$this->x."|".$this->y;
}


function __call($name, $arg)
{
echo "<BR>".$name." does not exist! ";
}

}


$point1 = new point;
$point1->test1();

就會出現 test1 does not exist!的訊息


_set 以及 _get 的用法
這兩個方法可以用來預防錯誤的參數存取,如果再上面的類別加上下面這兩個函式。



function __set($name, $val){
echo "I'm sorry, but ".$name." is not exist, you can't set it to ".$val;
}

function __get($name){
echo "I'm sorry, but ".$name." is not exist";
}

當嘗試錯誤存取的時候就會顯示訊息:

$point1->xxx = 10;  會顯示 I'm sorry, but  xxx is not exist, you can't set it to 10
echo $point->yyy; 會顯示 I'm sorry, but yyy is not exist













PHP類別與物件

類別的定義方法

class 類別名稱
{
  var $a;
  var $b;  //定義類別的變數

  //定義類別的函數
  function 函數名稱1(參數1, 參數2)
  {
    :
  }


  function 函數名稱2(參數1, 參數2)
  {
    :
  }


}

在類別中如果要呼叫類別的變數時必須使用 $this->變數名稱,
列如在上面的類別要呼叫 $a 必須使用 $this->a (後面的 a 不用加 $)

類別寫完之後必須宣告為物件才能使用,假如上述類別名稱為 class1,
我們必須先宣告一個物件:

  $test = new class1;

這樣就可以使用上述類別的功能了,物件可以呼叫類別所有開放的變數以及函數,
以上述物件為例子:

  $test->a;  可以取得參數 a
  $test->函數名稱1;  可以呼叫函數 1



建構式(__construct)

設定類別的時候,可以設定建構式,當物件被宣告的時候,建構式就會同時被觸發。
如果建構式必須輸入參數,當宣告物件的時候要一起輸入。


class point
{
var $x;
var $y;

function __construct($var1=0, $var2=0)
{
$this->x = $var1;
$this->y = $var2;
}

function show_center()
{
echo "The center is: ".$this->x."|".$this->y;
}

}

$point1 = new point(2,1); (如果不輸入值,會跑預設)
$point1->show_center();  (會列印出中心點)


繼承(inheritance)的寫法

類別是可以繼承的,繼承父類別的子類別會擁有父類別已經設定好的參數。
繼承的方法是使用 extend


class circle extends point
{
var $radius;
function __construct($var1=0, $var2=0, $var3=1)
{
parent::__construct($var1, $var2);
$this->radius = $var3;
}
function show_info()
{
echo "center is: ".$this->x."|".$this->y. " and radius is: ".$this->radius;
}
}

$point1 = new circle(2,1,3);

$point1->show_center();
$point1->show_info();


新的子類別 circle ,一樣可以呼叫父類別 point 的參數以及函式。


子類別也可以寫自己的建構式,但是如果子類別有建構式就不會執行父類別的建構式,如果需要執行,就在建構式裡面使用 parent::__construct(); 這樣就會呼叫父類別的建構式。如果子類別沒有建構式,就會直接繼承父類別的建構式。



多型(polymorphism)的寫法

子類別可以覆蓋父類別的函數,改成執行自己的方法,這種繼承方式稱為多型。


class circle extends point
{
var $radius;
function __construct($var1=0, $var2=0, $var3=1)
{
parent::__construct($var1, $var2);
$this->radius = $var3;
}
function show_center()
{
echo "center is: ".$this->x."|".$this->y. " and radius is: ".$this->radius;
}
}


$point1 = new circle(2,1,3);
$point1->show_center();

子類別會直接執行自己的 show_center() 而不是父類別的




另外如果再子類別的程式中想要呼叫擁有相同名稱的父類別函數都可以使用 parent:: 加上函數名稱來呼叫。


class circle extends point
{
var $radius;
function __construct($var1=0, $var2=0, $var3=1)
{
parent::__construct($var1, $var2);
$this->radius = $var3;
}
function show_center()
{
parent::show_center();
echo "center is: ".$this->x."|".$this->y. " and radius is: ".$this->radius;
}
}







PHP 條件判斷

PHP 的條件判斷跟其他語言也是大同小異。

if 寫法:

if (條件關係)
{
     條件成立時所執行的程式
}else
{
     條件不成立時所執行的程式
}


switch 選擇:

switch (條件關係){
    case 條件 1 :
       符合條件 1 所執行的程式;
       break;

    case 條件 2 :
       符合條件 2 所執行的程式;
       break;

    case 條件 3 :
       符合條件 3 所執行的程式;
       break;
   default:
      預設值行的程式(當上方所有條件都不符合時執行)
      break;


}


for 迴圈的用法:

for (條件 1; 條件 2 ; 條件 3 )
{

}

條件 1 為起始運算,條件 2 是迴圈結束條件,條件 3 是迴圈變數方式
舉例:

for( $i = 1; $i <= 100; $i++)
{
    echo $i;
}

會把 1 到 100 列印出來


如果不設定條件 2 ,會進入無限迴圈,可以在迴圈中用 break; 來停止



foreach 迴圈的用法:

foreach 可以將陣列中的每一個值都取出執行一次

foreach( 陣列名稱 as 變數名稱){
   程式
}

舉例:
foreach($ary as $i)
{
    echo $i;
}

會把陣列裡面每一個值都列印出來


foreach 也可以把索引值一起拉出來

foreach ( $ary as $key => $val ){

    echo $key. " -> ". $val;

}
會先列印出索引值名稱然後接上值



while 條件迴圈的用法:

語法為:
while (條件敘述)
{
    當符合條件時執行的程式
}

當條件一直符合的時候,迴圈會一直執行下去
舉例:

$i=1;
while( $i <= 100 )
{
     echo $i++;
}

會列印 1 ~ 100 出來



do while 條件迴圈的用法:

do while 跟 while 的用法幾乎一樣,唯一的區別在於,do while 會先執行一次程式後在來檢查是否要繼續下去,而 while 則會先確認條件符合之後才執行第一次。

$i = 10;

while( $i<1 )
{
    echo $i;
}

因為條件不和合,所以不會列印任何東西。


do
{
    echo $i;
}while( $i<1 )

會列印出一次 $i 的內容之後才停止。



















PHP 基本運算值

PHP 的基本運算跟其他C語言大致相同

+    加法運算
-     減法運算
*    乘法運算
/     除法運算
%   求餘數運算
=    指派值


再來就是指派運算值

++    累加 1 到指定值
--     累減 1 到指定值
+=   執行累加某值的運算
-=    執行累加某值的運算
*=   執行累加某值的運算
/=    執行累加某值的運算

$a++ 等於自動幫 $a + 1
也可以寫 ++$a 這時候值會 + 1

$a = 10;
$b = $a++;
$b 會是 10,而 $a 會變成11
$b = ++$a;
$b 會是 11,而 $a 還是變成11

$a = $a + 2;
等同於 $a += 2;


位元運算子

&   進行 AND 運算
|     進行 OR 運算
~   進行  NOT 運算
^   進行 XOR 運算
>   進行位元右移運算


關係運算子

==     相等關係運算   (回傳 true 如果兩者值相同)
===   完全相等關係運算 (兩者必須型態以及值都相同才會回傳 true )
!=      不相等關係運算
!==    完全不相等關係運算
>       大於關係運算
<       小於關係運算
>=     大於等於關係運算
<=     小於等於關係運算
?:       進行條件式運算

條件式運算使用法:

(判斷式)?  (條件成立時回傳的值):(條件不成立時回傳的值)

範例:
$a = 10;
$b = 20;
$a > $b  ?  "Yes" : "No";
會得到 No ,假如把 $b 改成 5 ,那就會得到 Yes


邏輯運算子

!     進行 NOT 邏輯
&&   進行 AND 邏輯
||     進行 OR 邏輯


字串運算子

.     進行字串相加
.=   進行字串累加
















2013年3月11日 星期一

Session 簡述

Session 跟 Cookie 一樣也是用來暫時儲存資料變數,不同的地方是, Cookie 是將資料儲存在客戶端上,而 Session 則是儲存在伺服器上。

在安全性上, Session 儲存在伺服器上安全很多,但是限制也較為複雜,因此一些簡單的參數還是建議直接使用 Cookie 就好。

每一次使用 Session 之前一定要呼叫 session_start() 接下來就可以直接設定要使用的變數,
例如:


session_start();
$_SESSION['var1'] = "test1";

在另外一個頁面的時候也只要呼叫 session_start() 之後,就可以直接使用這些變數了。

如果不要使用這些變數的時候,可以把他們的值使用 unset() 清空,但是要注意不要直接 unset 整個 $_SESSION ,這樣會造成錯誤。

Cookie 簡述

Cookie 可以讓程式儲存一些變數資料在客戶端的網頁暫存檔當中,方便網頁在其他頁面的時候也能使用到這些資料,例如會員登入網站後,可以將會員姓名儲存在 Cookie 中,當到達其他頁面的時候,就一樣可以透過讀取 Cookie 顯示會員的名稱。

Cookie 的完整語法為:

setcoolkie("變數名稱", 資料, 暫存期間, 暫存路徑, 網域名稱, 是否為安全模式);

不過通常我們只會用到前兩個屬性,所以簡短的寫法為:

setcookie("變數名稱", 資料);

有時候我們會希望 Cookie 有固定的時效,這時候就會配上暫存期間的值,這個值可以透過time() 或者 mktime() 來取得,設定方法就變成:

setcoolkie("變數名稱", 資料, 暫存期間);


如果要刪除 Cookie 的話,可以直接設定空值來清除:

setcoolkie("變數名稱");

這樣這個值就會被刪除了。


cookie 會自動被 php 設定成變數,setcoolkie("my_cookie") 在 php 中就可以用 $my_cookie讀取

include & require

當一些函數常常會被重複用到的時候,可以把他們單獨寫成一個檔案,當要用到的時候可以用include 以及 require 來把他們引入程式當中。

所以他們可以在程式中被呼叫使用,include 以及 require 沒有太大的差別,唯一的差別是在程式在編譯時遇到 include 會無條件的繼續編譯下去,如果是 require ,就只會彙編一次。

也就是在同一段程式碼裡面,如果有五次 include ,他會被編譯五次,可是如果是五次 require ,他就只會第一次的時候被編譯。

另外如果在引用檔案的時候重複引用到,例如程式碼中同時引用檔案 A 以及檔案 B ,可是其實在檔案 A 當中的程式碼也引用了檔案 B ,會造成引用錯誤,這時可以使用 include_once 或者 require_once ,系統如果發現目標檔案已經被引用過,就不會再次引用。



2013年3月8日 星期五

PHP 陣列介紹

PHP陣列宣告方式為 [ ]
陣列索引值從 0 開始

設定方法如下:

$array[0] = "Tony";
$array[1] = "Kathy";
$array[2] = "Kelvin";
$array[3] = "Kent";


也可以直接輸入值,會默認數字為索引值


$array[] = "Tony";
$array[] = "Kathy";
$array[] = "Kelvin";
$array[] = "Kent";
會得到一樣的結果


也可以直接再同一行輸入
$array = array("Tony", "Kathy", "Kelvin", "Kent");
也是會得到一樣的結果



索引值也可以用字串來命名方便辨認

$array["name"] = "Tony";
$array["sex"] = "male";


二維陣列的設定方法


$array[0][0] = "Tony";
$array[0][1] = "Kathy";
$array[1][0] = "Kelvin";
$array[1][1] = "Kent";

同樣可以用下列方法設定
$array = array(array("Tony", "Kathy"),array("Kelvin", "Kent"));

會得到相同的結果


巢式陣列
在陣例裡面在宣告陣列,即為巢式陣列,在複雜資料的時候配合字串索引值使用很方便

假設有一份名單資料,以下列方式宣告



$list = array(
"1" => array(
    "name" => "Tony",
    "sex" => "male"
),
"2" => array(
    "name" => "Kathy",
    "sex" => "female"
),

"3" => array(
     "name" => "Kelvin",
     "sex" => "male"
)

);



當需要第一個人的名字的時候,只要輸入 $list[1]["name"]就可以得到,如果有其他資料也可以一併宣告進去。

count() 可以用來計算指定深度的陣列數量。

count($list) 會得到 3 ,因為有3個人。
count($list[1]) 會得到 2 ,因為有兩個欄位



explode 函數會將字串資料自動切為陣列

使用方法為: $array = explode("分隔符號", "字串");

範例:

$str = "name1,name2,name3";

$array = explode(",", $str);
上述語法代表把 $str 這個字串依照每一個 "," 來切開。

將會得到

$array[0] = "name1";
$array[1] = "name2";
$array[2] = "name3";


implode 剛好相反,是把陣列合併成字串輸出

如果把剛剛得到的結果使用implode

$str2 = implode(",", $array);

$str2 的值將會是 "name1,name2,name3";









PHP 函數介紹

PHP 函數的寫法

function 函數名稱(參數1, 參數2, 參數3, ...)
{
        :
函數內容
        :
return 回傳值 //可以省略

}

函數可以設定預設參數值,當呼叫時沒有輸入參數,會以預設參數值來執行

function sum_them( $a = 1, $b =2)
{
    $sum = $a + $b;
    return $sum;
}

如果呼叫 sum_them( 6, 4 ) 會得到 10
如果直接呼叫 sum_them() 會得到 3


使用函式外的變數
範例:
function sum_this($a)
{
  $b = 20;
  $sum = $a + $b;
  return $sum;
}
 $b = 30; //不會影響到函式內的$b
sum_this(10); //得到答案 30 而不是 40

如果想用函式外的變數,必須使用global
function sum_this($a)
{
    global $b;
    $sum = $a + $b;
    return $sum;
}
$b = 30;
sum_this(10); //函式會使用外部的 $b 得到答案40

也可以直接呼叫$GLOBALS陣列裡面的值來代替


function sum_this($a)
{
    $sum = $a + $GLOBALS['b'];
    return $sum;
}

會得到一樣的結果



函式內的值會在每一次函式結束後釋放,所以每一次函式呼叫結果不會累積。
function sum()
{
    $sum = 10;
    $sum += 1;
    return $sum;
}
echo sum();
echo sum();
會得到兩次同樣的結果 11。


如果想要保留每一次函式內變數的變更,可以使用static

function sum()
{
    static $sum = 10;
    $sum += 1;
    return $sum;
}
echo sum();
echo sum();
第一次會得到11,第二次由於sum保留上次結果,所以會得到12



函式一般採用傳值的方式,所以不會改變到輸入的值。
function change($a)
{
    $a = 10;
    return $a;
}
$b = 1;
echo change($b) . "->" . $b;
//上述的結果會得到  10 -> 1 , $b 並不會受到函式改變。

如果想要 $b 跟著函式一起被變動,可以採用傳址的方式。


function change(&$a)
{
    $a = 10;
    return $a;
}
$b = 1;
echo change($b) . "->" . $b;

//上述的結果會得到  10 -> 10 , $b 跟著一起被變動了。











PHP基本運用

PHP程式結尾需加上 ;

變數宣告方式:

變數名稱前方加上 $
例如 $count 、 $variable
沒有設定值的變數,預設值為NULL

變數有大小寫區分 $var 不等於 $VAR

變數類型:

boolean
integer
float
string
array
class
resource
NULL

特殊字串:

\'  單引號
\"  雙引號
\\ 反斜線
\$  顯示$
\n 換行並且回到下一行最前端
\r 換行
\t 移動到目前所在行的下一列

可變變數

$var = test
$$var = "answer"   等同於設定 $test = "answer"

變數傳值方式

$a = 1
$b = $a
$a 的值複製到 $b ,所以 $b也是1

$a = 2
這個時候改變 $a 的數值不會在影響到$b
$b 還是 1



變數傳位址方式 前方加上 &

$a = 1
$b = &$a

$b 指向跟 $a 存值的地方,所以這個時侯 $b 也是 1

$a = 2

此時改變 $a 會跟著影響 $b,因為雙方是指向同一個位置,所以這時候 $b 也是 2



PHP 預設變數


$GLOBALS  程式中所有全域變數名稱的陣列
$_SERVER   伺服器資訊
$_GET  HTTP的GET資料
$_POST  HTTP的POST資料

$_COOKIE
HTTP的COOKIES資料,如$_COOKIE["cookie1"]是取得COOKIE中cookie1變數的方法

$_FILES 取得POST上傳的檔案資料
$_ENV  環境變數
$_SESSION SESSION變數


echo 、 print 、 print_r 都是用來輸出數值的。


echo
  不會回傳數值
  可以輸出多個字串,只需要用逗號來分隔
  例如:echo "字串1", "字串2";

print
  會回傳 1 ,所以可以用來當判斷的數值使用
  只能輸出一個字串
  範例: 
  if ( print("你好") ){
    因為會回傳 1 ,所以會進入這裡執行其他程式
  }
print_r()
  可以列印出各種類別的數值,就算是陣列或者物件都會列印出來,Debug時非常好用。

2013年3月5日 星期二

PHP framework

PHP framework是許多人的選擇,透過框架快速的產出成品,可以省去開發者許多的時間。
這邊有一篇對框架的介紹,有興趣的人可以去看一下。


開發者不可不知的PHP框架深度解析


另外這邊還有一個分析各大framework優缺點的網站

http://www.phpframeworks.com/

最方便的架站軟體:XAMPP


XAMPP是一個使用MySQL資料庫的架站軟體,支援PHP、JSP等程式語言,裡面還包含Mercury Mail、FileZilla FTP 和 phpMyAdmin等等,而且還有綠色版本,在需要的時候在啟動即可,不會一開機就常駐在電腦,XAMPP控制台也非常的方便,可以隨時切換想要的系統。

XAMPP可以在這裡下載
http://www.apachefriends.org/zh_tw/xampp-windows.html

安裝以及使用的方法,也都有著詳細的介紹。



MySQL簡介

SQL 全名是結構化查詢語言(Structured Query Language),是用於資料庫中的標準數據查詢語言。(詳細內容可參閱 http://zh.wikipedia.org/wiki/SQL)

目前最廣泛的有msSQL跟MySQL兩種,其中以MySQL最為廣泛,主要原因當然是因為他是免費的。PHP搭配MySQL是目前的主流,在免費並且擁有絕大部分功能的狀況下,是中小公司的最佳選擇。




2013年3月4日 星期一

PHP基本架構

PHP是網頁程式語言,所以內容可以跟HTML混和在一起。


 一個內含PHP的網頁看起來基本是這樣:

<HTML>
<HEAD>
</HEAD>
<BODY>

<?PHP

echo "Hello World!"

?>

</BODY>
</HTML>


紅色部分就是PHP的程式碼,其他部分則是一般的HTML語言,伺服器只會編譯PHP的程式碼,這一段程式碼也不會被傳送到客戶端,而是傳送編譯完成的結果,這些結果會跟頁面裡面的HTML程式碼結合在一起,然後傳送到客戶端。因為PHP部分是由伺服器運算過後輸出的,所以同樣的頁面可以依照運算的不同而輸出不同的結果。


PHP基本規則:

檔案名稱為:.php 副檔名
程式碼包含在 <?PHP     ?>當中
一個頁面當中可以有多段的 <?PHP    ?>程式碼
// 為單行註解
/*
為多行註解 在*/當中所有的文字都屬於註解
*/




PHP簡介

PHP原本的簡稱為Personal Home Page,從名稱上就可以看出是為了網頁而誕生的語言,在網路上很多地方可以找到詳細的介紹,再次我也不再複述。

PHP的語法屬於C語言系列,與C++、ASP、AS、Java或其他類C語言的程式寫法大致相同。因此懂C語言的很容易上手,在加上因為當初研發的主因是為了產生網頁,因此只要學習了核心的部份,就算是新手,也可以很快的上手。

PHP屬於伺服器端語言,代表著一切的編譯以及執行都是在伺服器執行的。使用者只會接受到伺服器編譯完成的結果,因此通常不需要考慮到用戶端的電腦配備。只要伺服器能夠承受的起運算的負荷,就可以完成所有的工作。

隨著時代的變遷,瀏覽器的功能比剛開始強大了百倍有餘。配合用戶端的JS、Flash以及後端的PHP運算,幾乎可以達到所有桌面軟體的功能。在搭配上資料庫以及網路連線的功能,PHP系統可以做到許多在以前需要耗費大資本才能做到的軟體功能。例如網路遊戲、公司的ERP系統、以及各式各樣的系統。

PHP以其免費、易學以及功能強大的特性,迅速的霸佔了網路市場,也幾乎成了各大中小公司都需要擁有的人才之一。

緣由

因為一次特別的事件,所以人生在今年有了新的旅程,但是回首過去,好像所學、所遇的人、事、物都只存在腦海中,因此開了一個新的網誌,希望將以後的點點滴滴能有個回首的地方。