[php] xajax 的表單選擇欄位(checkbox、option、radio)的處理教學

在前面,海芋曾經介紹過兩篇xajax的教學文件,分別為「xajax 的基本介紹及語法教學」及「xajax 的表單輸入欄位(input、textarea)的處理教學」,如果你有開始使用的話,相信你對於表單的選擇欄位,一定會想知道怎麼處理表單其它的欄位,如checkbox等。

而在這篇文章中,將以一個完整的範例做為開頭,來講解如何得到表單中的值,當然若你還不了解什麼是HTML語法的話,那麼不好意思,得請你跳過這篇,好好先去惡補一下HTML語法囉!

而XAJAX是需要PHP的搭配的,若你沒有安裝PHP的環境,以及下載XAJAX的核心檔案,別忘了去下載及設置所需要的環境喔!
Read More

[php] xajax 的表單輸入欄位(input、textarea)的處理教學

如果要使用xajax來處理input的資料,就如同使用php來處理一樣,其實是非常容易的。而以下就將介紹如何使用xajax來檢查用戶帳號和密碼是否有輸入。

首先,先看一下原始的程式碼如下:

<?php
include_once ("./xajax/xajax_core/xajax.inc.php");
$xajax = new xajax();
$xajax->registerFunction("processform");

function processform($form){
$res = new xajaxResponse();
$username = $form['username'];
$password = $form['password'];
$expr = $form['expr'];
if (trim($username) == '')
$res->assign("nousername", "innerHTML", "Please input a username");
else
$res->assign("nousername", "innerHTML", "");

if (trim($password) == '')
$res->assign("nopassword", "innerHTML", "Please input a password");
else
$res->assign("nopassword", "innerHTML", "");
$res->assign("expr", "innerHTML", $expr);
return $res;
}

$xajax->processRequest();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
$xajax->printJavascript("/xajax");
?>
</head>
<body>
<form id="form1" action="javascript:void(null);">
<div>username: <input type="text" name="username" /> <span id="nousername"></span></div>
<div>password: <input type="password" name="password" /> <span id="nopassword"></span></div>
<div>expr:
<textarea name="expr" cols="45" rows="4"></textarea>
<span id="expr"></span>
</div>
<input type="button" value="Click Me" onClick="xajax_processform(xajax.getFormValues('form1'));" />
</form>
</body>
</html>

 

Read More

[php] xajax 的基本介紹及語法教學

xajax 是一個 ajax 和 php結合的framework,他提供了程式設計師很快地就可以進入ajax的開發,而且其實不用太怎麼知道ajax的核心內容。而這個方便的framework,可以從xajax的官方網站下載來使用。

而官方網站提供一個範例,以下就是他的範例來進行講解。

<?
include_once ("./xajax/xajax_core/xajax.inc.php");
$xajax = new xajax();
$xajax->registerFunction("sayhello");

function sayhello($arg){
$res = new xajaxResponse();
$res->assign("SomeElementId", "innerHTML", $arg);
return $res;
}

$xajax->processRequest();
?>
<html>
<head>
<?
$xajax->printJavascript("/xajax");
?>
</head>
<body>
<div id="SomeElementId"></div>
<button onclick="xajax_sayhello('It worked!');">Click Me</button>
</body>
</html>

Read More

[php] 使用parse_url 來解析網址

我們會傳送一大串網址,然後要解析的話,只能不斷地去切token來解析。但是在php中,一定要學會使用前人所寫過的函式,這樣開發速度才會快別人一截。當然,要解析網址的話,就得去找相關的指令,而今天要介紹的,就是php中的parse_url這個函式。

這個函式主要是用來解析網址,而首先先看一下這個函式原型,其官方描述如下:

mixed parse_url ( string $url [, int $component= -1 ] )

而php官方舉了一個例子,而我將他擴充如下,以方便講解。

$url = 'http://username:[email protected]/path?arg1=value1&arg2=value2#anchor';
print_r(parse_url($url));

首先,先看一下這個程式的輸出結果

Array (
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg1=value1&arg2=value2
[fragment] => anchor )

其中,scheme是指他走的路線,而host則是站台網址,user則是使用者名稱,pass則是密碼,path則是路徑,query則是參數,fragment則是錨點。

而在「$component」的部份,則是有以下的參數可供傳遞。

  • PHP_URL_SCHEME
  • PHP_URL_HOST
  • PHP_URL_USER
  • PHP_URL_PASS
  • PHP_URL_PATH
  • PHP_URL_QUERY
  • PHP_URL_FRAGMENT

而這幾個參數則分別代表了Array中的scheme、host、user、pass、path、query和fragment。

同樣,舉例來說,如果使用PHP_URL_PATH和PHP_URL_QUERY來說,以下為他的示範。

$url = 'http://username:[email protected]/path?arg1=value1&arg2=value2#anchor';
echo nl2br(parse_url($url, PHP_URL_PATH)."\n");
echo nl2br(parse_url($url, PHP_URL_QUERY)."\n");

而輸出結果將如下:

/path
arg1=value1&arg2=value2

參考網頁:php:parse_url

[php] 如何得到使用者的真實ip

 

有些人會使用proxy這個方法來達到網頁加速的目的,但是這麼一來也間接地讓php傳統的偵測ip方式來偵測到使用者真實的ip。而如果有心人士要攻擊網站,又走proxy的話,這時怎麼得到他的真實ip呢?你可以透過以下的方法來偵測。

if (!empty($_SERVER['HTTP_CLIENT_IP']))
   $ip=$_SERVER['HTTP_CLIENT_IP'];
else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
   $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
else
   $ip=$_SERVER['REMOTE_ADDR'];

 

參考網站:php:$_server

另外,也可以參考「綠色工廠」或是「CNBlogs」的補充囉!

[php] 利用 curl 來抓取網頁結果

如果要用php來抓取網頁,一般人最常想到的就是「fopen」這個函式了。但現在有了更強大的函式,「curl」,至於這個函式怎麼用呢?就往下看吧!

如使用 mysql 一樣,首先,我們必須先建立一個「curl」的連線,也因此,必須使用到「$ch = curl_init()」這個函式。而為了怕建立連線忘了關閉。因此,必須先寫好關閉的函式,「curl_close($ch)」。

接下來,你可以設定他截取網頁的選項,一般來說常用的有「CURLOPT_RETURNTRANSFER」、「CURLOPT_URL」、「CURLOPT_HEADER」、「CURLOPT_FOLLOWLOCATION」、「CURLOPT_USERAGENT」這幾個選項。而這幾個選項分別代表「將結果回傳成字串」、「設定截取網址」、 「是否截取header的資訊」、「是否抓取轉址」及「瀏覽器的user agent」。最後,再執行「curl_exec($ch)」以取出結果就可以了。

以抓取yahoo為例,若我們要偽裝成google bot去抓取,那麼我們可以寫成下列的樣子。

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "www.yahoo.com.tw");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

當然,你也可以將選項們設定一個陣列,以增加設定時的閱讀度。這時就得動用「curl_setopt_array()」這個函式了。
Read More

[PHP] 常用有關資料夾的函式 (附抓取整個資料夾檔案的範例)

php內建幾個有關資料夾的函式,非常地實用與方便。而海芋最近寫程式有用到,為了避免忘記,把他寫在下面與大家一起分享。。

1.scandir:掃描資料夾的檔案,並將結果存成array。如資料夾「Test」裡面有「a.txt」和「b.txt」這兩個檔案,那麼結掃描結果會如下:

Array
(
  [0] => .
  [1] => ..
  [2] => a.txt
  [3] => b.txt
)

2.is_dir:判斷是否為資料夾的函式。

3.opendir/closedir:打開與關閉資料夾,傳回一個 resource,可供readdir使用。

4.readdir:讀取資料夾的內容。

5.chdirgetcwd:變化與得到目前指標所指的資料夾。

舉例來說,若要讀取一個資料夾內的全部檔案,並將他列印出來在螢幕上,那麼可以用以下的程式碼:

$dir = "./images";
getDirList($dir);

function getDirList($dir){
   if (is_dir($dir)){
     $dh = opendir($dir);
     chdir ($dir);
     while (($file = readdir($dh)) !== false) {
       if (is_dir($file) && basename($file)!='.' && basename($file)!='..')
         getDirList($file);
       else if(filename($file) != "." && filename($file) != "..")
         echo "current work dir:". getcwd()." ;filename: $file \n";
     }
     chdir("../");
     closedir($dh);
  }
}

function filename($file){
   $path_parts = pathinfo($file);
   return basename($file, $path_parts['extension']);
}

[PHP] 解決網址傳遞中文參數時所發生的亂碼問題

當我們使用IE系列的瀏覽器,在傳送中文參數時,往往會產生亂碼的問題。而身為一個程式設計師,必須要解決此問題,因此若是先將中文參數先給編碼後,再由瀏覽器去解碼,才是一個不錯的解決方案。

假設有一段程式碼如下:







< ?php
echo "school=" . $_GET['school']";
echo "schoolcode=" . $_GET['schoolcode'];
$school = "中和高中";
$URL = "test.php?school=".$school."&schoolcode=123";
?>

>中和高中

那麼,當你用IE看時,很明顯地就知道他是亂碼。這時我們必須要將中文參數的地方先編碼過後再傳。這時,就得動用到「rawurlencode」這個函式了。
Read More

[php] 將Unix Time 轉為易讀的時間格式

在PHP中,我們可以透過幾個簡單的時間函式,來讀取Unix的時間,而Unix的時間是從1970年1月1日開始算起的。而就目前已知著名程式的來說,著名的討論區程式Discuz在文章即是用Unix Time來做文章的記錄。

 

首先,先介紹怎樣讀取Unix Time,只要輸入以下的函式即可。

$time = time();

 

怎樣把Unix Time轉換成我們可讀的呢?這時就只要動用date()這個函式即可。其用法如下:

string date  ( string $format  [, int $timestamp  ] )

 

因此,若我們已有一個Unix的時間字串,要裝該字串轉為易讀的時間格式時,可以使用下列方法:

$time = 1234567890;
   $year = date("Y",$time);
   $month = date("m",$time);
   $day = date("d",$time);
   $hour = date("h",$time);
   $minute = date("i",$time);
   $second = date("s",$time);
   echo
"Unix時間:$time,可轉換成".$year."年".$month. "月" .  $day. "日".  $hour."時". $minute. "分". $second."秒。";

 

這個函式亦有其它參數,可見官方網站的說明。

[PHP] 分割與合併字串的相關函式

PHP中提供許多分割與合併字串的函式,以下就來瀏覽一下吧!
1.explode():此函式可以將字串分割為陣列儲存,類似切token的方式,若以下列程式碼為例:

$student="kevin susan james";
$stuednt_array=explode(" ",$student);
foreach($stuednt_array as $index => $value)
echo "student $index is: $valuen";

則結果為:

student 0 is: kevin
student 1 is: susan
student 2 is: james

2.implode():此函式可以將陣列合併為字串儲存,若以下列程式碼為例:

$stuednt_array = array(kevin, susan, james);
$student = implode(",", $stuednt_array);
echo $student

則結果為:

kevin,susan,james

3.join():此函式和implode()用法相同,不再舉例。

Read More