Pages

Subscribe:

Ads 468x60px

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/ 內容豐富,值得參考