2014年3月6日 星期四

php mssql image类型图聘存取

SQL Server有Image的欄位型態,在開發Desktop Application若需要讓使用者儲存圖片,例如大頭照、產品圖片,這時候很常將欄位設定Image型態,在使用整合型的開發工具時,通常只需要做些設定,圖片就能夠順利存取。但如果用PHP寫網頁程式,需要存取這個欄位,就需要多做一些處理。若使用的函式庫有支援Binary資料的存取功能,那只要呼叫這些函式即可解決。比較棘手的情況是,當我們只能下純文字的SQL去存取資料庫時,就必須自己動手克服。

顯示圖片比較簡單,通常只要將查詢的結果dump出來,例如:
showpic.php
$db->query("select content from images where id = 1");
$pic = $db->fetch()->content;
echo $content;

show.html


上傳圖片需要編碼處理,例如我們先用$_FILES取得上傳的圖片資訊:
$name = $_FILES['picfile']['name'];
$tmp_name = $_FILES['picfile']['tmp_name'];

接著將上傳的暫存檔案(即圖片檔)內容全部讀出來(file_get_contents的預設flag是FILE_BINARY,不會有問題)。
$c = file_get_contents($tmp_name);

再來,必須先將圖片內容以HEX編碼轉換成字串(即十六進位表示法)。
$content = "0x";
for ($i=0; $i
  $h = dechex(ord($c[$i]));
  if (strlen($h)<2 .="" h="" span="">
  $content .= $h;
}

編碼後產生的字串格式…
0x112233445566778899AABBCCDDEEFF

解說:
從圖片檔讀取每一個byte,其ASCII的值範圍是0~255,也就是需要2^8來表示(即8個bit),轉成十六進位必須要16^2表示,也就是每個byte需要儲存成兩個16進位的字元符號,所以轉換的結果以固定每兩個十六進位字元符號來表示一個byte資料的值。例如255就是FF,而10就是A,而A只用了一個字元符號,必須在前面補0變成0A。

轉換之後,要寫入資料庫就跟平常的SQL並無不同。
$db->query("insert into images(name, content) values('$name', $content)";

唯一需要注意的是,範例程式碼中的$content並不需要加上單引號,因為開頭的0x已經宣告這是一串十六進位表示的資料,若加上單引號則會被當作字串,反而會出現型態不符的警告。




出处来源:http://blog.lyhdev.com/2008/12/phpms-sql-server-image.html

2013年6月28日 星期五

CodeIgniter mod_rewrite? 問題

CodeIgniter mod_rewrite? 問題
CodeIgniter 2.0
首先注意的几点:
apache的httpd.conf文件中,有两个地方必须设置才能成功开启htaccess
其一: # LoadModule rewrite_module modules/mod_rewrite.so去掉这句前面的#号
其二:找到AllowOverride None,把其中的None改成All。
我的httpd.conf是设置成了多站点模式,配合hosts文件本地实现自定义域名的方式来访问各个不同的站点。每个站点都有一段apache的配置。其中我都加上了AllowOverride All。


當 config.php 配置是PATH_INFO時
※ CodeIgniter 本身設定不支持$_GET,因次AUTO改成PATH_INFO可以改善這問題 $config['uri_protocol'] = "PATH_INFO";
$config['enable_query_strings'] = TRUE;
 .htaccess RewriteRule ^(.*)$ index.php/$1 [L] /*注意沒有?號*/


 注意 $config['uri_protocol'] = "AUTO";時
 .htaccess RewriteRule ^(.*)$ index.php/?$1 [L] /*注意有?號*/

PS:在Windows7 X64環境下→環境配置(系統變量)→PATH(E:\AppServ\Apache2.2\bin;E:\AppServ\php5;E:\AppServ\MySQL\bin)必須給值


apache2.2.21下为codeigniter配置url地址重写

http://my.oschina.net/bootstrap/blog/85442

2012年5月24日 星期四

闖紅燈大絕招!


闖紅燈大絕招!



難得的週末本想好好的補個眠,

看可不可以消退我這張被黑眼圈渲染的黑臉,

但偏偏一大早就被彬彬有禮的同志們給吵醒,

清晨6點為什麼這麼開心~要放鞭炮呢.......凸 = = |||

算了在這歡愉的氣氛下,我也不好睡個死樣子做反應,

好歹我也是個脾氣暴躁,不顧後果的火爆浪子!!!!

於是我雙腳一蹬,就騰空飛起,便用最快的速度來到陽台,

然後對著那些有禮貌的同志們大聲的道聲早上慰問語.....

...幹你媽的~~天都亮了還打砲!!!

阿~~完了!!

這麼大聲說早安,定會吵到我室友,甲拍謝。(心想靠他又不在)

這個周末薄皮室友又按耐不住,

去彿山找他女友,拯救他一週操勞過度的十兄弟,

真可惡~426打砲,薄皮室友也打砲

是他媽的看不起我是嗎?shit!!

算了~難得週末還是別被這些愛打砲的人搞壞心情!!

還是想想該去哪走走好呢?已經兩三個禮拜沒有自己去走走了呢

作罷~懶得想~~乾脆直接到公交站去在做決定!!這才是我小貓嘛!

看了看公車路線...心裡爽度100%還蠻驕傲的嘛。

附近可以去的地方都曾被我踐踏過,

話說台灣有個公車萍~而內地有我公交貓,絕對是過之而不及阿。哈哈

好吧決定了!!今天的行程就去東莞文化廣場西。

文化廣場西,就在吉之島的上一站,是東莞比較熱鬧的地方之一。

上了車後~車子行駛5000公尺左右吧!!

我開始覺得似乎有甚麼跟平常不太一樣。

我坐的位子比較前面,就在司機的右後方,

視野可以說是VIP中的VIP

要是有人檔在我面前的話,那肯定是小宣。(阿飄)

應該是捨不得我離開家太久,要我回家去假裝讓他嚇個半死吧。

看看窗外同行的車輛,怎麼速度這麼快阿,

咻的一聲呼嘯而過,一台接著一台的消失在我眼前,

甚麼消失在我眼前~這怎麼可能,

靠邀他們是在往後呼嘯而過也。

原來我錯愕的感覺是,這台車的速度比平常快太多了,

在市區時數竟然可以達到110公里。

最誇張的是好不容易遇到了個紅燈,司機大哥為了遵守交通規則。

竟然毫不猶豫的衝上右側的人行道,再來個甩尾大回尻,

這是兩段式轉彎嗎??你他媽的這是台公車也。

不過說也奇怪,我不但不緊張還覺得有點刺激。






因為我尿褲子了.................

哪有可能??懶的寫了。

2010年10月6日 星期三

php 防止重複提交

當我們寫網頁程式時
很多時會因為用戶按了重新整理(F5)引致重複送出表單
如重複留言等問題

當然使用AJAX可以解決這個問題
但現在我介紹一個比較簡單的方式解決
在表單和SESSION中加插一個隨機隱藏數值來定義是否重複送出
請從下方繼續閱讀觀看全文


inc.function.php
<?php

//隨機產生數字
function formResubmitGen(){
 global $_SESSION;
 $_SESSION["formHash"] = rand(10000, getrandmax());
}

//輸出Hidden表單
function formResubmitPrint(){
 global $_SESSION;
 if($_SESSION["formHash"]=="") formResubmitGen();
 echo '<input name="formHash" type="hidden" value="'.$_SESSION["formHash"].'" />';
}

//輸出檢查
function formResubmitCheck(){
 global $_SESSION, $_POST;
 if($_SESSION["formHash"]==$_POST["formHash"]){
  $_SESSION["formHash"] = "";
  return true;
 }
 return false;
}
?>



guestbook.php

<?php
//必須開啟SESSION
@session_start();
//引用上面的函式
include("inc.function.php");
//檢查表單輸入及是否重複
if($_POST["name"] && $_POST["comment"] && formResubmitCheck()){
 $db->insert($_POST,tblComment);
}
?>

Name
Comment



參考文獻:http://b.lineage.idv.hk/300/teach-php-reflesh-form-resubmit

2010年10月5日 星期二

CodeIgniter 驗證碼

源代码下载地址:http://code.google.com/p/cool-php-captcha/

最新的是0.3版,所以我下cool-php-captcha-0.3.zip

解壓縮後得到cool-php-captcha-0.3目路,裡面有4個文件和一个resources目錄。

captcha.php:生成captcha的文件,关键文件;

example-form.php:一个验证页面例子;

example.jpg:生成后的效果图;

LICENSE.txt:许可协议;

resources:存放了生成時需要的資源文件,包括字体、字典和语言文件,關鍵目錄。

其实有captcha.php和resources目录就可以使用了。


因為原作不是基於CodeIgniter框架的,為了最短时間内可以使用,按下列步骤操作:

1.    建一个與system平级的resources目錄,这个是存放CI编程時用得到的資源文件,
       平時我把CSS、JS、Images都放在这里,如果你已经有類似的目录了(public),
       跳到下一步;

2.   复制captcha.phpresources目錄到剛才建的(public)目录中,
      將複製進來的resources目錄改名为captcha,目的是標記清楚,不會混淆;


 3.  告訴captchay 資源文件目錄改名了。打開“captcha.php”,
      找到“OPTIONAL Change configuration…”,
      在他下面找到“$captcha->resourcesPath = “/var/cool-php-captcha/resources”;”,
      改     为“$captcha->resourcesPath = “captcha”;”,再把前面的注釋符“//”去掉
      其它的captcha的配置可根据自己需要改變;


4.   在自己要使用驗證碼的地方,使用這個HTML代碼:



點擊更换圖片

5. 如果需要更新的話,传递一个随機數做参數就行了:


点击更换图片





6. 驗證的时候,把提交的驗證碼和$_SESSION['captcha']做比對就行了。


注意:如果按上面的步骤做,卻顯示不出驗證碼圖片,請查看.htaccess文件,確認rewrite功能把resources目錄排除了。具體語句如下:

RewriteCond $1 !^(index\.php|resources|robots\.txt)

PS:可以在config.php里增加一條語句配置資源文件目錄:



2010年9月27日 星期一

迷路

夢醒



我愕然置身於異度空間

四周充滿了透明七彩線條

透視彩線可看到一條未來的路

清楚的像是回憶

我感到自信,勇敢,不再害怕

忽然間天搖地動,群線亂舞了起來

我再也找不到來自未來的記憶

我蜷曲著身體

任由害怕趁機奪下心池

眼看彩線變的張牙舞爪

不再透明清晰,

而未來也漸漸模糊,回憶卻狂笑了起來

笑聲激昂高亢,回憶越笑越興奮

侵略的笑聲,一直不斷在我耳際迴響

使我的頭就像要裂開似的陣痛著.....








夢醒


我狂笑了起來........

2010年9月24日 星期五

VIEW的用法

VIEW的概念:

通常我們真正在瀏覽器上看到的版型,是由每個controllerlayoutaction對應的版型組合出來的。
 Layout:你可以打開album.thtml(/home/photo/app/views/layouts/album.thtml)你會發現layout只是一個外框,它並沒有處理任何有關資料呈現的方式,說明一下,
裏面的程式碼:
 echo $title_for_layout?> à 這個會對應到controllerpageTitle這個變數,你可以在controller中,修改它。
  echo $content_for_layout ?> à 這個是對應到每個action使用的view,也就是你資料呈現的地方。
  echo $this->renderElement('header');?> à 這個是有關於elemenet的機制,先簡單來說,通常一個網站所有版面中,會有許多相同的地方(: headerfooter),這時候我們就可以分離出來,讓網站的版型來共同即可。
 Action的版型:CakePHP的目錄擺法:app/views/controller/action.thtml (ex:/home/photo/app/views/ab/view.thtml),舉例來說,我們的Ab這個controller中的view這個aciton,它對應到的版型就應該是在/home/photo/app/views/ab/view.thtml。而view.thtml裏面的變數,都是來自當初在contoller中,$this->set()來的。
 Element:如同剛剛說的,通常一個網站的網頁,會有許多相同的部分,我們可以把它們分離出來,日後維護比較方便。你可以把這些分離出來的版型放在app/views/elements底下。要使用的時候,使用$this->renderElement()就可以了。

Model 用法

Model 用法:

Model是負責跟資料庫溝通用的,一個資料表會對應到一個model程式,
通常我們也會在這邊定義好資料庫中,資料表(model)與資料表(model)的關係。
Model的程式是要放在app/models裏面,要繼承AppModel (ex: class Album extends AppModel)。

Model的基本要素:

$name:和controller的$name相同,是用來告訴CakePHP這個model的名稱。

$primaryKey:是指這個model對應到的資料表中的primary key欄位名稱,
如果沒設定的話,CakePHP會預成”id”。

$useTable:是指這個model對應到的資料表名稱。CakePHP有自己一套對應的規則,
不過我們就直接指定給它比較清楚,日後維護也比較方便。

Model如何處理資料:

最簡單的方式,參照CakePHP手冊上的做法,在網頁裏面中,form的變數名稱取成”data[model_name][column_name]”的方式,這個可以透過$html這個helper來達成,
你會看到在某些view裏面,會有$html->input等的程式,就是在做這項工作。

當資料從網頁傳到controller時,controller會包裝這些資料到$data這個array中,
所以你會在controller裏面,常常看到$this->data。

資料儲存或更新至資料庫時,可以用model的save來達成,但是要注意的是,
如果沒有指定model中primaryKey的值時,model會當作是要做insert的動作,
如果有指定primaryKey的值時,則是做update。在controller的程式碼中,
ex:$this->Album->id = 1;$this->Album->save($this->data);
這個會對資料表中,primaryKey值為1的資料,做修改。

__contruct():在Model的__contruct()中,我們直接指定了Model各欄位的定義,
我們會這麼做的原因是,CakePHP在使用Model時,都會先對資料庫執行describe的指令,
來取得該資料表的欄位定義,因此我們先直接指定給Model,省去CakePHP做這樣子的動作。


2010年9月23日 星期四

cakephp 第一個範例

先修改連線設定檔,如果資料庫是 utf8 編碼,請最後加入鍵名 encoding 和鍵值 utf8:


/* /app/config/database.php */
var $default = array('driver' => 'mysql',

                          'connect' => 'mysql_connect',

                          'host' => 'localhost',

                          'login' => 'NAME',

                          'password' => 'PASSWORD',

                          'database' => 'cake',

                          'prefix' => '',

                          'encoding' => 'utf8'); // 請注意這一行!

在 app/Model/post.php 裡面宣告一個類別,代表要操作的資料庫

class Post extends AppModel
{
     var $name = 'Post';
    
     //var $userTable = 'articles'; 也可以這樣指定資料表
}


這代表了新增一個 Model ,我們採用預設的命名規則,資料表的名稱叫做 posts (複數)。

當然,我們也可以不用預設命名規則,如上所示。

接下來建立 app/controllers/posts_controller.php 當作 Controller 。

set('posts', $this->Post->findAll($conditions = null,

                                $fields = "",

                                $order = 'ID ASC',

                                $limit = null,

                                $page = 1,

                                $recursive = null));

        } // 這邊要依照 ID 排序,$condition 代表的是 SQL 的 WHERE 條件

 

        function view($id = null)

        {

            $this->Post->id = $id;

            $this->set('post', $this->Post->read());

        } // 這是閱讀單篇文章用的

}

?>
Controller 裡面的$this->set() 就是用來把變數「傳遞」到 view 中,例如


//在某個 Controller 裡面的 method

$hello = "Hello World"

$this->set('post', $hello);
這個動作可以把 Hello World 這個字串傳到 view ,變成 $post 變數,當在 view 中執行 echo $post 的時候,會印出 Hello World 。

至於 view 的寫法,


2010年9月17日 星期五

綠樂團

最新單曲【Stand by me】也是偵探學園Q(日劇)的主題曲

歌手 / 團體: 綠樂團 / the brilliant green 
所屬地區:日本 
團體簡介: 川瀨智子可說是樂隊的焦點。
她優美的歌聲及美麗的外表更是受傳媒的矚目。
精通日語和英語的她﹐常為樂隊的歌填詞。 松井亮是樂隊的吉他手﹐偶爾也為樂隊作詞。
愛換發型的他﹐ 比其他隊友換髮型的次數來得多。 奧田俊作是樂隊的主要作詞者。
他負責低音吉他手的任務。 最初樂隊只有奧田俊作和松井亮二人。
後來在1995年,他們在一間 PUB 裡認識了川瀨智子,發覺她的聲線優秀,便邀請她作樂隊的主音。
樂隊便取名為 The Brilliant Green ,簡稱為"buriguri"。在1997年的春天,樂隊得到新力唱片公司的賞識,
取得一份合約。就這樣,他們加入了樂壇。   The Brilliant Green 的歌曲屬於搖滾類型,
但並不是所有歌曲都是重型搖滾的。因為他們的音樂受了英倫式搖滾所影響! 女主音 川瀨智子以略帶憂鬱的甜美唱腔,配合具清涼感及力道的曲風,使他們的歌曲都很容易的被喜愛各類型音樂的聽眾所接受。







兩個都一樣↑↓


歌手: 松井亮 / Ryo Matsui
出生日: 1972-02-11
個人簡介:
日本綠樂團團員
星座﹕水瓶座
出身地﹕京都府
血型﹕O
喜歡的顏色﹕茶色系列
最想擁有的東西﹕各類吉他



歌手: 川瀨智子 / Tomoko Kawase
出生日:1975-02-06
個人簡介:
日本綠樂團主唱
星座﹕水瓶座
出身地﹕京都府
血型﹕ B
喜歡的顏色﹕紅色
最想擁有的東西﹕土地


歌手: 奧田俊作 / Shunsaku Okuda
出生日: 1971-07-11
個人簡介:
日本綠樂團團員
星座﹕巨蟹座
出身地﹕京都府
血型﹕B
喜歡的顏色﹕藍色
最想擁有的東西﹕電纜



冷花