วันพฤหัสบดีที่ 10 มีนาคม พ.ศ. 2554

adodb class tutorial

adodb class เป็นคลาสที่ช่วยให้เขียนโปรแกรมติดต่อ database ง่ายขึ้นครับ
นอกจากนี้แล้วยังช่วย escape input เพื่อป้องกัน sql injection
และเป็น database layer ถ้าเขียนติดต่อ database ใน adodb ก็จะช่วยให้ย้ายไป database อื่นได้ง่ายขึ้นแก้ไขน้อยกว่าครับ

เริ่มต้นให้ download adodb มีหลายเวอร์ชั่นครับเลือกเอาเวอร์ชั่นที่ต้องการมาไฟล์ไฟล์เดียวครับ
http://sourceforge.net/projects/adodb/files/

<?php

//config
$conf = array();
$conf['username'] = 'root';
$conf['password'] = '12345';
$conf['host'] = 'localhost';
$conf['db'] = 'test';
$conf['driver'] = 'mysqli'; //เลือกเป็น mysqli เพื่อจะได้ใช้งาน transaction ใน adodb class ได้

//setup and connect to db
require 'adodb/adodb.inc.php'; //เปลี่ยน path ไปยังไฟล์ adodb.inc.php ให้ถูกต้อง
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$db = ADONewConnection($conf['driver']);
$db->Connect($conf['host'], $conf['username'], $conf['password'], $conf['db']);
$rs = $db->Execute('SET NAMES UTF8');

//create test data
$row = $db->GetRow("SHOW TABLES LIKE 'guestbook_test2'");
if (empty($row)){
$db->Execute(
'CREATE TABLE guestbook_test2 ('.
'id int(10) unsigned NOT NULL AUTO_INCREMENT,'.
'name varchar(20) NOT NULL,'.
'detail text NOT NULL,'.
'PRIMARY KEY (id)'.
')'
);
if ($db->ErrorNo()){
die($db->ErrorMsg());
}
echo 'create table successfully.<br>';
srand();
foreach(range(1,100) as $a){
$id = null; //insert id=null, update $id = id value
$name = md5(rand(1,10000));
$detail = sha1(rand(1,10000));
$db->Replace('guestbook_test2',compact('name','detail','id'),'id',true);
}
echo 'insert data successfully.<br>';
}

//pagination
$limit = 10;
$page = empty($_GET['page']) ? 1 : (int)$_GET['page'];

$rs = $db->PageExecute("SELECT * FROM guestbook_test2", $limit, $page);
$page_row_count = $rs->RowCount();
$row_count = $rs->MaxRecordCount();
$page_count = $rs->LastPageNo();
$rows = $rs->GetRows();
$rs->Close();

//test Execute and FetchRow
$select_id = 11;
$select_id2 = 15;
$rs = $db->Execute("SELECT * FROM guestbook_test2 WHERE id=? OR id=?", array($select_id,$select_id2));
$data = array();
while($row = $rs->FetchRow()){
$data[] = $row;
}

//test GetAssoc
$data2 = $db->GetAssoc("SELECT id,name FROM guestbook_test2 WHERE id BETWEEN ? AND ?",array(51,52));

//close connection
$db->Close();

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=tis-620" />
<title>adodb tutorial</title>
</head>
<body>

<!-- records of this page -->
<?php foreach($rows as $row):?>
<?php echo $row['id'],': ',$row['detail'],' ...... by <b>',$row['name'],'</b>';?>
<hr />
<?php endforeach;?>

<!-- page links -->
<?php for($i=1; $i<=$page_count; $i++):?>
<a href="?page=<?php echo $i;?>"><?php echo $i;?></a>
<?php endfor;?>

<hr />
<!-- records of select_id1, select_id2 -->
<?php foreach($data as $row):?>
<?php echo $row['id'],': ',$row['detail'],' ...... by <b>',$row['name'],'</b>';?>
<hr />
<?php endforeach;?>

<!-- records of 51 to 52 -->
<?php foreach($data2 as $id=>$value):?>
<?php echo $id,': ',$value,'</b>';?>
<hr />
<?php endforeach;?>

</body>
</html>

วันพฤหัสบดีที่ 3 มีนาคม พ.ศ. 2554

mod_rewrite

แทรก directive ลงใน httpd.conf เพื่อเก็บ log เวลา mod_rewrite ทำงาน
(เพื่อตรวจสอบการเขียน mod_rewrite ให้ถูกต้อง)
แล้ว restart apache ถ้าไม่ขึ้นอาจเกิดจากยังไม่ได้ติดตั้ง mod_rewrite หรือ path ชี้ไปยังไฟล์ที่จะให้เขียน log
RewriteLog "C:/xampp/htdocs/sp/rewritelog.txt"
RewriteLogLevel 9

ตัวอย่างการเขียน
1) ไฟล์ที่ชื่อ t.php ไ่ม่ว่าอยู่ระดับหรือโฟลเดอร์ไหนก็ตาม
ให้เปลี่ยนเป็นการ reqeust ไฟล์ /sp/test/s.php
เช่น
RewriteRule t.php /sp/test/s.php
เมื่อเขียนคำสั่งตามนี้แล้วในไฟล์ .htaccess จะทำให้เมื่อ request url
http://localhost/t.php
http://localhost/test/t.php
จะเป็นการ request url
http://localhost/sp/test/s.php
โดยจะเป็นการ request แบบซ่อน path ที่แท้จริง
คือแสดงข้อมูลของ s.php ส่วน url ยังคงเป็น ของ t.php เช่นเดิม
ต่างจากการ redirect ซึ่งจะแสดง url ที่แท้จริงนั่นก็คือ s.php

2) ไฟล์และรูปแบบ request ใดๆ ยกเว้นไฟล์ที่ชื่อ s.php จะถูกแปลงเป็นการเรียก request /sp/test/s.php?page=ไฟล์และรูปแบบการ request ในครั้งแรก
เช่น
RewriteRule s.php$ - [L]
RewriteRule (.*) /sp/test/s.php?page=$1
เมื่อเขียนคำสั่งตามนี้แล้วในไฟล์ .htaccess จะทำให้เมื่อ request url
http://localhost/t.php
http://localhost/test/t.php

เราสามารถใช้ RewriteCond ช่วยให้ได้ผลเหมือนข้างบนได้
RewriteCond %{REQUEST_URI} !(s.php)
RewriteRule (.*) /sp/test/s.php?page=$1

seo-url-mod-rewrite-htaccess/