2010年12月12日 星期日

php5 json_decode回傳array

在php5內的json_decode的第二個參數決定回傳值為std class或array

$json = json_encode(['a' => 'b']);

// 回傳 std class
var_dump(json_decode ($json));

// 回傳 array
var_dump(json_decode($json, true));

2010年11月20日 星期六

PHP 的 XOR

唉!真不知道該說PHP不用指定變數型態這件事情到底好還是不好! 這兩天在寫一段加密的程式,有用到XOR 結果JAVA和PHP的流程部份一模一樣 結果加密後的結果確有些不相同 更扯的是XOR沒辦法自己解密成功 = = 到最後才發現XOR的字元必須用ord做轉換再做XOR 還好在網上有找到別人寫好的程式碼

/**
 * XOR encrypts a given string with a given key phrase.
 *
 * @param     string    $InputString    Input string
 * @param     string    $KeyPhrase      Key phrase
 * @return    string    Encrypted string    
 */    
function XOREncryption($InputString, $KeyPhrase){

    $KeyPhraseLength = strlen($KeyPhrase);

    // Loop trough input string
    for ($i = 0; $i < strlen($InputString); $i++){

        // Get key phrase character position
        $rPos = $i % $KeyPhraseLength;

        // Magic happens here:
        $r = ord($InputString[$i]) ^ ord($KeyPhrase[$rPos]);

        // Replace characters
        $InputString[$i] = chr($r);
    }

    return $InputString;
}

// Helper functions, using base64 to
// create readable encrypted texts:

function XOREncrypt($InputString, $KeyPhrase){
    $InputString = XOREncryption($InputString, $KeyPhrase);
    $InputString = base64_encode($InputString);
    return $InputString;
}

function XORDecrypt($InputString, $KeyPhrase){
    $InputString = base64_decode($InputString);
    $InputString = XOREncryption($InputString, $KeyPhrase);
    return $InputString;
}

2010年10月11日 星期一

chrome font size無法設定小於12px???

今天遇到了一個問題

我將某一區塊的font-size設為10px

IE、Firefox都起作用了,但偏偏Chrome沒效果 我就想是不是我打錯字了!

結果最後上google查

Chrome要將字體大小設於小於12px

必須再加上一個webkit獨有的屬性

-webkit-text-size-adjust:none;

2010年8月19日 星期四

如何取得youtube縮圖及id

本來想要每個禮拜都來寫個文章的!結果又偷懶! 哈!又累積好多東西沒寫了,算了,不重要! 今天為了寫出這個網址上的效果http://www.artofchineseliving.com/video 想要利用fancybox顯示youtube影片, 千找萬找!終於讓我找到直接embed的方法(非常的簡單!) 網址只要輸入 [http://www.youtube.com/v/影片id] 即可 可是事實上一般使用者所看到的網址都是 http://www.youtube.com/watch?v=影片id 為了讓使用者在後端方便輸入,並減少資料庫的空間,就寫了一支php程式來取得影片id

function video_id($url)
{
    $parse_url = parse_url($url);
    $query = [];
    parse_str($parse_url['query'], $query);
    if (! empty($query['v'])) {
        return $query['v'];
    }

    $t = explode('/', trim($parse_url['path'], '/'));
    foreach ($t as $k => $v) {
        if ($v == 'v') {
            if (! empty($t[$k + 1])) {
                return $t[$k + 1];
            }
        }
    }

    return $url;
}

echo $video_id = video_id("http://www.youtube.com/watch?v=vXz7O245Row");
echo video_id;
//應該會回傳vXz7O245Row,只要將這一串id存入資料庫即可


//在取出的時候就可以做一些應用及變化了
//直接連到youtube
echo sprintf('link',$video_id);

//利用swfobject embed
echo sprintf('new SWFObject("http://www.youtube.com/v/%s", "mymovie", "425", "356", "8", "#ffffff");',$video_id);

//取得縮圖
echo sprintf('',$video_id);

2010年7月21日 星期三

session遺失???和cookie有關聯嗎?

好奇怪為什麼突然會被登出?

為什麼同一台電腦換個browser就得再重新登入?

為什麼明明我都註冊session了,

為什麼會發生這種事?

實際上server端在確認client是否為同一個使用者

是利用cookie來確認使用者身份的,

流程是 browser 送 cookie到server端

server端再利用cookie內記錄的session_id來確認session資訊

所以程式在開發的時候發現無緣無故被登出,又查不出原因的話!

記得查看看cookie是否啟用了,或者是否被建立起來了

2010年7月20日 星期二

php sql語法產生器

function SQLCreator($params, $type = 'insert')
{
    $type = strtolower($type);
    if (! in_array($type, ['insert', 'update'])) {
        die('errors');
    }
    $data = [];
    $result = '';
    foreach ($params['value'] as $key => $value) {
        if (in_array($key, $params['field'])) {
            $field = sprintf('`%s`', $key);
            $value = sprintf("'%s'", (! get_magic_quotes_gpc()) ? addslashes($value) : $value);
            $data[$field] = $value;
        }
    }

    switch ($type) {
        case 'insert':
            $table = $params['table'];
            $fields = implode(',', array_keys($data));
            $values = implode(',', array_values($data));
            $result = sprintf('INSERT INTO `%s` (%s) VALUES (%s)', $table, $fields, $values);
            break;
        case 'update':
            $table = $params['table'];
            $fields = [];
            foreach ($data as $key => $value) {
                $fields[] = sprintf('%s=%s', $key, $value);
            }
            $fields = implode(',', $fields);
            $result = sprintf('UPDATE SET `%s` (%s)', $table, $fields);
            if ($params['condition']) {
                $result .= ' '.$params['condition'];
            }
            break;
    }

    return $result;
}

$params = [
    //定義資料表名
    'table' => 'test',
    //定義資料表欄位
    'field' => ['field'],
    //定義欄位的值array('欄位'=>'值');
    'value' => [
        'field' => 'test',
    ],
    //在使用UPDATE時所需的條件
    'condition' => 'WHERE s_id = 1',
];
// 第一個參數是傳入insert或者是update
echo SQLCreator($params, 'update');
/*
 * PS.無法在值裡面定義MySQL的函式喔,這一點要注意,如果要在欄位裡面用成MySQL的函式就要再修正一下傳入值的方法,
 * 有要用的人就自行修改,不夠這個目前足以應付很多的INSERT或是UPDATE了
 */

2010年7月6日 星期二

php 大量發送email的小技巧

相信許多人在寫大量發信的時候, 都會要求使用者不能關閉正在發信的視窗, 因為關閉視窗發email的機制就會中斷, 或者也有人提出另外一種作法就是利用cli的方式執行 在linux上丟到background處理,在windows內用at的指令下排程! 不過事實上不必那麼麻煩! 只要利用php的ignore-user-abort加上set_time_limit來執行即可 這樣處理即使user關掉電腦,php還是會繼續執行下去的 寫個簡單的範例好了

//讓程式執行到結束為止
set_time_limit(0);
//瀏覽器關閉後繼續執行
ignore_user_abort(true);
sleep(15);
touch("/test.txt");

執行後15秒可以到根目錄下看是否建立test.txt這個檔案(記得要開放寫入權限) ※利用這個方式,可能會發現Browser無法再瀏覽該網站的任何一個頁面, 這個在之前有提過Session的問題,記得執行session_commit就可以避免此問題了

2010年7月5日 星期一

PHP Session的使用注意事項

不知道大家有沒有發現AJAX號稱是非同步作業, 所以正常來說同時間執行三個AJAX, 三個AJAX執行完後的順序應該會不同, 但實際在測時,有用到Session的話, AJAX絕大部份都會照先後順序執行結束, 其實這個問題就是Session在作怪, 這個問題應該怎麼說呢? 一般在主機的設定Session是存在檔案系統內 Session開啟時,該檔案的資源就會被佔用 所以同時使用AJAX時,程式必須等到Session的檔案資源被釋放 Session才會再次被讀取。才會造成AJAX一點都不順 講了這堆廢話!當然重點是有解法囉! 下一行指令即可!

session_commit();

記得commit之後再直接修改$_SESSION的值是沒用的喔! 不過有需要修改到Session還是有辦法處理的

session_commit();
//要執行的程式
session_start();
$_SESSION["test"] = "test";
//再次commit即可!
session_commit();

2010年6月21日 星期一

php utf8中文正規表示式

preg_match_all('~[\x{4e00}-\x{9fa5}]+~u', $string, $matches);
var_dump($matches);

php取得副檔名的寫法

php取得副檔名有許多做法

//example1
function file_extension($filename) {
    return substr(strrchr($filename,'.'),1);
}

//example2
function file_extension($filename) {
    return end(explode(".", $filename));
}

//但實際上這樣寫就夠了
echo pathinfo($filename, PATHINFO_EXTENSION);

pathinfo在檔案的處理上十分的好用, 其實不加入第二個參數它會回傳陣列, 至於回傳什麼值大家請用var_dump看就知道了

2010年6月17日 星期四

javascript事件event之target

這篇的話!就直接來看範例好了!

click click

var click = function(e){
alert(this.tagName);
}
document.getElementById("div").onclick = click;
document.getElementById("span").onclick = click;

在此範例內用了一個div包覆了一個span並給予click事件,

 span的部分利用position:absolute;並給z-index讓span壓在div之上! 

原本預定的結果是只點擊span只會觸發span的onclcik,

可是實驗證明了在這個狀態之下會觸發div及span的click

大家可以點上面的div及span就可以看到所述描的情形!

為了避免這種情形,可以利用event的target來做規避!

onclick的程式碼修正如下

結果:
click click
這樣就不會重覆觸發事件了!

不過這個解決方法在android的browser就破功了!

因為android的browser沒有target或者是srcElement的屬性啊~~~


2010年6月7日 星期一

PHP之Deprecated: Assigning the return value of new by reference is deprecated問題

會發生這個問題大部份都是在php升級後發生, 尤其是用了別人的套件或者是framework的人最容易會發生, 會發生這個錯誤的原因是php5.3版本大幅修改reference的bug... 解決的方法不是升級framework或是將display_error設為off

2010年5月30日 星期日

jquery cookie

是不是對cookie的操作很麻煩!那就來用個jquery cookie吧;用法很簡單

//設定 example 為 foo
$.cookie("example", "foo"); 

//設定 example 為 foo 且存活7天
$.cookie("example", "foo", { expires: 7 }); 

//設定 example 為 foo cookie 存活7天 且cooke path為 /admin
$.cookie("example", "foo", { path: '/admin', expires: 7 });

//取得example的值
$.cookie("example");

//刪除example
$.cookie("example", null)

php5的try catch

有用過其他程式語言的人都知道try{}catch(e){}這個東西, 沒想到最多人用的php在4版以前沒有, 所以很多地方都要加一堆有的沒的判斷很麻煩, 不過現在php大部份hosting也都升級到php5了! 所以把這個東西拿出來講一下, try...catch來介紹一個我目前想到最好用的地方吧! 就是mysql在新增或修改資料的時候如果有資料表欄位設為unique的時候,就超好用的了, 例子如下

//假設欄位title設為unique
//php4可能這樣寫
$id = $_POST['id'];
$title = $_POST['title'];
$query = mysql_query("SELECT * FROM table WHERE title = $title");
$row = mysql_fetch_assoc($query);
if(empty($row)){
    //新增資料
}else{
    if($row['id'] == $id){
        //修改資料
    }else{
        echo "資料重覆";
    }
}

//但在php5就這樣寫就好
try{
    if(empty($id)){
        //新增資料
    }else{
       //修改資料
    }
}catch(Exception $e){
    //新增或修改資料unique欄位內容重覆時mysql會回報錯誤
    echo "資料重覆";
}
//PS Exception的狀況有很多可能你的SQL語法寫錯,它也會報錯所以在開發的時候建議把Exceptioin給它Throw
try{
    if(empty($id)){
        //新增資料
    }else{
       //修改資料
    }
}catch(Exception $e){
    throw $e;
}