PHP ADOdb چیست؟
· کتابخانه ای برای دسترسی به انواع از پایگاه داده.
· PHP ADOdb با PHP نوشته شده است.
· از سیستم متاتایپ (metatype system) برای یافتن نوع داده(data type) معادل یک فیلد در پایگاه داده استفاده می کند.
· ایده ان از Microsoft ADOdb گرفته شده است.
چرا PHP ADOdb؟
· از انواع پایگاه داده مانند MySQL، Oracle، Microsoft SQL Server، Sybase، Sybase SQL Anywhere، Informix، PostgreSQL، FrontBase، Interbase ، Foxpro، Access، ADO و ODBC پشتیبانی می کند.
· همچنین این کتابخانه نه تنها از دستورات select و Delete که از Insert نیز پشتیبانی می کند.
· PHP ADOdb از نوع Write once run anywhere است. (یکبار بنویسید همه جا استفاده کنید).
· کد sql ان انتقال پذیر(portable) است .
مقدمه ای برای ADOdb
می توانید مشتریتان را با گفتن "مشکلی نیست می توانید از mysql، mssql، oracle و غیره استفاده کنید"، شگفت زده کنید. برنامه ما بدون نیاز به تغییر کد، تمام پایگاه های داده اصلی را پشتیبانی می کند. حتما ارتقاء می گیرید. ابزار جادویی ما php ADOdb است. توابع PHP برای دسترسی به پایگاه داده استاندارد نشده است. این نیاز به یک Class Library پایگاه داده را برای پنهان کردن اختلافات بین API پایگاه داده، بیشتر می کند، با این Class Library می توانیم به راحتی پایگاه داده را تعویض کنیم. در حال حاضر ADOdb از MySQL، Oracle، Microsoft SQL Server، Sybase، Sybase SQL Anywhere، Informix، PostgreSQL، FrontBase، Interbase، Foxpro، Access، ADO and ODBC پشتیبانی می کند. گزارش هایی مبنی بر اتصال موفق به Progress و DB2 هم از طریق ODBC داشته ایم. ویژگی های یکتای ADOdb عبارتند از:
· برای کاربران ویندوز کار با ان راحت است. چون بسیاری از قرارداد ها شبیه Microsoft ADO است. بر خلاف دیگر کلاس های پایگاه داده PHP که بر دستور Select تمرکز دارند، ما کدی را ارائه می کنیم که insert و delete را هم انجام داده و قابل انتقال به دیگر پایگاه های داده باشد. برای هر پایگاه داده، متدهایی برای پردازش تاریخ (date)، الحاق رشته ها ارائه شده است.
· یک سیستم متاتایپ به طور توکار نوشته شده که می توانیم معادل های نوع داده هایی مانند CHAR، STRING و TEXT را برای انواع پایگاه داده ها بیابیم.
· انتقال ان راحت است، چون تمام کد وابسته به پایگاه داده در توابع stub نگهداری می شود. لازم نیست منطق هسته ی(Core logic) کلاس ها را منتقل کنید.
· پشتیبانی از PHP Session.
حالا این کتابخانه را تست می کنیم.
1. از sourceforge انرا دانلود کنید.
2. فایل فشرده شده را در یک دایرکتوری وب استخراج کنید.
3. مدیر پایگاه داده را باز کنید (مثلا phpmyadmin).
4. یک پایگاه داده بسازید (مثلا inventory)
5. یک جدول ساده بسازید (مثلا products)
6. حالا یک تست ساده. کد زیر رابنویسید. انرا درون دایرکتوری با پوشه adodb بگذارید نام انرا adodbtest.php بگذارید:
| 01 | <?php |
| 02 | include('adodb/adodb.inc.php'); |
1.
| 03 | |
| 04 | $databasetype = 'mysql'; |
2.
| 05 | $server = 'localhost'; |
| 06 | $user = 'root'; |
3.
| 07 | $password = 'r0ot'; |
| 08 | $database = 'inventory'; |
4.
| 09 | |
| 10 | $db = ADONewConnection($databasetype); |
5.
| 11 | $db->debug = true; |
| 12 | $db->Connect($server، $user، $password، $database); |
6.
| 13 | $rs = $db->Execute('select * from products'); |
| 14 | print "<pre>"; |
7.
| 15 | print_r($rs->GetRows()); |
| 16 | print "</pre>"; |
8.
7. فایل را اجرا کنید
دستور Connection
در این بخش، درباره اتصال ها (connection) در php ADOdb صحبت خواهیم کرد. دو اتصال در ADOdb وجود دارد:Connect() و Pconnect().
Connect($host,[$user],[$password],[$database]) - از این در مثال اولمان استفاده کردیم. اتصال ناماندگار (non-persistent) به پایگاه داده یا سرور به نام $host، با استفاده از نام کاربری $user و پسورد $password. اگر سرور از چند پایگاه داده پشتیبانی کند، به $database متصل می شویم.
کد مانند این است:
| 1 | $db = ADONewConnection($databasetype); |
| 2 | $db->debug = true; |
| 3 | $db->Connect($server, $user, $password, $database); |
اگر به جای OLEDB از Microsoft ADO استفاده می کنید می توانید، پارامتر $database را برابر ارائه دهنده داده OLEDB (OLEDB data provider) که استفاده می کنید قرار دهید.
PConnect($host,[$user],[$password],[$database]) - اتصال ماندگار (persistent) به پایگاه داده با استفاده از نام کاربری $user و پسورد $password. . اگر سرور از چند پایگاه داده پشتیبانی کند، به $database متصل می شویم.
| 1 | include('adodb.inc.php'); # load code common to ADOdb |
| 2 | $conn = &ADONewConnection('access'); # create a connection |
| 3 | $conn->PConnect('northwind'); # connect to MS-Access, northwind DSN |
اگر connect و pconnect را با هم اشتباه می کنید، نکات زیر ممکن است مفید باشد:
اول، هنگام اتصال، تابع سعی می کند، لینکی ماندگار و باز به همان هاست، نام کاربری و پسورد بیابد. اگر یافت شود، در عوض ساخت اتصال جدید، شناسه(id) ان اتصال باز برگردانده می شود.
دوم، بعد از اتمام اسکریپت، اتصال به سرور SQL بسته نمی شود. در عوض، لینک برای استفاده اینده باز گذاشته می شود (مثلا mysql_close() لینکهایی که با pconnect() باز شده را نمی بندد.)
دستور Select پیشرفته
ADOdb ویژگی هایی دارد که سرعت شما را افزایش می دهد. یکی از این ویژگی ها دستور پیشرفته select است. با استفاده از این می توانید کد های خود را بهبود دهید.
select ساده
مثال select ساده:
| 01 | include('adodb.inc.php'); # load code common to ADOdb |
| 02 | $conn = &ADONewConnection('access'); # create a connection |
| 03 | $conn->PConnect('northwind'); # connect to MS-Access, northwind DSN |
| 04 | |
| 05 | $recordSet = &$conn->Execute('select * from products'); |
| 06 | |
| 07 | if (!$recordSet) |
| 08 | print $conn->ErrorMsg(); |
| 09 | else |
| 10 | while (!$recordSet->EOF) { |
| 11 | print $recordSet->fields[0].' '.$recordSet->fields[1].'<br>'; |
| 12 | $recordSet->MoveNext(); |
| 13 | } $recordSet->Close(); # optional |
| 14 | $conn->Close(); # optional |
selectlimit
فرمول ان اینگونه است:
| SelectLimit($sql,$numrows=-1,$offset=-1,$inputarr=false) |
اگر موفق باشد یک Recordset را برمی گرداند.یک select ساده را اجرا می کند، با شبیه سازی دستور Select در PostgreSQL ، تعداد را به $numrows با شروع از $offset محدود می کند.
مثال:
| 01 | $connection->SelectLimit('SELECT * FROM TABLE',-1,10) |
نحوه نمایش جدول
نمایش تمام جدول ها با استفاده از ADOdb ساده است. فقط به MetaTables() نیاز دارید. مثال را ببینید:
| 1 | <?php |
| 2 | include('adodb/adodb.inc.php'); |
| 3 | $db = ADONewConnection('mysql'); |
| 4 | $db->debug = true; |
| 5 | $db->Connect('localhost', 'root', 'admin', 'scanner'); |
| 6 | print_r($db->MetaTables()); |
می توانید مقدار $db->MetaTables() را به یک آرایه تخصیص و با ان کار کنید.
نمایش فیلدها
حالا، کدی می نویسیم که تمام فیلدهای جدول و متا داده ان را نمایش می دهد. از MetaColumns() استفاده می کنیم:
| 01 | <?php |
| 02 | include('adodb/adodb.inc.php'); |
| 03 | $db = ADONewConnection('mysql'); |
| 04 | $db->debug = true; |
| 05 | $db->Connect('localhost', 'root', 'admin', 'scanner'); |
| 06 | $arr = $db->MetaColumns('name_table'); |
| 07 | echo "<pre>"; |
| 08 | print_r($arr); |
نحوه نمایش پایگاه های داده
تمام پایگاه های داده اولین اتصال با استفاده از ADOdb را نمایش می دهیم:
| 01 | <?php |
| 02 | include('adodb/adodb.inc.php'); |
| 03 | $db = ADONewConnection('mysql'); |
| 04 | $db->debug = true; |
| 05 | $db->Connect('localhost', 'root', 'admin', 'scanner'); |
| 06 | $arr = $db->MetaDatabases(); |
| 07 | echo "<pre>"; |
| 08 | print_r($arr); |
Cache کردن Recordset
یک ویژگی ظریف در ADOdb ، Cache کردن Recordset است. این کار باعث سریع شدن نتایج پرس و جو می شود.
از چندین متد می توان برای Cache کردن Recordset استفاده کرد:
CacheExecute()
CachePageExecute()
CacheSelectLimit()
CacheExecute()
مانند Execute است، فقط recordset برای $secs2cache ثانیه، در دایرکتوری $ADODB_CACHE_DIR، cache می شود. اگر CacheExecute() دوباره با همان پارامترها، همان پایگاه داده، همان نام کاربری و همان پسورد، فراخوانی شود و Recordset ، کش (cache) شده منقضی نشده باشد، همان recordset کش شده برگردانده می شود.
| 1 | include('adodb.inc.php'); |
| 2 | include('tohtml.inc.php'); |
| 3 | $ADODB_CACHE_DIR = '/usr/local/ADOdbcache'; |
| 4 | $conn = &ADONewConnection('mysql'); |
| 5 | $conn->PConnect('localhost','userid','password','database'); |
| 6 | $rs = $conn->CacheExecute(15, 'select * from table'); |
CachePageExecute()
فرمول:
| CachePageExecute($secs2cache, $sql, $nrows, $page, $inputarr=false) |
برای صفحه بندی (pagination یا صفحه صفحه کردن) recordset استفاده می شود، صفحه ها از 1 شروع می شود نه صفر.
| 01 | include_once('adodb.inc.php'); |
| 02 | include_once('adodb-pager.inc.php'); |
| 05 | $db = NewADOConnection('mysql'); |
| 06 | $db->Connect('localhost','root','','xphplens'); |
| 07 | $sql = "select * from adoxyz "; |
| 08 | |
| 09 | $pager = new ADODB_Pager($db,$sql); |
| 10 | $pager->Render($rows_per_page=5); |
CacheSelectLimit()
فرمول:
| CacheSelectLimit([$secs2cache,] $sql, $numrows=-1,$offset=-1,$inputarr=false) |
مانند SelectLimit است، فقط recordset بازگشتی برای $secs2cache ثانیه، در دایرکتوری $ADODB_CACHE_DIR، cache می شود.
| 1 | $conn->Connect(...); |
| 2 | $conn->cacheSecs = 3600*24; // cache 24 hours |
| 3 | $rs = $conn->CacheSelectLimit('select * from table',10); |
بازدهی این 3 متد انقدر متفاوت است که باید درباره زمان مناسب برای کش کردن صحبت کنیم. هنگامی که سرور پایگاه داده شما خیلی از وب سرور شما کند تر است، و یا پایگاه داده ترافیک شدید دارد، کش کردن مناسب است چون بار روی پایگاه داده را کم می کند. اگر پایگاه داده شما بار چندانی ندارد و خیلی از وب سرورتان سریع تر است، کش کردن کارایی و بازدهی را کاهش می دهد.