install PHP DLL first:

https://msdn.microsoft.com/en-us/library/cc296170(v=sql.105).aspx

CodeIgnitor: 2.2
SQL SERVER: SQL SERVER 2008 R2
PHP: 5.4
Web Server: Apache


/application/config/database.php
$db['default']['hostname'] = '.\SQLEXPRESS';
$db['default']['username'] = 'sa';
$db['default']['password'] = 'XXXXXXX';
$db['default']['database'] = 'YYYYYYY';
$db['default']['dbdriver'] = 'sqlsrv';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

//system/database/drivers/sqlsrv/sqlsrv_driver.php
LINE 121 – 124

function db_select()
{
return $this->_execute('USE [' . $this->database.']');
}

//application/models/brand_model.php (testing model)

class Brand_model extends CI_Model {
private $table_name = "";

public function __construct() {
$this->load->database();
$this->table_name = "[Brand]";
}

public function get(){

$query = $this->db->get($this->table_name);
return $query->result_array();

}

}

Offical Website: http://www.shadowbox-js.com/index.html

sometimes we might need to decide what images need to be played instead of using

<a href="..." rel="shadowbox[Vacation]"><img src="..."/></a>

This is how we can do to create an Array to store all the object

<a id="item_img" href="javascript:;">Click me to play ShadowBox</a>

<a href="{original_img_link}" class="sbox"><img src="{thumb_img_link}"/></a>
<a href="{original_img_link}" class="sbox"><img src="{thumb_img_link}"/></a>
<a href="{original_img_link}" class="sbox"><img src="{thumb_img_link}"/></a>
<a href="{original_img_link}" class="sbox"><img src="{thumb_img_link}"/></a>
<a href="{original_img_link}" class="sbox"><img src="{thumb_img_link}"/></a>

<script>
//the array list going to be played
var play_array = [];

//we use jquery to insert the url into the list
$("a.sbox").each(function(index, element) {
		play_array.push({
			content:    element.href,
        	        player:     "img",
			title:	   element.title,
		});
});

Shadowbox.init({
		handleOversize: "resize",
		continuous: true,
		modal: false,
		skipSetup: true,
		counterType: "skip"
});

Shadowbox.setup("a.sbox", {
		gallery:        "sbox",
		continuous:     true,
		counterType:    "skip"
});

$("#item_img").click(function(){
    Shadowbox.open(play_array);
});

</script>

1) Go OOP

儘量以物件導向的方式來寫程式. 理由很簡單: 容易維護+擴充+程式重複使用!

2) Stay Away from Anything Ending With _once()

像include_once, require_once的函數儘量不要碰, 因為很耗系統資源

3) Develop With Error Reporting On

開發中記得將所有的ERROR都開啟, error_reporting (E_ALL); 才能知道你的程式在任何環境下都是正常可以RUN的

4) Use A Framework If You Need One

使用別人寫好的framework可以減少你的開發時程, 但相對的你就需要花比較多的時間去研究別人的功能以及怎麼使用. 可能要視情況來做抉擇了.

5) Use PHP’s Inbuilt Functions

儘量使用PHP內建的函數絕對會比你自己去用自己演算法來的划算(當然前提是要符合你的需求)

6) Protect Your Database

The best and safest way is to use mysql_real_escape_string() for all database before it is added to the database. 筆者是建議使用函數mysql_real_escape_string()來防止惡意的SQL INJECTION. 也可以用addslashes() 但聽說還是有漏洞就是了. 另外很重要的是要審核任何POST或GET, 不要使用REQUEST, 以防止不必要的漏洞存在.

7) Use POST Not GET

儘量用POST. 理由很簡單, 因為GET的QUERY STRING在網址列很容易被看到, 增加多一道鎖, 讓有心人士需要花更多時間來破解你的程式是絕對劃得來的.

8) Draw Before You Code

先用張白紙來畫出你的應用程式構圖, 流程, 釐清腦海中的構思.

9) Understand Your Project

這是必然的吧?

10) Code Code Code

多寫自然就會進步了!

參考資料:
給PHP 開發者的10個貼心建議: http://www.htmlgoodies.com/beyond/php/article.php/3907521

Silverlight 3.0 內建了3D功能,亦支援GPU硬體加速,
以下是一些Silverlight 3D的實例:

http://www.denebspace.com/blog/wp-content/uploads/2008/12/silverlight3d1.html

Kit3D – a 3D C# graphics engine for Microsoft Silverlight
http://kit3d.codeplex.com/

http://www.markdawson.org/kit3d/demos/sl2/tigertexture/testpage.html

http://sildev.net/#demo1

Balder – Get a flying start with Balder, 3D engine for Silverlight.

balder.codeplex.com

Getting Start: http://vimeo.com/13659554

R中有很多的模組與套裝軟體都是PHP所沒有的, 若能夠將這兩個平台結合起來將會將很多工作簡化起來, 以下是結合PHP與R的一個範例, 但通常我們使用到網頁服務(web service)都要考量到TIMEOUT的問題. 若R需要大量的computational time, 則表示PHP勢必會造成TIMEOUT; 所以解決方法可能就要再另外寫一個LOADING BAR, 或者用FLASH, SILVERLIGHT等RIA的方式來操控了.

以下範例應該是以LINUX裝R的機器為主, 若要在windows Server的R上去執行exec()可能需要設定其他的環境變數, 由於尚未實際操作, 所以先略過這個部分了.

http://www.r-bloggers.com/integrating-php-and-r/

台灣R的官方網站載點: http://cran.csie.ntu.edu.tw/

這一篇將介紹如何讓Silverlight在事件觸發之後傳輸資料給PHP的SOAP web service.

STEP1: 在VS2010的Silverlight專案按右鍵 > Add Service Reference

step3

STEP2: 確認你的wsdl 已經上傳到web server上之後, 將他的路徑輸入在 "Address"的欄位之中. 並按下 "Go", 就可以看到ageService的SOAP出現在Services的欄位中.

此外, 為了方便起見, 我們也將Namespace命名程成 "AgeService" (這名字將會在xaml.cs中再度用到)

step4

Step3 : 按下OK之後就會發現專案檔中出現兩個新的檔案, 一個是AgeService, 另一個是config檔. 雙擊config檔.

step5

Step4: 你會發現剛剛設定的東西已經被記錄到Config檔裡面去了.

step6

STEP5: 接下來是處理XAML.CS中的事件, 其中包含了兩個function的CODE:

namespace SilverlightApplication2
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

            AgeService.ageServicePortTypeClient client = new AgeService.ageServicePortTypeClient();
            client.getAgeCompleted += new EventHandler(client_getAgeCompleted);
            client.getAgeAsync(txtName.Text);
            HtmlPage.Window.Alert(txtName.Text);
        }

        void client_getAgeCompleted(object sender, SilverlightApplication2.AgeService.getAgeCompletedEventArgs e)
        {
            HtmlPage.Window.Alert(e.Result.ToString());
        }
    }
}

STEP6: 將Silverlight Application再BUILD一次, 並將新的XAP檔上傳到遠端主機上.

STEP7: 再RUN一次index.php, 並輸入關鍵字 "alfie" 則輸出"27″, 這樣就大功告成了!
last

檔案之間的對照表:
comparison

在網路上搜尋關於初學者以PHP處理Silverlight的教學文章不多,

但就以這篇我測試後是OK的,

所以在這裡希望能用中文簡略的來重新記錄一遍.

測試環境:

  • Windows Server 2008 IIS 7.0
  • FastCGI (PHP環境)
  • PHP 5.2.14 (必須開 soap 與 xmlrpc的模組)
  • Silverlight 4 (確認你的CLIENT已經安裝好silverlight, 其實就像裝Flash Player那麼簡單)

使用的Tools:

  • Visual Studio 2010
  • Silverlight 4 tools
  • PHP IDE (都可)

使用到的檔案:

  • index.php: 顯示silverlight的頁面, 其實對silverlight不熟悉的人可以把它想成是Flash的swf檔, 就像把swf用HTML的object 包起來然後指定路徑顯示而已.
  • ageService.php: 使用者自己寫的class檔, 還有開啟SOAP的程式也會記錄在裡面
  • ClientBin/SilverlightApplication2.xap: 當你用Visual Studio 2010編輯完成後Build出來的就是一個放在ClientBin的xap檔, 事實上在PHP的環境裡, 你只要把xap上傳就可以了, 起他的xaml檔都是原始碼, 讓你日後維護修改再Build的時候可以用到.
  • ageService.wsdl: 這是根據W3C制定的一種XML格式, 內容其實就是告訴SOAP可以接受甚麼, 可以傳送甚麼, 格式是甚麼, 將會吃進甚麼CLASS. 這個檔案將會在ageService.php裡面被拿來用.

index.php內容如下:
source的部分指定了xap檔的路徑, 吃進這個檔案基本上就可以顯示Silverlight的內容了.

indexphp

ageService.php內容如下:

ageService這邊顯示了使用者自訂的Class, 以及如何使用PHP來啟動SOAP服務. 這裡的class只是使用了一個簡單的IF範例. 若使用者輸入的字串為"alfie"則回傳"7″給SILVERLIGHT程式; 若使用者輸入"catherine", 則回傳"21″給SILVERLIGHT程式. 一般來說, 這裡的CLASS大部分都是用來處理MYSQL所讀取的資料. 為了簡單示範, 這裡就不用太複雜的範例了.

ageServicephp

ageService.wsdl內容如下:

仔細看這個XML的內容可以發現他REQUEST是吃進一個STRING, 然後回復的時候是回傳一個INT,
getAge是使用者自訂Class的function, 而這篇教學的重點也是圍繞在這個getAge function.
要注意的是wsdl的內容也要指定SOAP Service的路徑, 也就是web伺服器的php位址.

wdsl

ClientBin/SilverlightApplication2.xap :

xap是由一連串步驟所形成的, 步驟如下:

1. 建立基本的silverlight介面, 可透過編輯XAML檔來達成, 內容就是簡單的Textbox與一個按鈕, 我們希望做到當使用者按下按鈕的時候會顯示使用者輸入的內容, 所以要透過event_handler來處理, 也就是在button中加入一個attribute: Click. 方法很簡單, 只要在Design頁面點兩下Button 就會跳到事件處理的頁面, 畫面如步驟2.

xaml

2. 事件處理寫法:

每個xaml底下都會有一個.cs或者.vb檔, 取決於你一開始選擇的語言(所以基本上還是要學會一點VB跟C#的寫法的), 點兩下cs檔一樣可以到達事件的處理頁面.

xamlcs

MainPage.xaml.cs: 底下紅色框框的程式當使用者按下button之後會跳出Javascript的alert視窗, 並顯示txtName的內容. 淺色紅色框框的部分是待會會繼續討論的部分這裡先帶過.

xamlcs2

接下來就把XAML等資料BUILD一次:

step1

這樣一來再ClientBin裡面就有了最新的XAP檔

step2

將這個XAP檔上傳到WEB SERVER上後, 瀏覽index.php看看

result1

Silverlight成功跑起來了!接下來我們要試試用PHP與Silverlight做溝通.

請按此看下篇