گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

خواندن فایل‌های پایگاه داده dbf از طریق PHP

نویسنده:
5 می 14

این آموزش را پیرو درخواست یکی از همکاران و نیاز احتمالی دیگران روی وبلاگ میگذارم که نیاز داشت فایل‌های dbf را از طریق php بخونه و جالبه که با وجود بهره‌مندی از Linux VPS و اینکه میتونسته از طریق php-dbase کارش را انجام بده ولی به دو تا مشکل خورده. اول اینکه با سیستم عامل لینوکس آشنایی نداشته و نمیتونسته بسته های مورد نیاز را نصب کنه (از جمله دلایلی که نوشته «چرا یک برنامه نویس وب باید به مهاجرت به لینوکس فکر کنه» را نوشتم) و دوم اینکه مسئول هاست هم به هر دلیلی که داشته از نصب بسته ها با ذکر دلایل امنیتی پوچ ، طفره رفته.

قبل از کدنویسی هم برای دوستانی که آشنایی با dbf ندارند باید بگم که dbf یک نوع پایگاه داده بر پایه فایل هستش (مثل Microsoft Access) که برنامه نویسای FoxPro تحت داس و حالا Visual FoxPro ازش استفاده میکنند. توی ایران هم به خاطر نوشته شدن برنامه‌های شرکت های بیمه و دیگر نهاد‌ها با FoxPro ، خیلی‌ از برنامه نویسان که در حال ارتقاء نر م افزار های قدیمی هستند بهش بر میخورند.

یک نکته دیگه هم اینکه استفاده از php برای خوندن فایل‌های dbf فقط زمانی کاربرد داره که نیاز باشه فایل‌ها به سرور منتقل و سپس عملیاتی مثل پردازش و انتقال به MySQL و یا کلاً نمایش اطلاعاتش مطرح باشه و اگه قصد دارین فقط تبدیل کنین ، کافیه درایور های ODBC که مایکروسافت تولید کرده را نصب کنین و با یک نرم‌افزار که قابلیت Migeration داره و توی وب هم زیاده مثل MySQL Workbench اطلاعات را به جداول MySQL منتقل کنین.

برای خوندن فایل‌های dbf از این کلاس استفاده میکنیم (کلاس را من ننوشتم و اعتبارش برای سازندگان که اسامیشون توی خود فایل هست محفوظه) و با یک کد شبیه به این میتونید کل جدول را نمایش بدید.

require('./dbf_class.php');
    $dbf = new dbf_class('path_to_dbf_file');
    echo('<table border=1 cellspacing=0>');
    echo('<tr>');
    echo('<td>No.&nbsp;</td>');	
    for($j=0; $j<$dbf->dbf_num_field; $j++){
	    echo '<td>'.$dbf->dbf_names[$j]['name'].'</td>';
    }
    echo '</tr>';
    for($i=0; $i<$dbf->dbf_num_rec; $i++){
        if ($row = $dbf->getRow($i)) {
	        echo('<tr>');
        	echo('<td align="right">'.$i.'</td>');
	        for($j=0; $j<$dbf->dbf_num_field; $j++){
				echo '<td>'.htmlentities($row[$j]).'</td>';
    	    }
        	echo '</tr>';
        }
    }
    echo('</table>');

یک نکته که مجال توضیح توی این نوشته نیست و در آینده حتماً در موردش خواهم نوشت اینه که متون فارسی توی این جداول معمولاً یونیکد یا Windows-1256 نیست و از IranSystem استفاده شده. نحوه تبدیل از IranSystem به یونیکد را به زودی توی وبلاگ خواهم گذاشت.

اتصال و استفاده از پایگاه داده MSSQL در PHP

نویسنده:
25 آوریل 14

به نظرم خیلی اشتباهه که وقتی با PHP کار میکنیم کلاً از ویندوز و IIS استفاده کنیم که حالا اصلاً بحث استفاده از MSSQL هم مطرح بشه. ولی نمیشه زیاد گلایه کرد و خیلی‌ها هم هستند که با سرویس دهنده های ویندوزی به خاطر آشنایی بیشتر ، راحت‌تر هستند و ترجیح هم میدهند از MSSQL استفاده کنند. ولی قبل از خوندن این مطلب به شدت توصیه میکنم که تجدید نظر کنند و از MySQL یا Maria DB یا Postgre SQL استفاده کنند.

به طور کلی چندین روش برای اتصال به MSSQL وجود داره که من ۵ روش معمول را میگم و یکی را که توصیه میکنم توضیحات و کدش را میگذارم.

روش اول : تا نسخه ۵٫۳ خود php یک Extension به نام mssql داشت که هنوز مستنداتش هم توی سایت php.net موجوده ولی دیگه پشتیبانی نمیشه ، حالا اگه خیلی علاقه دارین میتونید از نسخه های قدیمی تر php استفاده کنید و از این extension استفاده کنید. البته قرار نیست مثلا همه امکانات SQL 2012 را هم پشتیبانی کنه و ممکنه خیلی bug داشته باشه. مستنداتش هم اینجاست.

روش دوم : مایکروسافت مثل اینکه خودش متوجه شده اگه دست به کار نشه توی php واقعا کسی با مشکلات driver های فعلی سراغ mssql نمیره و خلاصه آستین ها را بالا زدند یا سفارشش را دادند. خودش اومده یک extension برای php درست کرده که به نسخه ۳ هم رسیده و اینطور که پیداست خیلی امکانات خوبی داره و mssql را به خوبی پشتیبانی میکنه. مشکلش اینه که فقط روی windows قابل استفاده هست و برای لینوکس تا زمان نوشتن این مطلب وجود نداره. این سایتش و همه اطلاعات مربوطه برای علاقه مندان.

توجه : سه روش بعدی در مورد PDO هست.

روش سوم : یکی از Driver های PDO اسمش PDO_DBLIB هست که امکان اتصال و استفاده از MSSQL و Sybase را از طریق کتابخونه FreeTDS فراهم میکنه. این Extension از نسخه ۵٫۳ PHP به بعد برای ویندوز پشتیبانی نمیشه (وجود نداره) و فقط روی لینوکس قابل استفاده هستش. نکنه اینکه DB-LIB قدیمیه ، Thread un-safe هست و هزار مشکل دیگه که در زمان کار کردن بهش بر میخورین.

روش چهارم : یکی دیگه از driver های PDO اسمش PDO_SQLSRV هستش که شما باید همون extension که توی روش دوم اشاره کردم را بگیرید و با توجه به non thread safe یا thread safe بودن نسخه php با کپی کردن dll های مربوطه و اعمال تغییرات توی php.ini اون را نصب کنید. نکته اینکه فقط روی ویندوز هم جواب میده. اینجا طریقه نصب را بهتر توضیح داده.

روش پنجم : این روش که هم روی ویندوز و هم روی لینوکس جواب میده (بدیهی هست که باید ODBC روی سیستم عامل نصب باشه به همراه Extension مربوطه) از طریق PDO_ODBC هستش.

بهتره از Driver های جدید مایکروسافت استفاده کنید که خیلی قابلیت داره و برای هر دو سیستم عامل هم طراحی شده. از اینجا نسخه ویندوزی را بگیرین و از اینجا نسخه لینوکسی را.

و اما کد :

try{
  $hostname = "host,port";
  $dbname = "database_name";
  $username = "username";
  $pw = "password";
       
  $pdo = new PDO ("odbc:Driver={SQL Server};Server=$hostname;Database=$dbname; Uid=$username;Pwd=$pw;");
       
} catch (PDOException $e) {
  echo "Failed : " . $e->getMessage() . "\n";
  exit;
}
 
$query = $pdo->prepare("select field_name from table");
$query->execute();
 
for($i=0; $row = $query->fetch(); $i++){
  echo ($i + 1)." - ".$row['field_name']."";
}

نکته مهم : یکی از مشکلات اصلی دوستان درست set نکردن hostname$ هستش. متوجه باشین دادن ip یا ادرس FQDN (مثل mssql.mydomain.com) ممکنه خطای timeout بده. اونجاست که شما باید به دو نکته توجه کنید.پورت پیش فرض ۱۴۴۳ هست اما اگه شما چند تا instance داشته باشین اونوقت پورت ها به صورت رندوم اختصاص داده میشه و باید توی host$ از instance name استفاده کنید یا پورت بدین ، اینطوری :

$hostname = "{IP ADDRESS},6688"; // port version
$hostname = "{IP ADDRESS}\SQLEXPRESS"; // instance version

پس حتما از مسئول هاست بپرسین تنظیماتشون چیه و اگه خودتون نصب میکنید از instance name استفاده کنید. (توی SQL server Configuration Manager هست).