顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

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

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月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()就可以了。

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月14日 星期二

php安全程式範例

php安全寫code的範例

提供了6大種的攻擊方式

相對的提供了6種解決方法

好文章值得推薦!!!



PHP安全程式寫作

網路應用程式的安全性如今已是大家重視的話題,但是在程式開發過程,常常是到了最後一刻才將security的部分補足。
其中有一個原因是安全程式碼撰寫的概念並未建立,如果在程式撰寫階段就將安全性的問題考慮進去,在日後檢驗與維護系統安全時,將會更容易。

因此,我們針對從客戶端送進來的資料常見的六種攻擊方式,分別提示PHP程式如何撰寫來防禦這些攻擊行為:
1. SQL 注入攻擊 (SQL injection attack)
2. 操縱 GET 的值 (manipulating GET variables)
3. 緩衝器溢位攻擊 (buffer overflow attack)
4. 跨站腳本攻擊 (cross-site scripting)
5. 操縱瀏覽器內的資料 (manipulating data inside the browser)
6. 遠程表格遞交 (remote form posting)

另外,下面有幾項簡單的安全性原則是每一個PHP程式撰寫者都應該遵守的:
1.永遠不信任外來的資料
外來的資料包括所有不是直接由programmer撰寫於PHP code裡的資料,像是從GET、POST取得的input、database、configuration file、session variable、cookie等,這些資料在經過驗證或消毒以前都必須將它視為tainted。而通常最簡單的消毒input方式是利用regular expression,定義你所接受的字串類型或內容。

2.確保一些PHP設定例如register_globals、display_errors等已關閉
如果開啟register_globals,將造成GET和POST的值($_GET、$_POST)都能直接使用$variable去接收,這將造成安全性問題。另外,當系統上線後錯誤報告必須謹慎處理,不該讓它出現在瀏覽畫面上,許多attacker就是利用錯誤報告內的資訊來猜想你系統的相關內容,所以要記得關閉display_errors等error-reporting的功能。

3.寫簡潔清晰的程式碼,使安全漏洞更容易被檢查出來
避免使用艱深的語法,這種寫法或許會有較好的效能,但是如果無法簡單地讓人了解code的內容,也會造成安全性判斷的困難。

4.把「深度防禦」列為座右銘
對於網路應用程式的安全必須為全面性的,當你已利用regex檢驗GET的input值後,當然也不能遺忘SQL query內是否也有安全性的疑慮。

SQL注入攻擊(SQL injection attack)

為了防止form重複提交。
可以在form提交成功以後用header來重定向一下,
這樣用戶不管怎樣重新整理頁面也不會造成重複提交form了,
用js或html meta的方式一般情況下會有緩存,
可能會造成form重複提交,用header就不會哩。




$login = $_REQUEST['login'];
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$op = $_REQUEST['op'];

大家注意,关键在这儿,header的时候一定要在内容输出之前操作,否则会报错的!

if ($login) {
if ($username == 'test' && $password == 'test') {
header("Location: login.php?op=succeed");
} else {
header("Location: login.php?op=failed");
}
}

switch ($op) {
case 'succeed':
echo 'Logged succeed!';
break;
case 'failed':
echo 'Logged failed!';
break;
}
?>

username:

password:








參考文獻: http://q.sohu.com/forum/5/topic/3479759

2010年8月5日 星期四

如何用 PHP 產生圖表? pChar

pChart 是用來產生圖表的PHP物件導向框架,

現今大多數的圖表函式庫皆需要費用,pChart 卻是免費的。

圖表的資料可以是SQL查詢結果、CSV檔案、或是以手工的方式填入。

pChart,PHP如何自動產生圖表,PHP圖表,圓餅圖,曲線圖, 統計圖,直線圖,3D圖,




參考文獻: http://pchart.sourceforge.net/index.php

2010年2月7日 星期日

匯率即時更新

$html_path                       設定要讀取的網頁
file_get_contents($html_path) 把讀趣的網頁轉成html存這字串中
highlight_string($result) 顯示html
eregi("123",$result.$temp) 把想要讀取的部分擷取出來
str_replace('123', '', $temp[0]);把不要的部分用空白取代

function exchange(){
$html_path = "http://consumer.chinatrust.com.tw/ch/int_rate/EX_RATE.html"; //國泰世華匯率
if ($html_path) {
$result = file_get_contents($html_path);
$result = iconv("big5","utf-8",$result);
//highlight_string($result); // 顯示html
}else {
//echo "錯誤 : 無法開啟網站!";
 exit();
}
eregi('人 民 幣 / CNY 4.5760', $result, $temp); //設定過濾條件


$exchange_rate = array();
$exchange_rate[1] = str_replace('人 民 幣 / CNY ', '', $temp[0]);

$rate = 1/floatval($exchange_rate[1]);

return $rate;
}


參考文獻: http://blog.roodo.com/nextstep/archives/185546.html

2009年12月18日 星期五

字串取代

字串取代



$originalString = "I like red cars, and I have a red car near my red bike.";
$newString = str_replace("red","green",$originalString);

echo $originalString."<br/>";
echo $newString."<br/>";

2009年8月20日 星期四

檔案上傳測試

8.

9. 檔案上傳測試:

15.

16.

setChmod(0666);

//取得上傳檔案
$file = $upload->getFiles('portrait');

if ($file->isValid()) {

//設定上傳後的檔案名稱


function get_support_img_extension($filetype) {

switch ($filetype) {
case 'image/pjpeg': return 'jpg'; break;
case 'image/jpeg': return 'jpg'; break;
case 'image/png': return 'png'; break;
case 'image/x-png': return 'png'; break;
case 'image/gif': return 'gif'; break;
case 'image/bmp': return 'bmp'; break;
default: return false;
}

}

$ext = get_support_img_extension($HTTP_POST_FILES['portrait'][type]);
$c = (string)$date.".".$ext;


$a="123.jpg";
$file->setName($a);

//限制上傳檔案的副檔名,只接受jpg和JPG
$file->setValidExtensions(array('jpg','JPG','png','bmp','gif'),'accept');

//儲存檔案
$moved = $file->moveTo('./');
rename($a,$c);
if (!PEAR::isError($moved)){ echo '圖像上傳成功:

若圖片沒更新,請重新整理此頁面';
$pic_string = '';
$new_file_name="./upload_pic/$c";
if($file->isValid())
copy($c, $new_file_name);

unlink($c);
header("Location:create_first.php?pic=$pic_string");
// $upfile="./upload_pic/".$_FILES['portrait']['$a'];
//copy($file,'./upload_pic/$c');
//move_uploaded_file($_FILES['portrait']['$c'], $upfile);
//unlink($file,'./upload_pic');

}
else echo '圖像上傳失敗:'.$moved->getMessage();

} else if ($file->isMissing()) {
echo '沒有圖像上傳!';
} else if ($file->isError()) {
echo '檔案上傳異常:'.$file->errorMsg();
}

echo '
'.$_POST['hello'];
}
?>


檔案上傳
參考文獻
http://blog.raienet.com/410

http://andy.diimii.com/2008/12/pear%E6%AA%94%E6%A1%88%E4%B8%8A%E5%82%B3http_upload%E7%AF%84%E4%BE%8B%E8%A3%9C%E5%85%85/

http://pear.php.net/package/HTTP_Upload/download

2009年8月19日 星期三

透過 PHP + cURL 發噗



<?php
/**
* 透過 PHP + cURL 發噗
*
* @author: Vexed
* @see: http://blog.xuite.net/vexed/tech/22023458
*/
define('NICKNAME', 'super_cat'); // 就是帳號
define('PASSWORD', 'cat7777'); // 就是密碼
define('USER_ID', '3889307'); // 登入後,在 HTML 原始碼裡找到 user_id 對應的值

$message = $_POST['talk'];

$ch = curl_init();

// 產生 Cookie ,以便記住登入後的 Session
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

// 登入
curl_setopt($ch, CURLOPT_URL, 'http://www.plurk.com/Users/login');
curl_setopt($ch, CURLOPT_POSTFIELDS, 'nick_name=' . NICKNAME . '&password=' . PASSWORD);
curl_exec($ch);

// 貼文
curl_setopt($ch, CURLOPT_URL, 'http://www.plurk.com/TimeLine/addPlurk');
curl_setopt($ch, CURLOPT_POSTFIELDS, 'qualifier=says&content=' . urlencode($message) . '&lang=tr_ch&no_comments=0&uid=' . USER_ID);
curl_exec($ch);
curl_close($ch);

header("Location:http://www.plurk.com/super_cat");
?>