Pages

Subscribe:

Ads 468x60px

Labels

2014年12月29日 星期一

有趣的網站-腦殘PHP

這幾天在研究PHP程式,發現了這個網站-腦殘PHP 覺得很有趣,
也提供很多很有用的程式
 http://phpwrite.blogspot.tw/
 感謝分享

2014年12月27日 星期六

A-mew's Blog: 【PHP】foreach(){}迴圈與form表單

A-mew's Blog: 【PHP】foreach(){}迴圈與form表單: 在php中善用foreach(){}迴圈與form表單可以輕鬆寫出多筆欄位存入資料庫的問題。 表單中有許多欄位需要填寫, 可是要一個一個寫入資料庫就太費時了, 也會使得語法落落長一大串,拖慢速度。 以下以排序作為範例。 ex.

2014年12月22日 星期一

MySQL 超新手入門(5)JOIN 與 UNION 查詢

1 使用多個表格

在「world」資料庫的「country」表格中,儲存世界上所有的國家資料,其中有一個欄位「Capital」用來儲存首都資料,不過它只是儲存一個編號;另外在「city」表格中,儲存世界上所有的城市資料,它主要的欄位有城市編號和城市的名稱:
mysql_05_snap_01
雖然「country」表格自己沒有儲存城市名稱,不過它可以使用「Capital」欄位的值,對照到「city」表格中的「ID」欄位,也可以知道城市的名稱。在這樣的表格設計架構下,如果你想要查詢「所有國家的首都名稱」:
mysql_05_snap_02
這樣的查詢需求就稱為「結合查詢」,也就是你要查詢的資料,來自於一個以上的表格,而且兩個表格之間具有上列討論的「對照」情形。

2 Inner Join

「Inner join」通常稱為「內部結合」,它可以應付大部份的結合查詢需求,內部結合有兩種寫法,差異在把結合條件設定在「WHERE」子句或「FROM」子句中。

2.1 使用結合條件

下列是在「WHERE」子句中設定結合條件來執行結合查詢的語法:
mysql_05_snap_03
雖然這裡會先介紹使用結合條件的結合查詢,不過不管使用哪一種寫法,在使用結合查詢時都會有一樣的想法。首先是你想要查詢的欄位:
mysql_05_snap_04
把需要查詢的欄位列在「SELECT」之後,「FROM」子句後面該需要哪一些表格就很清楚了:
mysql_05_snap_05
最後把表格與表格之間「對照」的結合條件放在「WHERE」子句中:
mysql_05_snap_06
這樣的敘述就可以查詢「所有國家的首都名稱」。

2.2 指定表格名稱

在上列的討論中,因為使用到多個表格了,所以在使用表格的欄位時,都特別提醒你要在欄位名稱前面加上表格名稱。其實並不是全部都要指定表格名稱,你只有在一種情況下,才「一定要」在欄位名稱前指定表格名稱:
mysql_05_snap_07
在查詢敘述的「FROM」子句中用到的表格,如果有一樣的欄位名稱,而且你在查詢敘述中也用到了這些欄位,就「一定要」在欄位名稱前指定表格名稱,否則都可以省略:
mysql_05_snap_08
所以省略掉一些表格名稱以後,查詢敘述就簡短多了,不過它執行查詢後的結果也是一樣的:
1
2
3
SELECT Code, Capital, city.Name
FROM country, city
WHERE Capital = ID
如果不小心違反上列的規則,你的查詢敘述在執行以後就會發生錯誤:
mysql_05_snap_09

2.3 表格別名

如果你想要查詢「國家和首都的人口和比例」:
mysql_05_snap_10
這樣的結合查詢剛好都使用到兩個表格中,有同樣名稱的欄位,所以你一定要指定表格名稱:
1
2
3
4
5
SELECT country.name, country.Population coPop,
city.Name, city.Population ciPop,
city.Population / country.Population * 100 Scale
FROM country, city
WHERE Capital = ID
這樣的查詢敘述就會比較長一些,也比較容易打錯;所以在結合查詢的敘述中,通常為幫「FROM」子句後面的表格都取一個「表格別名」:
mysql_05_snap_11
使用表格別名以後:
mysql_05_snap_12
幫「FROM」子句中使用到的表格都取一個表格別名,這樣的查詢敘述通常也可以比較簡短一些了。

2.4 使用「INNER JOIN」

執行結合查詢除了使用上列討論的方式外,還有另外一種結合查詢語法:
mysql_05_snap_13
雖然這兩種寫法看起來的差異很大,不過它們的想法會是一樣的。首先是需要查詢的欄位:
mysql_05_snap_14
接下來是需要用到的表格,不過你要使用「INNER JOIN」把兩個表格「結合」起來:
mysql_05_snap_15
最後是結合條件:
mysql_05_snap_16
上列使用「INNER JOIN」的結合查詢執行以後,跟之前使用結合條件的結合查詢,所得到的結果是完全一樣的。所以查詢「國家和首都的人口和比例」的結合查詢,也可以改用下列的寫法:
1
2
3
4
SELECT a.name, a.Population coPop,
b.Name, b.Population ciPop,
b.Population / a.Population * 100
FROM country a INNER JOIN city b ON Capital = ID
使用「INNER JOIN」的結合查詢還有另外一種選擇:
mysql_05_snap_17
下列是使用「ON」或是「USING」來設定結合條件的情況:
mysql_05_snap_18
所以如果想要查詢「cmdev」資料庫中,員工資料和他們的部門名稱,就會有三種寫法可以選擇了:
mysql_05_snap_19

3 Outer Join

在「cmdev」的員工資料(emp)表格中,部門編號(deptno)欄位是用來儲存員工所屬的部門用的;不過有一些員工並沒有部門編號:
mysql_05_snap_20
所以如果你使用「內部結合」的作法執行下列的查詢,你會發現少了兩個員工的資料:
mysql_05_snap_21
這是因為使用「內部結合」的查詢,一定要符合「結合條件」的資料才會出現:
mysql_05_snap_22
如果你想查詢的資料是「包含部門名稱的員工資料,可是沒有分派部門的員工就不用出現了」,那使用「內部結合」就可以完成你的工作了;可是如果你想要查詢的資料是「包含部門名稱的員工資料,沒有分派部門的員工也要出現」,那你就要使用「OUTER JOIN」,這種結合查詢通常稱為「外部結合」:
mysql_05_snap_23
除了多一個「LEFT」或「RIGHT」,還有把「INNER」換成「OUTER」外,其它的部份與內部結合的作法都是一樣的。

3.1 LEFT OUTER JOIN

所以在結合查詢的應用中,如果你想要查詢的資料是「包含部門名稱的員工資料,沒有分派部門的員工也要出現」,也就是希望不符合結合條件的資料也要出現的話,就要換成使用「LEFT OUTER JOIN」來執行結合查詢。OUTER JOIN分為LEFT和RIGHT兩種,在這個範例中,要使用LEFT才符合查詢的需求:
mysql_05_snap_25

3.2 RIGHT OUTER JOIN

其實使用「LEFT OUTER JOIN」或是「RIGHT OUTER JOIN」並沒有差異,以上列的需求來說,要查詢「包含部門名稱的員工資料,沒有分派部門的員工也要出現」,就是要以「cmdev.emp」表格的資料為主,所以下列兩種寫法所得到的結果是完全一樣的:
mysql_05_snap_24
瞭解兩種「OUTER JOIN」的後,下列這兩個看起來會有點混淆的查詢,雖然只有「LEFT」與「RIGHT」的差異,它們所完成的查詢需求,卻是完全不一樣的:
mysql_05_snap_27
所以使用「RIGHT OUTER JOIN」的查詢需求,就成為「部門名稱與該部門的員工資料,沒有員工的部門也要出現」:
mysql_05_snap_35

4 合併查詢

在關聯式資料庫中,因為表格的設計,你常會使用結合查詢來取得需要的資料,結合查詢指的是在「一個」查詢敘述中使用「多個」資料表。而現在要討論的「合併、UNION」查詢,指的是把一個以上的查詢敘述所得到的結果合併為一個,有這樣的需求時,你會在多個查詢敘述之間使用「UNION」關鍵字:
mysql_05_snap_29
以下列這兩個獨立的查詢來說,它們在執行以後會得到各自傳回查詢的紀錄:
mysql_05_snap_30
如果使用「UNION」關鍵字把這兩個查詢合併起來的話,就只會得到一個查詢結果,不過這個查詢結果會包含兩個查詢所得到的紀錄:
mysql_05_snap_31
在執行合併查詢的時候,有一些規則要知道與遵守。第一個規則是回傳結果的欄位名稱:
mysql_05_snap_32
第二個規則是所有查詢敘述的欄位數量一定要一樣:
mysql_05_snap_33
上列的範例比較看不出為什麼要使用合併查詢,一般來說,你大概會因為下列的原因,把原來的查詢敘改用合併查詢的寫法來完成你的需求:
mysql_05_snap_34

[MYSQL] 多個資料表(兩個以上)的連結(INNER JOIN)

第一種寫法:
SELECT * FROM(
SELECT * FROM (
SELECT * FROM (
SELECT * FROM (
SELECT * FROM `table001` AS t1 INNER JOIN `table002` AS t2 ON t1.t1_no=t2.t2_t1_no
) AS t12 INNER JOIN `table003` AS t3 ON t12.t2_no=t3.t3_t2_no
) AS t123 INNER JOIN `table004` AS t4 ON t123.t3_no=t4.t4_t3_no
) AS t1234 INNER JOIN `table005` AS t5 ON t1234.t4_no=t5.t5_t4_no
) AS t12345 INNER JOIN `table006` AS t6 ON t12345.t5_no=t6.t6_t5_no
照此架構,以此類推即可。


第二種種寫法:

SELECT
  *
FROM
  ` table001` AS t1
  INNER JOIN ` table002` AS t1 ON t1.t1_no = t2.t2_no
  INNER JOIN ` table003` AS t3 ON t2.t2_no = t3.t3_no
  INNER JOIN ` table004` AS t4 ON t3.t3_no = t4.t4_no  INNER JOIN ` table005` AS t5 ON t4.t4_no = t5.t5_no 
WHERE
  t1.status = 'y' AND t2.status = 'y' AND t3.status = 'y'

可以一直串接下去。


我個人比較推薦第二種寫法。

2014年12月21日 星期日

php 民國年日期計算

西元年轉民國年,還要再處理日期的加減
光用php的date函數或是mktime是一件很麻煩的事情

所幸php內建了DataTime這個class來協助處理這件事情

西元年轉民國年,並取得5天後的日期

$date = new DateTime("now");
$date->modify("+5 day");
$date->modify("-1911 year")
echo ltrim($date->format("Y-m-d H:i:s"),"0"); // 由於Y為四位數,所以利用ltrim去0

民國年轉西元年,並取得10天前的日期

$date = new DateTime("101-01-01");
$date->modify("+5 day");
$date->modify("+1911 year")
echo $date->format("Y-m-d H:i:s");

2014年12月15日 星期一

jquery超强定制购物车插件minicart

minicart是一款可定制性非常高的购物车插件,几行代码就可以让你的网站拥有一个简单且用户管理方便的购物车,而购物车的功能可以根据你网站的需求来定制,因为minicart提供了丰富的API给你调用。minicart可提高购物车的体验性,你的网站一旦拥有了它,将非常便捷的帮助用户管理自己的购物车。 http://www.jqcool.net/jquery-minicart.html

jQuery EasyUI 拖放 - 创建拖放的购物车

如果您能够通过您的 Web 应用简单地实现拖动和放置,您就会知道一些特别的东西。通过 jQuery EasyUI,我们在 Web 应用中可以简单地实现拖放功能。 在本教程中,我们将向您展示如何创建一个启用用户拖动和放置用户想买的商品的购物车页面。购物篮中的物品和价格将更新。 显示页面上的商品 正如您所看到的上面的代码,我们添加一个包含一些
  • 元素的
      元素来显示商品。所有商品都有名字和价格属性,它们包含在

      元素中。 创建购物车

      Shopping Cart

      Name Quantity Price

      Total: $0

      Drop here to add to cart

      我们使用数据网格(datagrid)来显示购物篮中的物品。 拖动克隆的商品 $('.item').draggable({ revert:true, proxy:'clone', onStartDrag:function(){ $(this).draggable('options').cursor = 'not-allowed'; $(this).draggable('proxy').css('z-index',10); }, onStopDrag:function(){ $(this).draggable('options').cursor='move'; } }); 请注意,我们把 draggable 属性的值从 'proxy' 设置为 'clone',所以拖动元素将由克隆产生。 放置选择商品到购物车中 $('.cart').droppable({ onDragEnter:function(e,source){ $(source).draggable('options').cursor='auto'; }, onDragLeave:function(e,source){ $(source).draggable('options').cursor='not-allowed'; }, onDrop:function(e,source){ var name = $(source).find('p:eq(0)').html(); var price = $(source).find('p:eq(1)').html(); addProduct(name, parseFloat(price.split('$')[1])); } }); var data = {"total":0,"rows":[]}; var totalCost = 0; function addProduct(name,price){ function add(){ for(var i=0; i
  • 2014年12月14日 星期日

    站長之家 介紹

    網址:http://down.chinaz.com/ 提供程式討論與源代碼

    大量使用 AJAX 效果的購物車 - TomatoCart

    TomatoCart is a professional and innovative open source eCommerce solution. The back-end is an impressive desktop-like ExtJS-powered interface, offering significant usability improvements and user experience. It's the most easy-to-use shopping cart. TomatoCart 是一個專業、創新的開放原始碼電子商務解決方案,後端使用了讓人驚豔的網頁桌面系統,使用 ExtJS 打造,大幅改善了介面的實用性與使用者體驗。這是最容易使用的購物車。 大概用了一下,後端管理介面蠻流暢的,用網頁桌面作為基礎的感覺確實很有趣,而且看起來成熟度蠻高的 官網:http://www.tomatocart.com/

    腳本之家-介紹

    網址:http://www.jb51.net/ 提供程式討論與程式碼下載

    學布園介紹

    網址:http://www.xuebuyuan.com/ 內容豐富值得推薦

    有才網介紹

    網址:http://www.youcaiw.com/ 內容豐富,值得參考

    2014年11月22日 星期六

    【歷史評論】為老兵李師科喊話

    今天看到寶傑的關鍵時刻
    看到媒體人王瑞德談到李師科這件案子
    李敖還為此寫了一篇文章為老兵李師科喊話
    為此
    我還特地重網路上找出這篇文章

    1949大陸淪陷,造成兩岸分治
    當年一些的規定,對於現在的人所看似乎匪夷所思
    可是
    在當時的時空背景下
    確實也真實存在

    所以
    不同的階層產生出不同的文化與思想
    有時候,自己除非親自經歷,那箇中滋味確實不容易理解的

    年終慰問金到底需不需要
    哪些人該有
    哪些人拿了不該拿的
    哪些人迫切需要這筆錢

    坦白說
    應該是大多數的人不應該再去拿這筆錢

    誓言再重新發放的人

    您不覺得吃像有點難看嗎??

    如果您現在的生活像李師科那樣
    那或許可以義正嚴詞

    如果不是
    那請您就閉嘴吧

    將這筆預算好好讓政府可以用於公共建設

    感謝您了!


    2014年11月3日 星期一

    動態選單 By Dreamweaver & PHP MySQL

    基本上這邊所需用的就是一般的Dreamweaver, PHP MySQL環境,不過會用到一個擴充元件來輔助。

    資料庫

     既然是一個3+2郵遞區號的範例,而且要介紹到3階層,所以在資料庫這邊就是會有3個資料表,
    分別記錄縣市(county)、鄉鎮(town)與郵遞區號(zip)的資訊。
    01  
    county資料表:
    02  
    town資料表:
    其中的 tCounty 欄位對應著 county 資料表中的主鍵欄位 cID,以前面兩筆記錄 tCounty=1 為例,
    所以它們是屬於 county 資料表中 cID 欄位為 1 的記錄、也就是台北縣的鄉鎮。
    03  
    zip資料表:
    同樣的在這邊 zTown 欄位亦對應著 town 資料表中的主鍵欄位 tID。
    04  
    而這三個資料表中的cName、tName、zName欄位值都會用來作為選單的「標籤」,
    選單「值」的部分就會用到 county 與 town 的主鍵欄位,好讓它們下一層的選單得以篩選出所需的記錄作為選項。

    頁面

    接著是頁面的部分名稱為 dymenu.php,這邊準備了一個文字欄位、三個選單與一個按鈕,置於表單 form1 中。
    範例規劃是,在使用者點選選單時能夠將表單內的資訊 POST 給自己處理,且即使選單以外的表單元件已經填寫了資訊,
    在動作之後值依然能夠保留,講白話就是假設使用者先填了『姓名』,
    在他點選選單後文字欄位已經填過的資訊依然會被保留,
    雖然這對  JavaScript  版本的多階選單來講是非常理所當然的,
    但在這邊是要靠 POST 送出的資訊來重新篩選各個階層選單所需的選項,所以還是要另做處理。
    其中:
    • 姓名文字欄位命名為 name
    • 郵遞區號部分選單依序命名為 county、town、zip
    所以你可以預料當按下按鈕或是變更縣市 county、鄉鎮 town 選單後表單內的資訊都會 POST 送出,
    這時就能以$_POST['name']、$_POST['county']、$_POST['town']、$_POST['zip']取得對應的值。
    05  

    建立各階選單資料集

    首先建立三個選單的資料集,在縣市部分沒什麼好做的,把所有縣市篩選出來就對了。
    06  
    在鄉鎮的部分是需要篩選對應縣市所屬的鄉鎮的,前面已經規劃縣市選單 county 會 POST 所需資訊,
    所以在建立資料集的時候就可以直接篩選『tCounty 欄位 = 表單變數 county』。
    07  
    同樣的在郵遞區號部分就是篩選『zTown 欄位 = 表單變數 town』
    08  
    接著我們直接在『繫結』面板中定義這幾個表單變數方便操作。
    09  
    10  

    動態選單

    在Dreamweaver中可以很輕鬆的以資料集來作為選單的項目,先來設置縣市部分,點選選單後就可以在『屬性』列找到「動態…」的按鈕。
    11  
    接著就選擇對應的資料集以及選單值、標籤的欄位即可,因為下一階層的選單都需要靠上一層選單所 POST 的值來篩選所屬的紀錄作為選單項目,所以值的部分會是主鍵欄位 cID,屆時表單 POST 後這個值就可以給下一階 town 選單所要用的 rs_town 資料集用來篩選指定縣市的鄉鎮所用。
    接著還有一件事情就是我們需要使這個選單能夠保留使用者前一次所選擇的資訊,在 Dreamweaver 中可以利用這邊『選取的值等於』來處理,在這邊可以指定一個變數給選單,當選單中的某個選項『值』等於該變數時,就會預設選取該項目,點選圖示中滑鼠指到的位置。
    12    
    在這邊就可以選擇該表單變數 county 了,所以之前才會在『繫結』面板定義,否則就要自己key code。
    13  
    設置完的縣市選單就像這個樣子,
    選單的標籤會是 rs_county 資料集裡的 cName 欄位、值則是 cID 欄位,
    且頁面 POST 給自己之後預設選取的項目就可以維持。
    14  
    接著這是鄉鎮選單 town。
    15  
    最後是郵遞區號選單 zip。
    16  
    接著於『繫結』面板拖曳表單變數 name 至文字欄位中,
    所以到目前為止只要頁面 POST 資訊給自己,所有表單元件值、選單項目都能夠被保留。
    17  
    剩下的問題就是怎麼在點選縣市、鄉鎮選單時就能夠直接 POST 資訊給自己,
    現在只能看到第一階的縣市選單理有項目,
    因為第二、三階的選單項目都必須依據上一階選單所 POST 的資訊來篩選項目,
    而在 Dreamweaver 中若指定篩選的變數為空值預設是會帶入 -1 來篩選,
    也就篩選不到任何資訊,所以二、三階選單都會是空的,
    不過實際上你可以讓二、三階選單的預設篩選變數值為第一筆資訊對應的值,
    否則它們一開始基本上就一定會是空的。
    18  
     
    Loading ... Loading ...

    選單處理

    接著要處理縣市、鄉鎮選單在選擇項目後能夠做 POST 的動作,方式很簡單就先點選要處理的選單,
    然後於『標籤檢視窗 \ 行為』面板中新增『Submit Form』,
    『行為』在各個Dreamweaver中的位置有一點小差異。
    19  
    接著就可以設置所要 POST 的表單,沒什麼好選的,目的就是自己dymenu.php。
    20  
    完成之後可以在清單中看到這樣的資訊,同樣的除了上面的縣市選單需要以外,
    鄉鎮選單 town 也需要在選擇項目後 POST,就依據同樣的方法來做處理。
    21  
    接著就來測試吧,首先在文字欄位填上資訊,然後於縣市選單中選擇一個項目。
    22  
    然後你就可以看到文字欄位中的資訊會被保留住,選擇一下第二階選單。
    23  
    毫無疑問的第三階選單就會顯示所有位於該範圍內的項目。
    24  

    還有問題?

    到目前為止看起來整個 N 階層選單已經運作無誤了,
    不過其實是有一點問題的,我們來套用一下【插入記錄】試試,
    預計要讓使用者在按下「送出」按鈕後可以將姓名以及所選擇地區的郵遞區號能夠記錄到資料庫中。
    25  
    接著嘗試選擇第一階選單。
    26  
    結果畫面出現錯誤訊息了,很明顯是因為整個程式跑去做【插入記錄】的部分,
    因為在選擇第一階選單的時候頁面就將表單 form1 裡的資訊全部以 POST 送給自己。
    27  
    但在 Dreamweaver 中對插入、更新、刪除等伺服器行為的處理方式只是去檢查收到的 POST 資訊是
    否有內定會新增的隱藏欄位 MM_insert(更新紀錄為MM_update),
    若有的話就會做指定的動作。
    28  
    實際上在套用伺服器行為後Dreamweaver就會將該作用的表單『動作』目標指向自己,
    並且想辦法包含所有已經帶上的URL參數(上圖34-37列)。
    29  
    所以就想辦法處理一下吧,這裡的方式就是去變更這個 Dreamweaver 表單『動作』目標會指向目的,
    使它會帶上一個我們自訂的 URL參數(35-40),
    然後在要做指定伺服器行為動作前所要檢查的部分多去檢查這個 URL變數 是否存在(42),
    如果該 URL變數 存在就表示這個 POST 的動作是按鈕所觸發的,
    否則單純選擇選單時是不會有的。
    30