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();